From: Liu Kui <kui.liu@virtuozzo.com>
To: devel@openvz.org
Cc: azaitsev@virtuozzo.com, Liu Kui <kui.liu@virtuozzo.com>
Subject: [Devel] [PATCH VZ10] fs/fuse kio: fix RPC response drop for large messages sent over RDMA
Date: Mon, 14 Sep 2026 18:40:02 +0800 [thread overview]
Message-ID: <20260914104002.53475-1-kui.liu@virtuozzo.com> (raw)
When a large message is sent via RDMA READ, it is completed with
rio_msg_sent() - which moves the request onto the RPC pending queue
where the response lookup can find it - only after both the
RDMA_READ_REQ TX completion and the peer's RDMA_READ_ACK have been
observed. However these two events are independent and not ordered:
the ACK, and even the response to the request, can arrive before the
local TX completion is polled. When that happens, the response finds
no matching request on the RPC pending queue and is dropped, stalling
the request until the RPC timeout logic kicks in.
Fix it by completing the message in rio_handle_rx_read_ack() as soon
as the RDMA_READ_ACK arrives. Messages in a single RX queue are
guaranteed to be delivered in order, so the ACK is always processed
before the response, and the request is therefore on the RPC pending
queue by the time its response arrives. This is also what the comment
in rio_submit() has promised all along.
The tx buffer is still recycled only after both events have been seen.
A TX send failure is handled by the connection abort logic as before.
The same applies to an error status carried in the RDMA_READ_ACK:
since the request msg has already been added to the rpc's pending
queue, the rio abort triggers an rpc abort, which completes the msg
with the same PCS_ERR_NET_ABORT error as before.
https://virtuozzo.atlassian.net/browse/VSTOR-141673
Signed-off-by: Liu Kui <kui.liu@virtuozzo.com>
---
fs/fuse/kio/pcs/pcs_rdma_io.c | 9 +--------
1 file changed, 1 insertion(+), 8 deletions(-)
diff --git a/fs/fuse/kio/pcs/pcs_rdma_io.c b/fs/fuse/kio/pcs/pcs_rdma_io.c
index 1c464e0e60f3..14beab8fda8c 100644
--- a/fs/fuse/kio/pcs/pcs_rdma_io.c
+++ b/fs/fuse/kio/pcs/pcs_rdma_io.c
@@ -797,7 +797,6 @@ static inline void rio_kick_write_queue(struct pcs_rdmaio *rio)
static void rio_handle_tx(struct pcs_rdmaio *rio, struct rio_tx *tx, int ok)
{
- struct pcs_msg *msg = tx->msg;
u64 xid = tx->xid;
/* override remote success if we already aborted */
@@ -825,13 +824,6 @@ static void rio_handle_tx(struct pcs_rdmaio *rio, struct rio_tx *tx, int ok)
default:
BUG();
}
-
- if (msg) {
- if (!ok)
- pcs_set_local_error(&msg->error, PCS_ERR_NET_ABORT);
-
- rio_msg_sent(rio, NULL, msg, 1);
- }
}
/*
@@ -931,6 +923,7 @@ static int rio_handle_rx_read_ack(struct pcs_rdmaio *rio,
list_for_each_entry(tx, &rio->active_txs, list)
if (tx->xid == rack->xid) {
+ rio_msg_sent(rio, NULL, tx->msg, 1);
list_del(&tx->list);
rio_handle_tx(rio, tx, !rack->status);
return 0;
--
2.50.1 (Apple Git-155)
_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel
next reply other threads:[~2026-09-14 10:41 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-14 10:40 Liu Kui [this message]
2026-09-14 18:41 ` Konstantin Khorenko
2026-09-14 18:50 ` Konstantin Khorenko
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260914104002.53475-1-kui.liu@virtuozzo.com \
--to=kui.liu@virtuozzo.com \
--cc=azaitsev@virtuozzo.com \
--cc=devel@openvz.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.