diff options
Diffstat (limited to 'lib/refcount.c')
-rw-r--r-- | lib/refcount.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/lib/refcount.c b/lib/refcount.c index 0eb48353abe3..d3b81cefce91 100644 --- a/lib/refcount.c +++ b/lib/refcount.c | |||
@@ -350,3 +350,31 @@ bool refcount_dec_and_lock(refcount_t *r, spinlock_t *lock) | |||
350 | } | 350 | } |
351 | EXPORT_SYMBOL(refcount_dec_and_lock); | 351 | EXPORT_SYMBOL(refcount_dec_and_lock); |
352 | 352 | ||
353 | /** | ||
354 | * refcount_dec_and_lock_irqsave - return holding spinlock with disabled | ||
355 | * interrupts if able to decrement refcount to 0 | ||
356 | * @r: the refcount | ||
357 | * @lock: the spinlock to be locked | ||
358 | * @flags: saved IRQ-flags if the is acquired | ||
359 | * | ||
360 | * Same as refcount_dec_and_lock() above except that the spinlock is acquired | ||
361 | * with disabled interupts. | ||
362 | * | ||
363 | * Return: true and hold spinlock if able to decrement refcount to 0, false | ||
364 | * otherwise | ||
365 | */ | ||
366 | bool refcount_dec_and_lock_irqsave(refcount_t *r, spinlock_t *lock, | ||
367 | unsigned long *flags) | ||
368 | { | ||
369 | if (refcount_dec_not_one(r)) | ||
370 | return false; | ||
371 | |||
372 | spin_lock_irqsave(lock, *flags); | ||
373 | if (!refcount_dec_and_test(r)) { | ||
374 | spin_unlock_irqrestore(lock, *flags); | ||
375 | return false; | ||
376 | } | ||
377 | |||
378 | return true; | ||
379 | } | ||
380 | EXPORT_SYMBOL(refcount_dec_and_lock_irqsave); | ||