@@ -243,8 +243,8 @@ void sbitmap_bitmap_show(struct sbitmap *sb, struct seq_file *m)
int i;
for (i = 0; i < sb->map_nr; i++) {
- unsigned long word = READ_ONCE(sb->map[i].word);
- unsigned int word_bits = READ_ONCE(sb->map[i].depth);
+ unsigned long word = sb->map[i].word;
+ unsigned int word_bits = sb->map[i].depth;
while (word_bits > 0) {
unsigned int bits = min(8 - byte_bits, word_bits);
@@ -375,7 +375,7 @@ int __sbitmap_queue_get(struct sbitmap_queue *sbq)
int nr;
hint = this_cpu_read(*sbq->alloc_hint);
- depth = READ_ONCE(sbq->sb.depth);
+ depth = sbq->sb.depth;
if (unlikely(hint >= depth)) {
hint = depth ? prandom_u32() % depth : 0;
this_cpu_write(*sbq->alloc_hint, hint);
@@ -406,7 +406,7 @@ int __sbitmap_queue_get_shallow(struct sbitmap_queue *sbq,
WARN_ON_ONCE(shallow_depth < sbq->min_shallow_depth);
hint = this_cpu_read(*sbq->alloc_hint);
- depth = READ_ONCE(sbq->sb.depth);
+ depth = sbq->sb.depth;
if (unlikely(hint >= depth)) {
hint = depth ? prandom_u32() % depth : 0;
this_cpu_write(*sbq->alloc_hint, hint);
We don't need to use READ_ONCE() to read the map depth and word fields. This reduces overhead of __sbitmap_queue_get() dramatically on high IOPS devices, taking it from ~3% to a tenth of that. Signed-off-by: Jens Axboe <axboe@kernel.dk> --- lib/sbitmap.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)