• Peter Zijlstra's avatar
    sched: Prepare for per-cpu preempt_count · a233f112
    Peter Zijlstra authored
    When using per-cpu preempt_count variables we need to save/restore the
    preempt_count on context switch (into per task storage; for instance
    the old thread_info::preempt_count variable) because of
    PREEMPT_ACTIVE.
    
    However, this means that on fork() the preempt_count value of the last
    context switch gets copied and if we had a PREEMPT_ACTIVE switch right
    before cloning a child task the child task will now too have
    PREEMPT_ACTIVE set and start its life with an extra PREEMPT_ACTIVE
    count.
    
    Therefore we need to make init_task_preempt_count() unconditional;
    this resets whatever preempt_count we inherited from our parent
    process.
    
    Doing so for !per-cpu implementations is harmless.
    
    For !PREEMPT_COUNT kernels we need to be careful not to start life
    with an increased preempt_count.
    Signed-off-by: default avatarPeter Zijlstra <peterz@infradead.org>
    Link: http://lkml.kernel.org/n/tip-4k0b7oy1rcdyzochwiixuwi9@git.kernel.orgSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
    a233f112
core.c 180 KB