Re: Linux 3.16-rc6

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



>>>>> "Waiman" == Waiman Long <waiman.long@xxxxxx> writes:

Waiman> On 07/24/2014 02:36 PM, Peter Zijlstra wrote:
>> On Thu, Jul 24, 2014 at 11:18:16AM -0700, Linus Torvalds wrote:
>>> On Thu, Jul 24, 2014 at 5:58 AM, Peter Zijlstra<peterz@xxxxxxxxxxxxx>  wrote:
>>>> So going by the nifty picture rostedt made:
>>>> 
>>>> [   61.454336]        CPU0                    CPU1
>>>> [   61.454336]        ----                    ----
>>>> [   61.454336]   lock(&(&p->alloc_lock)->rlock);
>>>> [   61.454336]                                local_irq_disable();
>>>> [   61.454336]                                lock(tasklist_lock);
>>>> [   61.454336]                                lock(&(&p->alloc_lock)->rlock);
>>>> [   61.454336]<Interrupt>
>>>> [   61.454336]     lock(tasklist_lock);
>>> So this *should* be fine. It always has been in the past, and it was
>>> certainly the *intention* that it should continue to work with
>>> qrwlock, even in the presense of pending writers on other cpu's.
>>> 
>>> The qrwlock rules are that a read-lock in an interrupt is still going
>>> to be unfair and succeed if there are other readers.
>> Ah, indeed. Should have checked :/
>> 
>>> So it sounds to me like the new lockdep rules in tip/master are too
>>> strict and are throwing a false positive.
>> Right. Waiman can you have a look?

Waiman> Yes, I think I may have a solution for that.

Waiman> Borislav, can you apply the following patch on top of the lockdep patch 
Waiman> to see if it can fix the problem?

Waiman> diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c
Waiman> index d24e433..507a8ce 100644
Waiman> --- a/kernel/locking/lockdep.c
Waiman> +++ b/kernel/locking/lockdep.c
Waiman> @@ -3595,6 +3595,12 @@ void lock_acquire(struct lockdep_map *lock, 
Waiman> unsigned int
Waiman>          raw_local_irq_save(flags);
Waiman>          check_flags(flags);

Waiman> +       /*
Waiman> +        * An interrupt recursive read in interrupt context can be 
Waiman> considered
Waiman> +        * to be the same as a recursive read from checking perspective.
Waiman> +        */
Waiman> +       if ((read == 3) && in_interrupt())
Waiman> +               read = 2;
current-> lockdep_recursion = 1;
Waiman>          trace_lock_acquire(lock, subclass, trylock, read, check, 
Waiman> nest_lock, ip);
Waiman>          __lock_acquire(lock, subclass, trylock, read, check,

Instead of the magic numbers 1,2,3, could you use some nicely named
constants here instead?  

John
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Media Devel]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Linux Wireless Networking]     [Linux Omap]

  Powered by Linux