lkml.org 
[lkml]   [2006]   [Oct]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Subject[PATCH] Thaw userspace and kernel space separately.
    From
    Date
    Modify process thawing so that we can thaw kernel space without thawing
    userspace, and thaw kernelspace first. This will be useful in later
    patches, where I intend to get swsusp thawing kernel threads only before
    seeking to free memory.

    Signed-off-by: Nigel Cunningham <nigel@suspend2.net>

    diff --git a/include/linux/freezer.h b/include/linux/freezer.h
    index 266373f..294ebea 100644
    --- a/include/linux/freezer.h
    +++ b/include/linux/freezer.h
    @@ -1,5 +1,8 @@
    /* Freezer declarations */

    +#define FREEZER_KERNEL_THREADS 0
    +#define FREEZER_ALL_THREADS 1
    +
    #ifdef CONFIG_PM
    /*
    * Check if a process has been frozen
    @@ -57,7 +60,8 @@ static inline void frozen_process(struct

    extern void refrigerator(void);
    extern int freeze_processes(void);
    -extern void thaw_processes(void);
    +#define thaw_processes() do { thaw_some_processes(FREEZER_ALL_THREADS); } while(0)
    +#define thaw_kernel_threads() do { thaw_some_processes(FREEZER_KERNEL_THREADS); } while(0)

    static inline int try_to_freeze(void)
    {
    @@ -67,6 +71,9 @@ static inline int try_to_freeze(void)
    } else
    return 0;
    }
    +
    +extern void thaw_some_processes(int all);
    +
    #else
    static inline int frozen(struct task_struct *p) { return 0; }
    static inline int freezing(struct task_struct *p) { return 0; }
    diff --git a/kernel/power/process.c b/kernel/power/process.c
    index fedabad..4a001fe 100644
    --- a/kernel/power/process.c
    +++ b/kernel/power/process.c
    @@ -153,18 +153,29 @@ int freeze_processes(void)
    return 0;
    }

    -void thaw_processes(void)
    +void thaw_some_processes(int all)
    {
    struct task_struct *g, *p;
    + int pass = 0; /* Pass 0 = Kernel space, 1 = Userspace */

    printk("Restarting tasks... ");
    read_lock(&tasklist_lock);
    - do_each_thread(g, p) {
    - if (!freezeable(p))
    - continue;
    - if (!thaw_process(p))
    - printk(KERN_INFO "Strange, %s not stopped\n", p->comm);
    - } while_each_thread(g, p);
    + do {
    + do_each_thread(g, p) {
    + /*
    + * is_user = 0 if kernel thread or borrowed mm,
    + * 1 otherwise.
    + */
    + int is_user = !!(p->mm && !(p->flags & PF_BORROWED_MM));
    + if (!freezeable(p) || (is_user != pass))
    + continue;
    + if (!thaw_process(p))
    + printk(KERN_INFO
    + "Strange, %s not stopped\n", p->comm );
    + } while_each_thread(g, p);
    +
    + pass++;
    + } while (pass < 2 && all);

    read_unlock(&tasklist_lock);
    schedule();

    -
    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: 2006-10-23 01:51    [W:0.025 / U:0.020 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site