lkml.org 
[lkml]   [2017]   [May]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip:smp/hotplug] perf: Reorder cpu hotplug rwsem against cred_guard_mutex
    Commit-ID:  1526eee294dd52b70804aa377579682cc4dcd9ad
    Gitweb: http://git.kernel.org/tip/1526eee294dd52b70804aa377579682cc4dcd9ad
    Author: Thomas Gleixner <tglx@linutronix.de>
    AuthorDate: Mon, 1 May 2017 14:35:45 +0200
    Committer: Thomas Gleixner <tglx@linutronix.de>
    CommitDate: Mon, 1 May 2017 14:54:40 +0200

    perf: Reorder cpu hotplug rwsem against cred_guard_mutex

    sys_perf_event_open() takes the hotplug rwsem before the
    cred_guard_mutex. The exit() path has the reverse lock order.

    The hotplug protection in sys_perf_event_open() is not required before
    taking the cred_guard_mutex, so it can be reordered there.

    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Sebastian Siewior <bigeasy@linutronix.de>
    Link: http://lkml.kernel.org/r/20170428142456.5xh44ef3fv7w2kkh@linutronix.de
    ---
    kernel/events/core.c | 16 ++++++++--------
    1 file changed, 8 insertions(+), 8 deletions(-)

    diff --git a/kernel/events/core.c b/kernel/events/core.c
    index 997123c..71d8c74 100644
    --- a/kernel/events/core.c
    +++ b/kernel/events/core.c
    @@ -9742,12 +9742,10 @@ SYSCALL_DEFINE5(perf_event_open,
    goto err_task;
    }

    - get_online_cpus();
    -
    if (task) {
    err = mutex_lock_interruptible(&task->signal->cred_guard_mutex);
    if (err)
    - goto err_cpus;
    + goto err_task;

    /*
    * Reuse ptrace permission checks for now.
    @@ -9765,11 +9763,13 @@ SYSCALL_DEFINE5(perf_event_open,
    if (flags & PERF_FLAG_PID_CGROUP)
    cgroup_fd = pid;

    + get_online_cpus();
    +
    event = perf_event_alloc(&attr, cpu, task, group_leader, NULL,
    NULL, NULL, cgroup_fd);
    if (IS_ERR(event)) {
    err = PTR_ERR(event);
    - goto err_cred;
    + goto err_cpus;
    }

    if (is_sampling_event(event)) {
    @@ -10017,13 +10017,13 @@ SYSCALL_DEFINE5(perf_event_open,
    perf_event_ctx_unlock(group_leader, gctx);
    mutex_unlock(&ctx->mutex);

    + put_online_cpus();
    +
    if (task) {
    mutex_unlock(&task->signal->cred_guard_mutex);
    put_task_struct(task);
    }

    - put_online_cpus();
    -
    mutex_lock(&current->perf_event_mutex);
    list_add_tail(&event->owner_entry, &current->perf_event_list);
    mutex_unlock(&current->perf_event_mutex);
    @@ -10054,11 +10054,11 @@ err_alloc:
    */
    if (!event_file)
    free_event(event);
    +err_cpus:
    + put_online_cpus();
    err_cred:
    if (task)
    mutex_unlock(&task->signal->cred_guard_mutex);
    -err_cpus:
    - put_online_cpus();
    err_task:
    if (task)
    put_task_struct(task);
    \
     
     \ /
      Last update: 2017-05-01 15:01    [W:4.317 / U:0.260 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site