summaryrefslogtreecommitdiff
path: root/include/linux
diff options
context:
space:
mode:
authorKameron Carr <kameroncarr@linux.microsoft.com>2026-10-19 16:09:47 -0700
committerWei Liu <wei.liu@kernel.org>2026-10-21 00:00:29 -0700
commit10e2eba7ccb507af62bfff72687c8c559fa4d689 (patch)
tree115ff8ac43afbb6e93841f03ac0b2c25106e8a93 /include/linux
parent1d287c17cc5bfd6386fe0770999be410b248d021 (diff)
Drivers: hv: vmbus: Use *_ONCE() to access shared ring buffer indices
The ring buffer read/write indices live in a page shared with the host, so the compiler must not split, merge or refetch accesses to them. Add READ_ONCE()/WRITE_ONCE() in hv_set_next_write_location(), hv_pkt_iter_close(), hv_get_bytes_to_read() and hv_get_bytes_to_write(). The accesses in hv_ringbuffer_get_debuginfo() are left to the next patch. Drop hv_get_ring_bufferindices(). It has one caller and is a one-line expression on the write index. Inlining it moves the access to the call site, so hv_ringbuffer_write() can reuse its validated snapshot of that index, old_write, rather than reading the shared memory a second time. No functional change intended for a well-behaved host. Reviewed-by: Michael Kelley <mhklinux@outlook.com> Signed-off-by: Kameron Carr <kameroncarr@linux.microsoft.com> Signed-off-by: Wei Liu <wei.liu@kernel.org>
Diffstat (limited to 'include/linux')
-rw-r--r--include/linux/hyperv.h4
1 files changed, 2 insertions, 2 deletions
diff --git a/include/linux/hyperv.h b/include/linux/hyperv.h
index 9e109d91aa14..5c6582085b16 100644
--- a/include/linux/hyperv.h
+++ b/include/linux/hyperv.h
@@ -214,7 +214,7 @@ static inline u32 hv_get_bytes_to_read(const struct hv_ring_buffer_info *rbi)
u32 read_loc, write_loc, dsize, read;
dsize = rbi->ring_datasize;
- read_loc = rbi->ring_buffer->read_index;
+ read_loc = READ_ONCE(rbi->ring_buffer->read_index);
write_loc = READ_ONCE(rbi->ring_buffer->write_index);
read = write_loc >= read_loc ? (write_loc - read_loc) :
@@ -229,7 +229,7 @@ static inline u32 hv_get_bytes_to_write(const struct hv_ring_buffer_info *rbi)
dsize = rbi->ring_datasize;
read_loc = READ_ONCE(rbi->ring_buffer->read_index);
- write_loc = rbi->ring_buffer->write_index;
+ write_loc = READ_ONCE(rbi->ring_buffer->write_index);
write = write_loc >= read_loc ? dsize - (write_loc - read_loc) :
read_loc - write_loc;