Re: [PATCH net-next 05/12] ptr_ring: disallow lockless __ptr_ring_full
From: "Michael S. Tsirkin" <mst@redhat.com>
Date: 2018-01-26 02:46:15
Also in:
lkml
On Fri, Jan 26, 2018 at 10:38:05AM +0800, Jason Wang wrote:
On 2018年01月26日 07:36, Michael S. Tsirkin wrote:quoted
Similar to bcecb4bbf88a ("net: ptr_ring: otherwise safe empty checks can overrun array bounds") a lockless use of __ptr_ring_full might cause an out of bounds access. We can fix this, but it's easier to just disallow lockless __ptr_ring_full for now.It looks to me that just fix this is better than disallow through doc (which is easily to be ignored ...). Thanks
lockless is tricky, and I'd rather not sprinkle READ/WRITE_ONCE where they aren't necessary.
quoted
Signed-off-by: Michael S. Tsirkin <mst@redhat.com> --- include/linux/ptr_ring.h | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)diff --git a/include/linux/ptr_ring.h b/include/linux/ptr_ring.h index 9a72d8f..f175846 100644 --- a/include/linux/ptr_ring.h +++ b/include/linux/ptr_ring.h@@ -45,9 +45,10 @@ struct ptr_ring { }; /* Note: callers invoking this in a loop must use a compiler barrier, - * for example cpu_relax(). If ring is ever resized, callers must hold - * producer_lock - see e.g. ptr_ring_full. Otherwise, if callers don't hold - * producer_lock, the next call to __ptr_ring_produce may fail. + * for example cpu_relax(). + * + * NB: this is unlike __ptr_ring_empty in that callers must hold producer_lock: + * see e.g. ptr_ring_full. */ static inline bool __ptr_ring_full(struct ptr_ring *r) {