rxrpc: Fix handling of received connection abort

JIRA: https://issues.redhat.com/browse/RHEL-78217

commit 0e56ebde245e4799ce74d38419426f2a80d39950
Author: David Howells <dhowells@redhat.com>
Date:   Wed Dec 4 07:46:30 2024 +0000

    rxrpc: Fix handling of received connection abort

    Fix the handling of a connection abort that we've received.  Though the
    abort is at the connection level, it needs propagating to the calls on that
    connection.  Whilst the propagation bit is performed, the calls aren't then
    woken up to go and process their termination, and as no further input is
    forthcoming, they just hang.

    Also add some tracing for the logging of connection aborts.

    Fixes: 248f219cb8 ("rxrpc: Rewrite the data and ack handling code")
    Signed-off-by: David Howells <dhowells@redhat.com>
    cc: Marc Dionne <marc.dionne@auristor.com>
    cc: linux-afs@lists.infradead.org
    Link: https://patch.msgid.link/20241204074710.990092-3-dhowells@redhat.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>

Signed-off-by: Marc Dionne <mdionne@redhat.com>
This commit is contained in:
Marc Dionne 2025-02-06 08:15:46 -04:00
parent 484e62dbc2
commit 8a5366b3a6
2 changed files with 33 additions and 4 deletions

View File

@ -117,6 +117,7 @@
#define rxrpc_call_poke_traces \
EM(rxrpc_call_poke_abort, "Abort") \
EM(rxrpc_call_poke_complete, "Compl") \
EM(rxrpc_call_poke_conn_abort, "Conn-abort") \
EM(rxrpc_call_poke_error, "Error") \
EM(rxrpc_call_poke_idle, "Idle") \
EM(rxrpc_call_poke_set_timeout, "Set-timo") \
@ -282,6 +283,7 @@
EM(rxrpc_call_see_activate_client, "SEE act-clnt") \
EM(rxrpc_call_see_connect_failed, "SEE con-fail") \
EM(rxrpc_call_see_connected, "SEE connect ") \
EM(rxrpc_call_see_conn_abort, "SEE conn-abt") \
EM(rxrpc_call_see_disconnected, "SEE disconn ") \
EM(rxrpc_call_see_distribute_error, "SEE dist-err") \
EM(rxrpc_call_see_input, "SEE input ") \
@ -981,6 +983,29 @@ TRACE_EVENT(rxrpc_rx_abort,
__entry->abort_code)
);
TRACE_EVENT(rxrpc_rx_conn_abort,
TP_PROTO(const struct rxrpc_connection *conn, const struct sk_buff *skb),
TP_ARGS(conn, skb),
TP_STRUCT__entry(
__field(unsigned int, conn)
__field(rxrpc_serial_t, serial)
__field(u32, abort_code)
),
TP_fast_assign(
__entry->conn = conn->debug_id;
__entry->serial = rxrpc_skb(skb)->hdr.serial;
__entry->abort_code = skb->priority;
),
TP_printk("C=%08x ABORT %08x ac=%d",
__entry->conn,
__entry->serial,
__entry->abort_code)
);
TRACE_EVENT(rxrpc_rx_challenge,
TP_PROTO(struct rxrpc_connection *conn, rxrpc_serial_t serial,
u32 version, u32 nonce, u32 min_level),

View File

@ -63,11 +63,12 @@ int rxrpc_abort_conn(struct rxrpc_connection *conn, struct sk_buff *skb,
/*
* Mark a connection as being remotely aborted.
*/
static bool rxrpc_input_conn_abort(struct rxrpc_connection *conn,
static void rxrpc_input_conn_abort(struct rxrpc_connection *conn,
struct sk_buff *skb)
{
return rxrpc_set_conn_aborted(conn, skb, skb->priority, -ECONNABORTED,
RXRPC_CALL_REMOTELY_ABORTED);
trace_rxrpc_rx_conn_abort(conn, skb);
rxrpc_set_conn_aborted(conn, skb, skb->priority, -ECONNABORTED,
RXRPC_CALL_REMOTELY_ABORTED);
}
/*
@ -202,11 +203,14 @@ static void rxrpc_abort_calls(struct rxrpc_connection *conn)
for (i = 0; i < RXRPC_MAXCALLS; i++) {
call = conn->channels[i].call;
if (call)
if (call) {
rxrpc_see_call(call, rxrpc_call_see_conn_abort);
rxrpc_set_call_completion(call,
conn->completion,
conn->abort_code,
conn->error);
rxrpc_poke_call(call, rxrpc_call_poke_conn_abort);
}
}
_leave("");