diff options
author | James Hogan <james@albanarts.com> | 2010-10-11 23:59:58 +0200 |
---|---|---|
committer | Rafael J. Wysocki <rjw@sisk.pl> | 2010-10-17 01:57:50 +0200 |
commit | 2ac21c6bc4249ee6d922f18dbec7266377592c32 (patch) | |
tree | 6ef49d2222cf3591bcd427c5721411bdf95e1f12 | |
parent | PM / Runtime: Remove idle notification after failing suspend (diff) | |
download | linux-2ac21c6bc4249ee6d922f18dbec7266377592c32.tar.xz linux-2ac21c6bc4249ee6d922f18dbec7266377592c32.zip |
PM: Lock PM device list mutex in show_dev_hash()
Lock the PM device list mutex using device_pm_lock() and
device_pm_unlock() around the list iteration in show_dev_hash().
show_dev_hash() was reverse iterating dpm_list without first locking the
mutex that the functions in drivers/base/power/main.c lock. I assume
this was unintentional since there is no comment suggesting why the lock
might not be necessary.
Signed-off-by: James Hogan <james@albanarts.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
-rw-r--r-- | drivers/base/power/trace.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/drivers/base/power/trace.c b/drivers/base/power/trace.c index 0a1a2c4dbc6e..17e24e3f4422 100644 --- a/drivers/base/power/trace.c +++ b/drivers/base/power/trace.c @@ -188,8 +188,10 @@ static int show_file_hash(unsigned int value) static int show_dev_hash(unsigned int value) { int match = 0; - struct list_head *entry = dpm_list.prev; + struct list_head *entry; + device_pm_lock(); + entry = dpm_list.prev; while (entry != &dpm_list) { struct device * dev = to_device(entry); unsigned int hash = hash_string(DEVSEED, dev_name(dev), DEVHASH); @@ -199,6 +201,7 @@ static int show_dev_hash(unsigned int value) } entry = entry->prev; } + device_pm_unlock(); return match; } |