diff options
author | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2015-08-31 21:38:43 -0400 |
---|---|---|
committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2015-08-31 21:38:43 -0400 |
commit | ef5f5de069bd9081a7ddf6998269b58fc65e27ef (patch) | |
tree | 21d53507543248f81725cbc486625f77562f935d /lib | |
parent | 73990fc810bf84c5338d9596f8af8d70fe90ac72 (diff) | |
parent | e91a398c31cef2d51786642e372c503cd43fba90 (diff) |
Merge branch 'acpi-pm'
* acpi-pm:
ACPI / bus: Move duplicate code to a separate new function
mfd: Add support for Intel Sunrisepoint LPSS devices
dmaengine: add a driver for Intel integrated DMA 64-bit
mfd: make mfd_remove_devices() iterate in reverse order
driver core: implement device_for_each_child_reverse()
klist: implement klist_prev()
Driver core: wakeup the parent device before trying probe
ACPI / PM: Attach ACPI power domain only once
PM / QoS: Make it possible to expose device latency tolerance to userspace
ACPI / PM: Update the copyright notice and description of power.c
Diffstat (limited to 'lib')
-rw-r--r-- | lib/klist.c | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/lib/klist.c b/lib/klist.c index 89b485a2a58d..d74cf7a29afd 100644 --- a/lib/klist.c +++ b/lib/klist.c | |||
@@ -324,6 +324,47 @@ static struct klist_node *to_klist_node(struct list_head *n) | |||
324 | } | 324 | } |
325 | 325 | ||
326 | /** | 326 | /** |
327 | * klist_prev - Ante up prev node in list. | ||
328 | * @i: Iterator structure. | ||
329 | * | ||
330 | * First grab list lock. Decrement the reference count of the previous | ||
331 | * node, if there was one. Grab the prev node, increment its reference | ||
332 | * count, drop the lock, and return that prev node. | ||
333 | */ | ||
334 | struct klist_node *klist_prev(struct klist_iter *i) | ||
335 | { | ||
336 | void (*put)(struct klist_node *) = i->i_klist->put; | ||
337 | struct klist_node *last = i->i_cur; | ||
338 | struct klist_node *prev; | ||
339 | |||
340 | spin_lock(&i->i_klist->k_lock); | ||
341 | |||
342 | if (last) { | ||
343 | prev = to_klist_node(last->n_node.prev); | ||
344 | if (!klist_dec_and_del(last)) | ||
345 | put = NULL; | ||
346 | } else | ||
347 | prev = to_klist_node(i->i_klist->k_list.prev); | ||
348 | |||
349 | i->i_cur = NULL; | ||
350 | while (prev != to_klist_node(&i->i_klist->k_list)) { | ||
351 | if (likely(!knode_dead(prev))) { | ||
352 | kref_get(&prev->n_ref); | ||
353 | i->i_cur = prev; | ||
354 | break; | ||
355 | } | ||
356 | prev = to_klist_node(prev->n_node.prev); | ||
357 | } | ||
358 | |||
359 | spin_unlock(&i->i_klist->k_lock); | ||
360 | |||
361 | if (put && last) | ||
362 | put(last); | ||
363 | return i->i_cur; | ||
364 | } | ||
365 | EXPORT_SYMBOL_GPL(klist_prev); | ||
366 | |||
367 | /** | ||
327 | * klist_next - Ante up next node in list. | 368 | * klist_next - Ante up next node in list. |
328 | * @i: Iterator structure. | 369 | * @i: Iterator structure. |
329 | * | 370 | * |