diff options
author | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2015-07-31 15:40:03 -0400 |
---|---|---|
committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2015-07-31 15:40:03 -0400 |
commit | 50ba22479c324c0d9dc8134d519dcba92d83a8a7 (patch) | |
tree | 0f939779c7ff97d1b4e923a4fbded2718e09e4d3 /lib | |
parent | 71b65445f0ed04c2afe3660f829779fddb2890c1 (diff) | |
parent | 3431e490b50356b56084305a2e93b3a980802b22 (diff) |
Merge back earlier ACPI PM material for v4.3.
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 | * |