15 Nov, 2010

1 commit

  • Using:
    - CONFIG_LOCKUP_DETECTOR=y
    - CONFIG_PREEMPT=y
    - CONFIG_LOCKDEP=y
    - CONFIG_PROVE_LOCKING=y
    - CONFIG_PROVE_RCU=y
    found a missing rcu lock during boot on a 512 MiB x86_64 ubuntu vm:
    ===================================================
    [ INFO: suspicious rcu_dereference_check() usage. ]
    ---------------------------------------------------
    kernel/pid.c:419 invoked rcu_dereference_check() without protection!

    other info that might help us debug this:

    rcu_scheduler_active = 1, debug_locks = 0
    1 lock held by ureadahead/1355:
    #0: (tasklist_lock){.+.+..}, at: [] sys_ioprio_set+0x7f/0x29e

    stack backtrace:
    Pid: 1355, comm: ureadahead Not tainted 2.6.37-dbg-DEV #1
    Call Trace:
    [] lockdep_rcu_dereference+0xaa/0xb3
    [] find_task_by_pid_ns+0x44/0x5d
    [] find_task_by_vpid+0x22/0x24
    [] sys_ioprio_set+0xb4/0x29e
    [] ? trace_hardirqs_off_thunk+0x3a/0x3c
    [] sysenter_dispatch+0x7/0x2c
    [] ? trace_hardirqs_on_thunk+0x3a/0x3f

    The fix is to:
    a) grab rcu lock in sys_ioprio_{set,get}() and
    b) avoid grabbing tasklist_lock.
    Discussion in: http://marc.info/?l=linux-kernel&m=128951324702889

    Signed-off-by: Greg Thelen
    Acked-by: Paul E. McKenney
    Reviewed-by: Oleg Nesterov

    Modified by Jens to remove the now redundant inner rcu lock and
    unlock since they are now protected by the outer lock.

    Signed-off-by: Jens Axboe

    Greg Thelen
     

10 Nov, 2010

2 commits

  • Commit 4221a9918e38b7494cee341dda7b7b4bb8c04bde "Add RCU check for
    find_task_by_vpid()" introduced rcu_lockdep_assert to find_task_by_pid_ns=

    Assertion failed in sys_ioprio_get. The patch is fixing assertion
    failure in ioprio_set as well.

    kernel/pid.c:419 invoked rcu_dereference_check() without protection!

    stack backtrace:
    Pid: 4254, comm: iotop Not tainted
    Call Trace:
    [] lockdep_rcu_dereference+0xaa/0xb2
    [] find_task_by_pid_ns+0x4f/0x68
    [] find_task_by_vpid+0x1d/0x1f
    [] sys_ioprio_get+0x50/0x2da
    [] system_call_fastpath+0x16/0x1b

    V2: rcu critical section expanded according to comment by Paul E. McKenney

    Signed-off-by: Sergey Senozhatsky
    Acked-by: Paul E. McKenney
    Signed-off-by: Jens Axboe

    Sergey Senozhatsky
     
  • With 2.6.37-rc1, I observe sys_ioprio_set not taking the RCU lock [1]
    across access to the task credentials.

    Inspecting the code in fs/ioprio.c, the tasklist_lock is held for read
    across the __task_cred call, which is presumably sufficient to prevent
    the task credentials becoming stale.

    ===================================================

    [ INFO: suspicious rcu_dereference_check() usage. ]

    ---------------------------------------------------

    kernel/pid.c:419 invoked rcu_dereference_check() without protection!

    other info that might help us debug this:

    rcu_scheduler_active = 1, debug_locks = 1

    1 lock held by start-stop-daem/2246:

    #0: (tasklist_lock){.?.?..}, at: []
    sys_ioprio_set+0x8a/0x400

    stack backtrace:

    Pid: 2246, comm: start-stop-daem Not tainted 2.6.37-rc1-330cd+ #2

    Call Trace:

    [] lockdep_rcu_dereference+0xa4/0xc0

    [] find_task_by_pid_ns+0x81/0x90

    [] find_task_by_vpid+0x1d/0x20

    [] sys_ioprio_set+0x3f0/0x400

    [] ? trace_hardirqs_on_thunk+0x3a/0x3f

    [] system_call_fastpath+0x16/0x1b

    Take the RCU lock for read across acquiring the pointer to the task
    credentials and dereferencing it.

    Signed-off-by: Daniel J Blueman

    Fixed up by Jens to fix missing rcu_read_unlock() on mismatches.

    Signed-off-by: Jens Axboe

    Daniel J Blueman
     

30 Mar, 2010

