lkml.org 
[lkml]   [2005]   [Jan]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Subject[PATCH] introduce idle_task_exit
    From
    Date
    On Fri, 2005-01-07 at 05:43, Ingo Molnar wrote:
    > * Nathan Lynch <nathanl@austin.ibm.com> wrote:
    >
    > > OK, how's this? I'll submit the sched and ppc64 bits separately if
    > > there are no objections. I assume Heiko can take care of s390.
    > >
    > > Note that in the ppc64 cpu_die function we must call idle_task_exit
    > > before calling ppc_md.cpu_die, because the latter does not return.
    >
    > Signed-off-by: Ingo Molnar <mingo@elte.hu>


    Heiko Carstens figured out that offlining a cpu can leak mm_structs
    because the dying cpu's idle task fails to switch to init_mm and
    mmdrop its active_mm before the cpu is down. This patch introduces
    idle_task_exit, which allows the idle task to do this as Ingo
    suggested.

    I will follow this up with a patch for ppc64 which calls
    idle_task_exit from cpu_die.

    Signed-off-by: Nathan Lynch <nathanl@austin.ibm.com>


    ---


    diff -puN kernel/sched.c~sched-idle_task_exit kernel/sched.c
    --- linux-2.6.10-bk10/kernel/sched.c~sched-idle_task_exit 2005-01-07 15:23:35.000000000 -0600
    +++ linux-2.6.10-bk10-nathanl/kernel/sched.c 2005-01-07 15:23:35.000000000 -0600
    @@ -3996,6 +3996,20 @@ void sched_idle_next(void)
    spin_unlock_irqrestore(&rq->lock, flags);
    }

    +/* Ensures that the idle task is using init_mm right before its cpu goes
    + * offline.
    + */
    +void idle_task_exit(void)
    +{
    + struct mm_struct *mm = current->active_mm;
    +
    + BUG_ON(cpu_online(smp_processor_id()));
    +
    + if (mm != &init_mm)
    + switch_mm(mm, &init_mm, current);
    + mmdrop(mm);
    +}
    +
    static void migrate_dead(unsigned int dead_cpu, task_t *tsk)
    {
    struct runqueue *rq = cpu_rq(dead_cpu);
    diff -puN include/linux/sched.h~sched-idle_task_exit include/linux/sched.h
    --- linux-2.6.10-bk10/include/linux/sched.h~sched-idle_task_exit 2005-01-07 15:23:35.000000000 -0600
    +++ linux-2.6.10-bk10-nathanl/include/linux/sched.h 2005-01-07 15:23:35.000000000 -0600
    @@ -757,6 +757,7 @@ extern void sched_exec(void);
    #endif

    extern void sched_idle_next(void);
    +extern void idle_task_exit(void);
    extern void set_user_nice(task_t *p, long nice);
    extern int task_prio(const task_t *p);
    extern int task_nice(const task_t *p);
    _


    -
    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: 2005-03-22 14:09    [W:0.025 / U:32.180 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site