lkml.org 
[lkml]   [2014]   [Oct]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: [PATCH v2 01/47] kernel: Add support for poweroff handler call chain
Hello

[...]
> - Use raw notifiers protected by spinlocks instead of atomic notifiers
[...]

> +/**
> + * do_kernel_power_off - Execute kernel poweroff handler call chain
> + *
> + * Calls functions registered with register_power_off_handler.
> + *
> + * Expected to be called from machine_power_off as last step of
> + * the poweroff sequence.
> + *
> + * Powers off the system immediately if a poweroff handler function
> + * has been registered. Otherwise does nothing.
> + */
> +void do_kernel_power_off(void)
> +{
> + spin_lock(&power_off_handler_lock);
> + raw_notifier_call_chain(&power_off_handler_list, 0, NULL);
> + spin_unlock(&power_off_handler_lock);
> +}

I don't get it. You are still in atomic context inside the poweroff callback
since you lock it with a spinlock.

It does not change much from the atomic notifier which was doing exactly the
same thing but with RCU:

rcu_read_lock();
ret = notifier_call_chain(&nh->head, val, v, nr_to_call, nr_calls);
rcu_read_unlock();

Why not using the blocking_notifier_* family ?
It will lock with a read-write semaphore under which you can sleep.

For instance, twl4030_power_off will sleep, since it is doing I2C access.
So you cannot call it in atomic context.

Thanks,

Philippe



\
 
 \ /
  Last update: 2014-10-21 09:01    [W:0.366 / U:2.212 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site