mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-07-16 11:32:41 +00:00
sbitmap: use test_and_set_bit_lock()/clear_bit_unlock()
sbitmap_queue_get()/sbitmap_queue_clear() are used for allocating/freeing a resource, so they should provide acquire/release barrier semantics, respectively. sbitmap_get() currently contains a full barrier, which is unnecessary, so use test_and_set_bit_lock() instead of test_and_set_bit() (these are equivalent on x86_64). sbitmap_clear_bit() does not imply any barriers, which is incorrect, as accesses of the resource (e.g., request) could potentially get reordered to after the clear_bit(). Introduce sbitmap_clear_bit_unlock() and use it for sbitmap_queue_clear() (this only adds a compiler barrier on x86_64). The other existing user of sbitmap_clear_bit() (the blk-mq software queue pending map) is serialized through a spinlock and does not need this. Reported-by: Tejun Heo <tj@kernel.org> Acked-by: Tejun Heo <tj@kernel.org> Signed-off-by: Omar Sandoval <osandov@fb.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
e9a99a6388
commit
4ace53f1ed
2 changed files with 13 additions and 5 deletions
|
@ -171,6 +171,8 @@ void sbitmap_resize(struct sbitmap *sb, unsigned int depth);
|
|||
* starting from the last allocated bit. This is less efficient
|
||||
* than the default behavior (false).
|
||||
*
|
||||
* This operation provides acquire barrier semantics if it succeeds.
|
||||
*
|
||||
* Return: Non-negative allocated bit number if successful, -1 otherwise.
|
||||
*/
|
||||
int sbitmap_get(struct sbitmap *sb, unsigned int alloc_hint, bool round_robin);
|
||||
|
@ -300,6 +302,12 @@ static inline void sbitmap_clear_bit(struct sbitmap *sb, unsigned int bitnr)
|
|||
clear_bit(SB_NR_TO_BIT(sb, bitnr), __sbitmap_word(sb, bitnr));
|
||||
}
|
||||
|
||||
static inline void sbitmap_clear_bit_unlock(struct sbitmap *sb,
|
||||
unsigned int bitnr)
|
||||
{
|
||||
clear_bit_unlock(SB_NR_TO_BIT(sb, bitnr), __sbitmap_word(sb, bitnr));
|
||||
}
|
||||
|
||||
static inline int sbitmap_test_bit(struct sbitmap *sb, unsigned int bitnr)
|
||||
{
|
||||
return test_bit(SB_NR_TO_BIT(sb, bitnr), __sbitmap_word(sb, bitnr));
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue