lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <Pine.LNX.4.44L0.0712021430140.4185-100000@netrider.rowland.org>
Date:	Sun, 2 Dec 2007 14:45:32 -0500 (EST)
From:	Alan Stern <stern@...land.harvard.edu>
To:	Ingo Molnar <mingo@...e.hu>
cc:	Linux-pm mailing list <linux-pm@...ts.linux-foundation.org>,
	Kernel development list <linux-kernel@...r.kernel.org>
Subject: Need lockdep help

Ingo:

I ran into a lockdep reporting issue just now with some new code under 
development.  I think it's a false positive; the question is how best 
to deal with it.

Here's the situation.  The new code runs during a system sleep (i.e., 
suspend or hibernation).  Certain activities have to be deferred during 
a system sleep, so I defined an rwsem: system_sleep_in_progress_rwsem.

Subroutines carrying out these activities acquire a read lock on the
rwsem, so normally they proceed with no hindrance.  During a sleep
transition, I acquire a write lock -- this is done via a PM-notifier
callout routine.  That is, during a PM_HIBERNATION_PREPARE or
PM_SUSPEND_PREPARE notification the routine does down_write(), and
during a PM_POST_HIBERNATION or PM_POST_SUSPEND notification the
routine does up_write().

The problem is that the notifier chain itself is under the control of 
an rwsem (to prevent the chain from being modified while it is in use).  
The resulting actions look like this:

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).

Perhaps the system_sleep_in_progress_rwsem could be replaced by some 
other sort of synchronizing mechanism, but I don't want to change it -- 
an rwsem really does seem to be the correct thing to use here.

What do you suggest?

Alan Stern

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