lkml.org 
[lkml]   [2008]   [Jan]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: 2.6.24-rc6: possible recursive locking detected
    On 01/05, Peter Zijlstra wrote:
    >
    > Since EP_MAX_POLLWAKE_NESTS < MAX_LOCKDEP_SUBCLASSES we could perhaps do
    > something like:
    >
    > wake_up_nested(..., wake_nests);

    I think this would be the most correct change. But I wonder if it is possible
    to do something more generic (but otoh more stupid/hackish and less safe).

    Consider this "just for illustration" patch,

    --- t/kernel/lockdep.c 2007-11-09 12:57:31.000000000 +0300
    +++ t/kernel/lockdep.c 2008-01-07 19:43:50.000000000 +0300
    @@ -1266,10 +1266,13 @@ check_deadlock(struct task_struct *curr,
    struct held_lock *prev;
    int i;

    - for (i = 0; i < curr->lockdep_depth; i++) {
    + for (i = curr->lockdep_depth; --i >= 0; ) {
    prev = curr->held_locks + i;
    if (prev->class != next->class)
    continue;
    +
    + if (prev->trylock == -1)
    + return 2;
    /*
    * Allow read-after-read recursion of the same
    * lock class (i.e. read_lock(lock)+read_lock(lock)):
    -------------------------------------------------------------------------
    Now,

    // trylock == -1
    #define spin_mark_nested(l) \
    lock_acquire(&(l)->dep_map, 0, -1, 0, 2, _THIS_IP_)
    #define spin_unmark_nested(l) \
    lock_release(&(l)->dep_map, 1, _THIS_IP_)
    and ep_poll_safewake() can do:

    /* Do really wake up now */
    spin_mark_nested(&wq->lock);
    wake_up(wq);
    spin_unmark_nested(&wq->lock);
    Possible?

    Oleg.



    \
     
     \ /
      Last update: 2008-01-07 18:23    [W:0.020 / U:90.700 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site