XArray: Add xa_store_bh() and xa_store_irq()
These convenience wrappers disable interrupts while taking the spinlock. A number of drivers would otherwise have to open-code these functions. Signed-off-by: Matthew Wilcox <willy@infradead.org>
This commit is contained in:
parent
9c16bb8890
commit
84e5acb76d
|
@ -167,6 +167,8 @@ Takes RCU read lock:
|
||||||
|
|
||||||
Takes xa_lock internally:
|
Takes xa_lock internally:
|
||||||
* :c:func:`xa_store`
|
* :c:func:`xa_store`
|
||||||
|
* :c:func:`xa_store_bh`
|
||||||
|
* :c:func:`xa_store_irq`
|
||||||
* :c:func:`xa_insert`
|
* :c:func:`xa_insert`
|
||||||
* :c:func:`xa_erase`
|
* :c:func:`xa_erase`
|
||||||
* :c:func:`xa_erase_bh`
|
* :c:func:`xa_erase_bh`
|
||||||
|
@ -247,7 +249,8 @@ Sharing the XArray with interrupt context is also possible, either
|
||||||
using :c:func:`xa_lock_irqsave` in both the interrupt handler and process
|
using :c:func:`xa_lock_irqsave` in both the interrupt handler and process
|
||||||
context, or :c:func:`xa_lock_irq` in process context and :c:func:`xa_lock`
|
context, or :c:func:`xa_lock_irq` in process context and :c:func:`xa_lock`
|
||||||
in the interrupt handler. Some of the more common patterns have helper
|
in the interrupt handler. Some of the more common patterns have helper
|
||||||
functions such as :c:func:`xa_erase_bh` and :c:func:`xa_erase_irq`.
|
functions such as :c:func:`xa_store_bh`, :c:func:`xa_store_irq`,
|
||||||
|
:c:func:`xa_erase_bh` and :c:func:`xa_erase_irq`.
|
||||||
|
|
||||||
Sometimes you need to protect access to the XArray with a mutex because
|
Sometimes you need to protect access to the XArray with a mutex because
|
||||||
that lock sits above another mutex in the locking hierarchy. That does
|
that lock sits above another mutex in the locking hierarchy. That does
|
||||||
|
|
|
@ -426,6 +426,58 @@ static inline int __xa_insert(struct xarray *xa, unsigned long index,
|
||||||
return -EEXIST;
|
return -EEXIST;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* xa_store_bh() - Store this entry in the XArray.
|
||||||
|
* @xa: XArray.
|
||||||
|
* @index: Index into array.
|
||||||
|
* @entry: New entry.
|
||||||
|
* @gfp: Memory allocation flags.
|
||||||
|
*
|
||||||
|
* This function is like calling xa_store() except it disables softirqs
|
||||||
|
* while holding the array lock.
|
||||||
|
*
|
||||||
|
* Context: Any context. Takes and releases the xa_lock while
|
||||||
|
* disabling softirqs.
|
||||||
|
* Return: The entry which used to be at this index.
|
||||||
|
*/
|
||||||
|
static inline void *xa_store_bh(struct xarray *xa, unsigned long index,
|
||||||
|
void *entry, gfp_t gfp)
|
||||||
|
{
|
||||||
|
void *curr;
|
||||||
|
|
||||||
|
xa_lock_bh(xa);
|
||||||
|
curr = __xa_store(xa, index, entry, gfp);
|
||||||
|
xa_unlock_bh(xa);
|
||||||
|
|
||||||
|
return curr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* xa_store_irq() - Erase this entry from the XArray.
|
||||||
|
* @xa: XArray.
|
||||||
|
* @index: Index into array.
|
||||||
|
* @entry: New entry.
|
||||||
|
* @gfp: Memory allocation flags.
|
||||||
|
*
|
||||||
|
* This function is like calling xa_store() except it disables interrupts
|
||||||
|
* while holding the array lock.
|
||||||
|
*
|
||||||
|
* Context: Process context. Takes and releases the xa_lock while
|
||||||
|
* disabling interrupts.
|
||||||
|
* Return: The entry which used to be at this index.
|
||||||
|
*/
|
||||||
|
static inline void *xa_store_irq(struct xarray *xa, unsigned long index,
|
||||||
|
void *entry, gfp_t gfp)
|
||||||
|
{
|
||||||
|
void *curr;
|
||||||
|
|
||||||
|
xa_lock_irq(xa);
|
||||||
|
curr = __xa_store(xa, index, entry, gfp);
|
||||||
|
xa_unlock_irq(xa);
|
||||||
|
|
||||||
|
return curr;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* xa_erase_bh() - Erase this entry from the XArray.
|
* xa_erase_bh() - Erase this entry from the XArray.
|
||||||
* @xa: XArray.
|
* @xa: XArray.
|
||||||
|
|
Loading…
Reference in New Issue