lkml.org 
[lkml]   [2012]   [Feb]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: + syscalls-x86-add-__nr_kcmp-syscall-v8.patch added to -mm tree
    On Thu, Feb 16, 2012 at 08:03:21PM +0100, Oleg Nesterov wrote:
    > On 02/16, Cyrill Gorcunov wrote:
    > >
    > > On Thu, Feb 16, 2012 at 06:40:47PM +0100, Oleg Nesterov wrote:
    > > > On 02/16, Cyrill Gorcunov wrote:
    > > > >
    > > > > -static void access_unlock(struct task_struct *task)
    > > > > +static void kcmp_unlock(struct mutex *m1, struct mutex *m2)
    > > > > {
    > > > > - mutex_unlock(&task->signal->cred_guard_mutex);
    > > > > + if (m2 > m1)
    > > > > + swap(m1, m2);
    > > >
    > > > Well, the order doesn't matter in case of _unlock, you can remove
    > > > this part. Not that it really hurts though, I won't argue.
    > >
    > > It drops some instructions so I think it worth removing
    >
    > Yes.
    >

    Final one ;) I agreed on every line of your comment, thanks a lot Oleg!
    ---
    From: Cyrill Gorcunov <gorcunov@openvz.org>
    Subject: syscalls, x86: Make __NR_kcmp to work with equivalent pids

    In case if pid1 is equal to pid2 the kcmp will return -EBUSY,
    which makes no sence. Make it able to work with equivalent pids.
    Selftest is extended as well.

    Repored-by: Oleg Nesterov <oleg@redhat.com>
    Signed-off-by: Cyrill Gorcunov <gorcunov@openvz.org>
    ---
    diff -u linux-2.6.git/kernel/kcmp.c linux-2.6.git/kernel/kcmp.c
    --- linux-2.6.git/kernel/kcmp.c
    +++ linux-2.6.git/kernel/kcmp.c
    @@ -58,22 +58,28 @@
    return file;
    }

    -static void access_unlock(struct task_struct *task)
    +static void kcmp_unlock(struct mutex *m1, struct mutex *m2)
    {
    - mutex_unlock(&task->signal->cred_guard_mutex);
    + if (likely(m2 != m1))
    + mutex_unlock(m2);
    + mutex_unlock(m1);
    }

    -static int access_trylock(struct task_struct *task)
    +static int kcmp_lock(struct mutex *m1, struct mutex *m2)
    {
    - if (!mutex_trylock(&task->signal->cred_guard_mutex))
    - return -EBUSY;
    + int err;

    - if (!ptrace_may_access(task, PTRACE_MODE_READ)) {
    - mutex_unlock(&task->signal->cred_guard_mutex);
    - return -EPERM;
    + if (m2 > m1)
    + swap(m1, m2);
    +
    + err = mutex_lock_killable(m1);
    + if (!err && likely(m1 != m2)) {
    + err = mutex_lock_killable_nested(m2, SINGLE_DEPTH_NESTING);
    + if (err)
    + mutex_unlock(m1);
    }

    - return 0;
    + return err;
    }

    SYSCALL_DEFINE5(kcmp, pid_t, pid1, pid_t, pid2, int, type,
    @@ -100,12 +106,15 @@
    /*
    * One should have enough rights to inspect task details.
    */
    - ret = access_trylock(task1);
    + ret = kcmp_lock(&task1->signal->cred_guard_mutex,
    + &task2->signal->cred_guard_mutex);
    if (ret)
    goto err;
    - ret = access_trylock(task2);
    - if (ret)
    + if (!ptrace_may_access(task1, PTRACE_MODE_READ) ||
    + !ptrace_may_access(task2, PTRACE_MODE_READ)) {
    + ret = -EPERM;
    goto err_unlock;
    + }

    switch (type) {
    case KCMP_FILE: {
    @@ -149,9 +158,9 @@
    break;
    }

    - access_unlock(task2);
    err_unlock:
    - access_unlock(task1);
    + kcmp_unlock(&task1->signal->cred_guard_mutex,
    + &task2->signal->cred_guard_mutex);
    err:
    put_task_struct(task1);
    put_task_struct(task2);
    diff -u linux-2.6.git/tools/testing/selftests/kcmp/kcmp_test.c linux-2.6.git/tools/testing/selftests/kcmp/kcmp_test.c
    --- linux-2.6.git/tools/testing/selftests/kcmp/kcmp_test.c
    +++ linux-2.6.git/tools/testing/selftests/kcmp/kcmp_test.c
    @@ -74,6 +74,15 @@
    ret = -1;
    } else
    printf("PASS: 0 returned as expected\n");
    +
    + /* Compare with self */
    + ret = sys_kcmp(pid1, pid1, KCMP_VM, 0, 0);
    + if (ret) {
    + printf("FAIL: 0 expected but %li returned\n", ret);
    + ret = -1;
    + } else
    + printf("PASS: 0 returned as expected\n");
    +
    exit(ret);
    }


    \
     
     \ /
      Last update: 2012-02-16 20:33    [W:5.588 / U:0.132 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site