lkml.org 
[lkml]   [2007]   [Apr]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [RFC PATCH(experimental) 2/2] Fix freezer-kthread_stop race
    On Fri, Apr 20, 2007 at 10:54:36AM +0200, Rafael J. Wysocki wrote:
    >
    > Hmm, can't we do something like this instead:
    >
    > ---
    > kernel/kthread.c | 10 ++++++++++
    > 1 file changed, 10 insertions(+)
    >
    > Index: linux-2.6.21-rc7/kernel/kthread.c
    > ===================================================================
    > --- linux-2.6.21-rc7.orig/kernel/kthread.c
    > +++ linux-2.6.21-rc7/kernel/kthread.c
    > @@ -13,6 +13,7 @@
    > #include <linux/file.h>
    > #include <linux/module.h>
    > #include <linux/mutex.h>
    > +#include <linux/freezer.h>
    > #include <asm/semaphore.h>
    >
    > /*
    > @@ -232,6 +233,15 @@ int kthread_stop(struct task_struct *k)
    >
    > /* Now set kthread_should_stop() to true, and wake it up. */
    > kthread_stop_info.k = k;
    > + if (!(current->flags & PF_NOFREEZE)) {
    > + /* If we are freezable, the freezer will wait for us */
    > + task_lock(k);
    > + k->flags |= PF_NOFREEZE;
    > + if (frozen(k))
    > + k->flags &= ~PF_FROZEN;
    > +
    > + task_unlock(k);
    > + }

    Yes, we can do this for now since the tasks have only two freeze states,
    namely Freezeable and Non Freezeable.
    But with more events like cpu-hotplug and kprobes using the process
    freezer, the simple check

    if(!(current->flags & PF_NOFREEZE))

    may not suffice and something like
    if(!(current->flags & PFE_ALL & global_freeze_mask))
    /* global_freeze_mask is the mask of the events for which the system
    is freezing. */

    appears to be racy. Not that we cannot work it out ;-)

    However, I was attempting to solve the generic problem where
    A waits on B and B is frozen. If A is freezeable (under one of the
    events) then the freezer will fail. So a solution would be for A to
    somehow inform B of the dependency and postpone it's freezing.

    Since akpm mentioned that flush_workqueue() needs to go, I guess, I am
    ok with fixing only kthread_stop/kthread_should_stop for the moment.
    Unless I can spot any other valid case :)


    > wake_up_process(k);
    > put_task_struct(k);
    >

    Thanks and Regards
    gautham.
    --
    Gautham R Shenoy
    Linux Technology Center
    IBM India.
    "Freedom comes with a price tag of responsibility, which is still a bargain,
    because Freedom is priceless!"
    -
    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-04-20 13:07    [W:0.026 / U:0.244 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site