Alan Stern wrote, On 12/03/2007 04:08 PM:
> On Mon, 3 Dec 2007, Jarek Poplawski wrote:
>
>>> System sleep start:
>>> down_read(notifier-chain rwsem);
>>> call the notifier routine
>>> down_write(&system_sleep_in_progress_rwsem);
>>> up_read(notifier-chain rwsem);
>>>
>>> System sleep end:
>>> down_read(notifier-chain rwsem);
>>> call the notifier routine
>>> up_write(&system_sleep_in_progress_rwsem);
>>> up_read(notifier-chain rwsem);
>>>
>>> This creates a lockdep violation; each rwsem in turn is locked while
>>> the other is being held. However the only way this could lead to
>>> deadlock would be if there was already a bug in the system Power
>>> Management code (overlapping notifications).
>> Actually, IMHO, there is no reason for any lockdep violation:
>>
>> thread #1: has down_read(A); waits for #2 to down_write(B)
>> thread #2: has down_write(B); never waits for #1 to down_read(A)
>>
>> So, deadlock isn't possible here. If lockdep reports something else it
>> should be fixed (and you'd be right to omit lockdep until this is
>> done).
>
> I think the reasoning goes the way Arjan described. Suppose in between
> #1 and #2 there is thread #3 trying to do down_write(A) and waiting for
> #1. Then thread #2 doesn't have to wait for #1 directly, but it would
> have to wait for #3.
As a matter of fact I completely missed Arjan's point because I thought
you described these locks according to lockdep's report, and there is
an information about read or write... Since, you still seem to guess
above about possible scenario, maybe it would be easier to show this
report (and maybe a piece of this code if possible)?
Btw., if it were like you're suggesting, it still shouldn't make any
difference: if thread #3 is only waiting for the lock taken for reading,
then I can't see why thread #2 has to wait for anything. Probably more
dangerous, at least for lockdep, could look taking down_write(A) by
thread #1 in between, but if it all were possible only within one
thread, then still there should be no reason to change good program
only to please lockdep.
> In my case the simplest answer appears to be the replace the rwsem
> with something slightly more complicated (a mutex plus a boolean flag
> -- the loss of concurrency won't matter much since it isn't on a hot
> path).
I'm not sure I can understand your plan, but I doubt there should be
such problems with taking rwsem for sleeping, so maybe it would be
better to figure out what really scares lockdep, to fix the right place?
Jarek P.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[Index of Archives]
[Kernel Newbies]
[Netfilter]
[Bugtraq]
[Photo]
[Stuff]
[Gimp]
[Yosemite News]
[MIPS Linux]
[ARM Linux]
[Linux Security]
[Linux RAID]
[Video 4 Linux]
[Linux for the blind]
[Linux Resources]