diff mbox series

sbitmap: don't use READ_ONCE() if we don't have to

Message ID 9c657cca-97e6-68e4-6dbb-ac85a6e6511d@kernel.dk (mailing list archive)
State New, archived
Headers show
Series sbitmap: don't use READ_ONCE() if we don't have to | expand

Commit Message

Jens Axboe Nov. 26, 2018, 4:27 p.m. UTC
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(-)
diff mbox series

Patch

diff --git a/lib/sbitmap.c b/lib/sbitmap.c
index fdd1b8aa8ac6..77442e04aeac 100644
--- a/lib/sbitmap.c
+++ b/lib/sbitmap.c
@@ -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);