* [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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox