* [pve-devel] [PATCH kernel] cherry-pick fix for problematic CIFS/io_uring interaction
@ 2025-10-06 9:24 Fiona Ebner
0 siblings, 0 replies; only message in thread
From: Fiona Ebner @ 2025-10-06 9:24 UTC (permalink / raw)
To: pve-devel
When io_uring is used in the same task as CIFS, there might be
unnecessary reconnects, which QEMU will treat as an IO error.
This has been a long-standing issue [0] and was partially mitigated by
qemu-server commit e31762f2 ("fix #4099: disable io_uring for virtual
disks on CIFS storages"). However, back then it was not clear that
it's enough to have IO via io_uring and IO via CIFS be present in the
same task, even if io_uring is not used for CIFS. The issue resurfaced
when QEMU blockdev mirroring was used with the source side using
io_uring and the target being CIFS. This was reported by Aaron
Lauterer and Friedrich Weber. It's also enough to have a VM with two
disks, one using io_uring and one using CIFS and doing IO on both, to
trigger the issue.
Fix the issue by picking up the accepted fix from upstream, i.e.
kernel commit 00be6f26a2a7 ("smb: client: transport: avoid reconnects
triggered by pending task work").
[0]: https://bugzilla.proxmox.com/show_bug.cgi?id=4099
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
---
...port-avoid-reconnects-triggered-by-p.patch | 64 +++++++++++++++++++
1 file changed, 64 insertions(+)
create mode 100644 patches/kernel/0027-smb-client-transport-avoid-reconnects-triggered-by-p.patch
diff --git a/patches/kernel/0027-smb-client-transport-avoid-reconnects-triggered-by-p.patch b/patches/kernel/0027-smb-client-transport-avoid-reconnects-triggered-by-p.patch
new file mode 100644
index 0000000..c5fbf0b
--- /dev/null
+++ b/patches/kernel/0027-smb-client-transport-avoid-reconnects-triggered-by-p.patch
@@ -0,0 +1,64 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Fiona Ebner <f.ebner@proxmox.com>
+Date: Mon, 15 Sep 2025 17:19:39 +0200
+Subject: [PATCH] smb: client: transport: avoid reconnects triggered by pending
+ task work
+
+When io_uring is used in the same task as CIFS, there might be
+unnecessary reconnects, causing issues in user-space applications
+like QEMU with a log like:
+
+> CIFS: VFS: \\10.10.100.81 Error -512 sending data on socket to server
+
+Certain io_uring completions might be added to task_work with
+notify_method being TWA_SIGNAL and thus TIF_NOTIFY_SIGNAL is set for
+the task.
+
+In __smb_send_rqst(), signals are masked before calling
+smb_send_kvec(), but the masking does not apply to TIF_NOTIFY_SIGNAL.
+
+If sk_stream_wait_memory() is reached via sock_sendmsg() while
+TIF_NOTIFY_SIGNAL is set, signal_pending(current) will evaluate to
+true there, and -EINTR will be propagated all the way from
+sk_stream_wait_memory() to sock_sendmsg() in smb_send_kvec().
+Afterwards, __smb_send_rqst() will see that not everything was written
+and reconnect.
+
+Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
+Signed-off-by: Steve French <stfrench@microsoft.com>
+(cherry picked from commit 00be6f26a2a7c671f1402d74c4d3c30a5844660a)
+Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
+---
+ fs/smb/client/transport.c | 10 +++++++++-
+ 1 file changed, 9 insertions(+), 1 deletion(-)
+
+diff --git a/fs/smb/client/transport.c b/fs/smb/client/transport.c
+index f151445b7370bba54593ab1f621a878343267e86..ba864cb9c9fa119659b523ce65155f6400002fd4 100644
+--- a/fs/smb/client/transport.c
++++ b/fs/smb/client/transport.c
+@@ -22,6 +22,7 @@
+ #include <linux/mempool.h>
+ #include <linux/sched/signal.h>
+ #include <linux/task_io_accounting_ops.h>
++#include <linux/task_work.h>
+ #include "cifspdu.h"
+ #include "cifsglob.h"
+ #include "cifsproto.h"
+@@ -212,9 +213,16 @@ smb_send_kvec(struct TCP_Server_Info *server, struct msghdr *smb_msg,
+ * send a packet. In most cases if we fail to send
+ * after the retries we will kill the socket and
+ * reconnect which may clear the network problem.
++ *
++ * Even if regular signals are masked, EINTR might be
++ * propagated from sk_stream_wait_memory() to here when
++ * TIF_NOTIFY_SIGNAL is used for task work. For example,
++ * certain io_uring completions will use that. Treat
++ * having EINTR with pending task work the same as EAGAIN
++ * to avoid unnecessary reconnects.
+ */
+ rc = sock_sendmsg(ssocket, smb_msg);
+- if (rc == -EAGAIN) {
++ if (rc == -EAGAIN || unlikely(rc == -EINTR && task_work_pending(current))) {
+ retries++;
+ if (retries >= 14 ||
+ (!server->noblocksnd && (retries > 2))) {
--
2.47.3
_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2025-10-06 9:25 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-10-06 9:24 [pve-devel] [PATCH kernel] cherry-pick fix for problematic CIFS/io_uring interaction Fiona Ebner
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.