FAILED: patch "[PATCH] io_uring: Use WRITE_ONCE() when writing to sq_flags" failed to apply to 5.10-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 5.10-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 20c0b380f971e7d48f5d978bc27d827f7eabb21a Mon Sep 17 00:00:00 2001
From: Nadav Amit <[email protected]>
Date: Sat, 7 Aug 2021 17:13:42 -0700
Subject: [PATCH] io_uring: Use WRITE_ONCE() when writing to sq_flags
The compiler should be forbidden from any strange optimization for async writes to user visible data-structures. Without proper protection, the compiler can cause write-tearing or invent writes that would confuse the userspace.
However, there are writes to sq_flags which are not protected by WRITE_ONCE(). Use WRITE_ONCE() for these writes.
This is purely a theoretical issue. Presumably, any compiler is very unlikely to do such optimizations.
fs/io_uring.c +9 -4
@@ -1500,7 +1500,8 @@ static bool __io_cqring_overflow_flush(struct io_ring_ctx *ctx, bool force) all_flushed =list_empty (&ctx->cq_overflow_list);if (all_flushed) {clear_bit (0 , &ctx->check_cq_overflow); - ctx->rings->sq_flags &= ~IORING_SQ_CQ_OVERFLOW ; +WRITE_ONCE (ctx->rings->sq_flags, + ctx->rings->sq_flags & ~IORING_SQ_CQ_OVERFLOW ); }if (posted)
@@ -1579,7 +1580,9 @@ static bool io_cqring_event_overflow(struct io_ring_ctx *ctx, u64 user_data, }if (list_empty (&ctx->cq_overflow_list)) {set_bit (0 , &ctx->check_cq_overflow); - ctx->rings->sq_flags |=IORING_SQ_CQ_OVERFLOW ; +WRITE_ONCE (ctx->rings->sq_flags, + ctx->rings->sq_flags |IORING_SQ_CQ_OVERFLOW ); + } ocqe->cqe.user_data = user_data; ocqe->cqe.res = res;
@@ -6804,14 +6807,16 @@ static inline void io_ring_set_wakeup_flag(struct io_ring_ctx *ctx) {/* Tell userspace we may need a wakeup call */ spin_lock_irq (&ctx->completion_lock); - ctx->rings->sq_flags |=IORING_SQ_NEED_WAKEUP ; +WRITE_ONCE (ctx->rings->sq_flags, + ctx->rings->sq_flags |IORING_SQ_NEED_WAKEUP );spin_unlock_irq (&ctx->completion_lock); }static inline void io_ring_clear_wakeup_flag (struct io_ring_ctx *ctx) {spin_lock_irq (&ctx->completion_lock); - ctx->rings->sq_flags &= ~IORING_SQ_NEED_WAKEUP ; +WRITE_ONCE (ctx->rings->sq_flags, + ctx->rings->sq_flags & ~IORING_SQ_NEED_WAKEUP );spin_unlock_irq (&ctx->completion_lock); }