lkml.org 
[lkml]   [2007]   [Jun]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    From
    SubjectRe: [PATCH -mm] PM: Prevent frozen user mode helpers from failing the freezing of tasks
    Date
    On Monday, 25 June 2007 12:43, Oleg Nesterov wrote:
    > Rafael J. Wysocki wrote:
    > >
    > > static int usermodehelper_pm_callback(struct notifier_block *nfb,
    > > unsigned long action,
    > > void *ignored)
    > > {
    > > + long retval;
    > > +
    > > switch (action) {
    > > case PM_HIBERNATION_PREPARE:
    > > case PM_SUSPEND_PREPARE:
    > > usermodehelper_disabled = 1;
    > > - return NOTIFY_OK;
    > > + /*
    > > + * From now on call_usermodehelper_exec() won't start any new
    > > + * helpers, so it is sufficient if running_helpers turns out to
    > > + * be zero at one point (it may be increased later, but that
    > > + * doesn't matter).
    > > + */
    > > + retval = wait_event_timeout(running_helpers_waitq,
    > > + atomic_read(&running_helpers) == 0,
    > > + RUNNING_HELPERS_TIMEOUT);
    > > + if (retval) {
    > > + return NOTIFY_OK;
    > > + } else {
    > > + usermodehelper_disabled = 0;
    > > + return NOTIFY_BAD;
    >
    > I think this is racy. First, this needs smp_mb() between "usermodehelper_disabled = 1"
    > and wait_event_timeout().

    Yes ...

    > Second, call_usermodehelper's path should first increment the counter, and only
    > then check usermodehelper_disabled,

    It does this already.

    > and it needs an mb() in between too. Otherwise, the helper can see
    > usermodehelper_disabled == 0, then PM_SUSPEND_PREPARE comes and
    > returns NOTIFY_OK, then the helper increments the counter and starts application.
    >
    > Sadly, you can't use srcu/qrcu because it doesn't handle timeouts.

    OK

    If I understand that correctly, it should suffice to place smp_mb() after
    usermodehelper_disabled = 1; in usermodehelper_pm_callback() and another
    smp_mb() after atomic_inc(&running_helpers); in new_helper().

    Is that correct?

    Greetings,
    Rafael


    --
    "Premature optimization is the root of all evil." - Donald Knuth
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2007-06-25 16:59    [W:0.027 / U:0.512 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site