• Omar Sandoval's avatar
    sbitmap: use test_and_set_bit_lock()/clear_bit_unlock() · 4ace53f1
    Omar Sandoval authored
    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: default avatarTejun Heo <tj@kernel.org>
    Acked-by: default avatarTejun Heo <tj@kernel.org>
    Signed-off-by: default avatarOmar Sandoval <osandov@fb.com>
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
sbitmap.c 12.5 KB