Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755256AbXLBTpn (ORCPT ); Sun, 2 Dec 2007 14:45:43 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1754501AbXLBTpe (ORCPT ); Sun, 2 Dec 2007 14:45:34 -0500 Received: from netrider.rowland.org ([192.131.102.5]:3287 "HELO netrider.rowland.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with SMTP id S1754682AbXLBTpe (ORCPT ); Sun, 2 Dec 2007 14:45:34 -0500 Date: Sun, 2 Dec 2007 14:45:32 -0500 (EST) From: Alan Stern X-X-Sender: stern@netrider.rowland.org To: Ingo Molnar cc: Linux-pm mailing list , Kernel development list Subject: Need lockdep help Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2054 Lines: 52 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@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/