• Steven Rostedt's avatar
    tracing/wakeup: move access to wakeup_cpu into spinlock · 9be24414
    Steven Rostedt authored
    The code had the following outside the lock:
    
            if (next != wakeup_task)
                    return;
    
            pc = preempt_count();
    
            /* The task we are waiting for is waking up */
            data = wakeup_trace->data[wakeup_cpu];
    
    On initialization, wakeup_task is NULL and wakeup_cpu -1. This code
    is not under a lock. If wakeup_task is set on another CPU as that
    task is waking up, we can see the wakeup_task before wakeup_cpu is
    set. If we read wakeup_cpu while it is still -1 then we will have
    a bad data pointer.
    
    This patch moves the reading of wakeup_cpu within the protection of
    the spinlock used to protect the writing of wakeup_cpu and wakeup_task.
    
    [ Impact: remove possible race causing invalid pointer dereference ]
    Reported-by: default avatarManeesh Soni <maneesh@in.ibm.com>
    Signed-off-by: default avatarSteven Rostedt <srostedt@redhat.com>
    9be24414
trace_sched_wakeup.c 8.92 KB