[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v4 08/25] kernel: Add combined power-off+restart handler call chain API



On Mon, Nov 29, 2021 at 12:53:51AM +0300, Dmitry Osipenko wrote:
> 29.11.2021 00:17, Michał Mirosław пишет:
> >> I'm having trouble with parsing this comment. Could you please try to
> >> rephrase it? I don't see how you could check whether power-off handler
> >> is available if you'll mix all handlers together.
> > If notify_call_chain() would be fixed to return NOTIFY_OK if any call
> > returned NOTIFY_OK, then this would be a clear way to gather the
> > answer if any of the handlers will attempt the final action (reboot or
> > power off).
> Could you please show a code snippet that implements your suggestion?

A rough idea is this:

 static int notifier_call_chain(struct notifier_block **nl,
                               unsigned long val, void *v,
                               int nr_to_call, int *nr_calls)
 {
-       int ret = NOTIFY_DONE;
+       int ret, result = NOTIFY_DONE;
        struct notifier_block *nb, *next_nb;
 
        nb = rcu_dereference_raw(*nl);
 
        while (nb && nr_to_call) {
...
                ret = nb->notifier_call(nb, val, v);
+
+               /* Assuming NOTIFY_STOP-carrying return is always greater than 
non-stopping one. */
+               if (result < ret)
+                       result = ret;
... 
        }
-       return ret;
+       return result;
 }

Then:

bool prepare_reboot()
{
        int ret = xx_notifier_call_chain(&shutdown_notifier, PREPARE_REBOOT, 
...);
        return ret == NOTIFY_OK;
}

And the return value would signify whether the reboot will be attempted
when calling the chain for the REBOOT action. (Analogously for powering off.)

Best Regards
Michał Mirosław



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.