1 commit

  • …it slab.h inclusion from percpu.h

    percpu.h is included by sched.h and module.h and thus ends up being
    included when building most .c files. percpu.h includes slab.h which
    in turn includes gfp.h making everything defined by the two files
    universally available and complicating inclusion dependencies.

    percpu.h -> slab.h dependency is about to be removed. Prepare for
    this change by updating users of gfp and slab facilities include those
    headers directly instead of assuming availability. As this conversion
    needs to touch large number of source files, the following script is
    used as the basis of conversion.

    http://userweb.kernel.org/~tj/misc/slabh-sweep.py

    The script does the followings.

    * Scan files for gfp and slab usages and update includes such that
    only the necessary includes are there. ie. if only gfp is used,
    gfp.h, if slab is used, slab.h.

    * When the script inserts a new include, it looks at the include
    blocks and try to put the new include such that its order conforms
    to its surrounding. It's put in the include block which contains
    core kernel includes, in the same order that the rest are ordered -
    alphabetical, Christmas tree, rev-Xmas-tree or at the end if there
    doesn't seem to be any matching order.

    * If the script can't find a place to put a new include (mostly
    because the file doesn't have fitting include block), it prints out
    an error message indicating which .h file needs to be added to the
    file.

    The conversion was done in the following steps.

    1. The initial automatic conversion of all .c files updated slightly
    over 4000 files, deleting around 700 includes and adding ~480 gfp.h
    and ~3000 slab.h inclusions. The script emitted errors for ~400
    files.

    2. Each error was manually checked. Some didn't need the inclusion,
    some needed manual addition while adding it to implementation .h or
    embedding .c file was more appropriate for others. This step added
    inclusions to around 150 files.

    3. The script was run again and the output was compared to the edits
    from #2 to make sure no file was left behind.

    4. Several build tests were done and a couple of problems were fixed.
    e.g. lib/decompress_*.c used malloc/free() wrappers around slab
    APIs requiring slab.h to be added manually.

    5. The script was run on all .h files but without automatically
    editing them as sprinkling gfp.h and slab.h inclusions around .h
    files could easily lead to inclusion dependency hell. Most gfp.h
    inclusion directives were ignored as stuff from gfp.h was usually
    wildly available and often used in preprocessor macros. Each
    slab.h inclusion directive was examined and added manually as
    necessary.

    6. percpu.h was updated not to include slab.h.

    7. Build test were done on the following configurations and failures
    were fixed. CONFIG_GCOV_KERNEL was turned off for all tests (as my
    distributed build env didn't work with gcov compiles) and a few
    more options had to be turned off depending on archs to make things
    build (like ipr on powerpc/64 which failed due to missing writeq).

    * x86 and x86_64 UP and SMP allmodconfig and a custom test config.
    * powerpc and powerpc64 SMP allmodconfig
    * sparc and sparc64 SMP allmodconfig
    * ia64 SMP allmodconfig
    * s390 SMP allmodconfig
    * alpha SMP allmodconfig
    * um on x86_64 SMP allmodconfig

    8. percpu.h modifications were reverted so that it could be applied as
    a separate patch and serve as bisection point.

    Given the fact that I had only a couple of failures from tests on step
    6, I'm fairly confident about the coverage of this conversion patch.
    If there is a breakage, it's likely to be something in one of the arch
    headers which should be easily discoverable easily on most builds of
    the specific arch.

    Signed-off-by: Tejun Heo <tj@kernel.org>
    Guess-its-ok-by: Christoph Lameter <cl@linux-foundation.org>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Lee Schermerhorn <Lee.Schermerhorn@hp.com>

    Tejun Heo
     

14 Jan, 2009

1 commit


06 Jan, 2009

1 commit


14 Nov, 2008

4 commits

  • Use RCU to access another task's creds and to release a task's own creds.
    This means that it will be possible for the credentials of a task to be
    replaced without another task (a) requiring a full lock to read them, and (b)
    seeing deallocated memory.

    Signed-off-by: David Howells
    Acked-by: James Morris
    Acked-by: Serge Hallyn
    Signed-off-by: James Morris

    David Howells
     
  • Wrap current->cred and a few other accessors to hide their actual
    implementation.

    Signed-off-by: David Howells
    Acked-by: James Morris
    Acked-by: Serge Hallyn
    Signed-off-by: James Morris

    David Howells
     
  • Separate the task security context from task_struct. At this point, the
    security data is temporarily embedded in the task_struct with two pointers
    pointing to it.

    Note that the Alpha arch is altered as it refers to (E)UID and (E)GID in
    entry.S via asm-offsets.

    With comment fixes Signed-off-by: Marc Dionne

    Signed-off-by: David Howells
    Acked-by: James Morris
    Acked-by: Serge Hallyn
    Signed-off-by: James Morris

    David Howells
     
  • Wrap access to task credentials so that they can be separated more easily from
    the task_struct during the introduction of COW creds.

    Change most current->(|e|s|fs)[ug]id to current_(|e|s|fs)[ug]id().

    Change some task->e?[ug]id to task_e?[ug]id(). In some places it makes more
    sense to use RCU directly rather than a convenient wrapper; these will be
    addressed by later patches.

    Signed-off-by: David Howells
    Reviewed-by: James Morris
    Acked-by: Serge Hallyn
    Cc: Al Viro
    Signed-off-by: James Morris

    David Howells
     

21 Aug, 2008

1 commit

  • When user calls sys_setpriority(PRIO_PGRP ...) on a NPTL style multi-LWP
    process, only the task leader of the process is affected, all other
    sibling LWP threads didn't receive the setting. The problem was that the
    iterator used in sys_setpriority() only iteartes over one task for each
    process, ignoring all other sibling thread.

    Introduce a new macro do_each_pid_thread / while_each_pid_thread to walk
    each thread of a process. Convert 4 call sites in {set/get}priority and
    ioprio_{set/get}.

    Signed-off-by: Ken Chen
    Cc: Oleg Nesterov
    Cc: Roland McGrath
    Cc: Ingo Molnar
    Cc: Thomas Gleixner
    Cc: Jens Axboe
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Ken Chen