notifier: Fix broken error handling pattern
The current notifiers have the following error handling pattern all over the place: int err, nr; err = __foo_notifier_call_chain(&chain, val_up, v, -1, &nr); if (err & NOTIFIER_STOP_MASK) __foo_notifier_call_chain(&chain, val_down, v, nr-1, NULL) And aside from the endless repetition thereof, it is broken. Consider blocking notifiers; both calls take and drop the rwsem, this means that the notifier list can change in between the two calls, making @nr meaningless. Fix this by replacing all the __foo_notifier_call_chain() functions with foo_notifier_call_chain_robust() that embeds the above pattern, but ensures it is inside a single lock region. Note: I switched atomic_notifier_call_chain_robust() to use the spinlock, since RCU cannot provide the guarantee required for the recovery. Note: software_resume() error handling was broken afaict. Signed-off-by:Peter Zijlstra (Intel) <peterz@infradead.org> Signed-off-by:
Ingo Molnar <mingo@kernel.org> Acked-by:
Rafael J. Wysocki <rafael.j.wysocki@intel.com> Link: https://lore.kernel.org/r/20200818135804.325626653@infradead.org
Showing
- include/linux/notifier.h 7 additions, 8 deletionsinclude/linux/notifier.h
- kernel/cpu_pm.c 18 additions, 30 deletionskernel/cpu_pm.c
- kernel/notifier.c 88 additions, 56 deletionskernel/notifier.c
- kernel/power/hibernate.c 18 additions, 21 deletionskernel/power/hibernate.c
- kernel/power/main.c 4 additions, 4 deletionskernel/power/main.c
- kernel/power/power.h 1 addition, 2 deletionskernel/power/power.h
- kernel/power/suspend.c 6 additions, 8 deletionskernel/power/suspend.c
- kernel/power/user.c 4 additions, 10 deletionskernel/power/user.c
- tools/power/pm-graph/sleepgraph.py 1 addition, 1 deletiontools/power/pm-graph/sleepgraph.py
Loading
Please register or sign in to comment