<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css" style="display:none;"> P {margin-top:0;margin-bottom:0;} </style>
</head>
<body dir="ltr">
<div class="elementToProof" style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
hello,</div>
<div class="elementToProof" style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div class="elementToProof" style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
is it still possible for this replacement patch( version 2 will be sent out soon) go to HCI 8 release?&nbsp;</div>
<div class="elementToProof" style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
i'd prefer we keep a single code base.&nbsp;</div>
<div class="elementToProof" style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div class="elementToProof" style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
Regards,</div>
<div class="elementToProof" style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
Liu Kui</div>
<hr style="display: inline-block; width: 98%;">
<div id="divRplyFwdMsg" class="elementToProof">
<div class="elementToProof" style="direction: ltr; font-family: Calibri, sans-serif; font-size: 11pt; color: rgb(0, 0, 0);">
<b>From:</b> Konstantin Khorenko &lt;khorenko@virtuozzo.com&gt;<br>
<b>Sent:</b> 15 September 2026 02:50<br>
<b>To:</b> Kui Liu &lt;kui.liu@virtuozzo.com&gt;<br>
<b>Cc:</b> Alexey Kuznetsov &lt;kuznet@virtuozzo.com&gt;; Andrey Zaitsev &lt;azaitsev@virtuozzo.com&gt;; devel@openvz.org &lt;devel@openvz.org&gt;<br>
<b>Subject:</b> Re: [PATCH VZ10] fs/fuse kio: fix RPC response drop for large messages sent over RDMA</div>
<div class="elementToProof" style="direction: ltr;">&nbsp;</div>
</div>
<div class="elementToProof" style="font-size: 11pt;">Liu, also please let me know if this patch replacement (ok, replacement with some next fixed version you send soon)<br>
is a must for HCI 8 release or we can release the HCI 8 kernel as is and change the patch later in next releases.<br>
<br>
--<br>
Best regards,<br>
<br>
Konstantin Khorenko,<br>
Virtuozzo Linux Kernel Team<br>
<br>
On 9/14/26 12:40, Liu Kui wrote:<br>
&gt; When a large message is sent via RDMA READ, it is completed with<br>
&gt; rio_msg_sent() - which moves the request onto the RPC pending queue<br>
&gt; where the response lookup can find it - only after both the<br>
&gt; RDMA_READ_REQ TX completion and the peer's RDMA_READ_ACK have been<br>
&gt; observed. However these two events are independent and not ordered:<br>
&gt; the ACK, and even the response to the request, can arrive before the<br>
&gt; local TX completion is polled. When that happens, the response finds<br>
&gt; no matching request on the RPC pending queue and is dropped, stalling<br>
&gt; the request until the RPC timeout logic kicks in.<br>
&gt;<br>
&gt; Fix it by completing the message in rio_handle_rx_read_ack() as soon<br>
&gt; as the RDMA_READ_ACK arrives. Messages in a single RX queue are<br>
&gt; guaranteed to be delivered in order, so the ACK is always processed<br>
&gt; before the response, and the request is therefore on the RPC pending<br>
&gt; queue by the time its response arrives. This is also what the comment<br>
&gt; in rio_submit() has promised all along.<br>
&gt;<br>
&gt; The tx buffer is still recycled only after both events have been seen.<br>
&gt; A TX send failure is handled by the connection abort logic as before.<br>
&gt; The same applies to an error status carried in the RDMA_READ_ACK:<br>
&gt; since the request msg has already been added to the rpc's pending<br>
&gt; queue, the rio abort triggers an rpc abort, which completes the msg<br>
&gt; with the same PCS_ERR_NET_ABORT error as before.<br>
&gt;<br>
&gt; <a href="https://virtuozzo.atlassian.net/browse/VSTOR-141673" id="OWA0720ed24-e51d-8427-daf8-45f32021e523" class="OWAAutoLink" data-auth="NotApplicable">
https://virtuozzo.atlassian.net/browse/VSTOR-141673</a><br>
&gt;<br>
&gt; Signed-off-by: Liu Kui &lt;kui.liu@virtuozzo.com&gt;<br>
&gt; ---<br>
&gt;&nbsp; fs/fuse/kio/pcs/pcs_rdma_io.c | 9 +--------<br>
&gt;&nbsp; 1 file changed, 1 insertion(+), 8 deletions(-)<br>
&gt;<br>
&gt; diff --git a/fs/fuse/kio/pcs/pcs_rdma_io.c b/fs/fuse/kio/pcs/pcs_rdma_io.c<br>
&gt; index 1c464e0e60f3..14beab8fda8c 100644<br>
&gt; --- a/fs/fuse/kio/pcs/pcs_rdma_io.c<br>
&gt; +++ b/fs/fuse/kio/pcs/pcs_rdma_io.c<br>
&gt; @@ -797,7 +797,6 @@ static inline void rio_kick_write_queue(struct pcs_rdmaio *rio)<br>
&gt;&nbsp;<br>
&gt;&nbsp; static void rio_handle_tx(struct pcs_rdmaio *rio, struct rio_tx *tx, int ok)<br>
&gt;&nbsp; {<br>
&gt; -&nbsp;&nbsp;&nbsp;&nbsp; struct pcs_msg *msg = tx-&gt;msg;<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; u64 xid = tx-&gt;xid;<br>
&gt;&nbsp;<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* override remote success if we already aborted */<br>
&gt; @@ -825,13 +824,6 @@ static void rio_handle_tx(struct pcs_rdmaio *rio, struct rio_tx *tx, int ok)<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; default:<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BUG();<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
&gt; -<br>
&gt; -&nbsp;&nbsp;&nbsp;&nbsp; if (msg) {<br>
&gt; -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!ok)<br>
&gt; -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pcs_set_local_error(&amp;msg-&gt;error, PCS_ERR_NET_ABORT);<br>
&gt; -<br>
&gt; -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rio_msg_sent(rio, NULL, msg, 1);<br>
&gt; -&nbsp;&nbsp;&nbsp;&nbsp; }<br>
&gt;&nbsp; }<br>
&gt;&nbsp;<br>
&gt;&nbsp; /*<br>
&gt; @@ -931,6 +923,7 @@ static int rio_handle_rx_read_ack(struct pcs_rdmaio *rio,<br>
&gt;&nbsp;<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; list_for_each_entry(tx, &amp;rio-&gt;active_txs, list)<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (tx-&gt;xid == rack-&gt;xid) {<br>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rio_msg_sent(rio, NULL, tx-&gt;msg, 1);<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; list_del(&amp;tx-&gt;list);<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rio_handle_tx(rio, tx, !rack-&gt;status);<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<br>
<br>
</div>
</body>
</html>