Skip to content

Commit 6b47fe1

Browse files
committed
rxrpc: Trace UDP transmission failure
Add a tracepoint to log transmission failure from the UDP transport socket being used by AF_RXRPC. Signed-off-by: David Howells <[email protected]>
1 parent 494337c commit 6b47fe1

File tree

5 files changed

+90
-8
lines changed

5 files changed

+90
-8
lines changed

include/trace/events/rxrpc.h

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,20 @@ enum rxrpc_congest_change {
211211
rxrpc_cong_saw_nack,
212212
};
213213

214+
enum rxrpc_tx_fail_trace {
215+
rxrpc_tx_fail_call_abort,
216+
rxrpc_tx_fail_call_ack,
217+
rxrpc_tx_fail_call_data_frag,
218+
rxrpc_tx_fail_call_data_nofrag,
219+
rxrpc_tx_fail_call_final_resend,
220+
rxrpc_tx_fail_conn_abort,
221+
rxrpc_tx_fail_conn_challenge,
222+
rxrpc_tx_fail_conn_response,
223+
rxrpc_tx_fail_reject,
224+
rxrpc_tx_fail_version_keepalive,
225+
rxrpc_tx_fail_version_reply,
226+
};
227+
214228
#endif /* end __RXRPC_DECLARE_TRACE_ENUMS_ONCE_ONLY */
215229

216230
/*
@@ -438,6 +452,19 @@ enum rxrpc_congest_change {
438452
EM(RXRPC_CALL_LOCAL_ERROR, "LocalError") \
439453
E_(RXRPC_CALL_NETWORK_ERROR, "NetError")
440454

455+
#define rxrpc_tx_fail_traces \
456+
EM(rxrpc_tx_fail_call_abort, "CallAbort") \
457+
EM(rxrpc_tx_fail_call_ack, "CallAck") \
458+
EM(rxrpc_tx_fail_call_data_frag, "CallDataFrag") \
459+
EM(rxrpc_tx_fail_call_data_nofrag, "CallDataNofrag") \
460+
EM(rxrpc_tx_fail_call_final_resend, "CallFinalResend") \
461+
EM(rxrpc_tx_fail_conn_abort, "ConnAbort") \
462+
EM(rxrpc_tx_fail_conn_challenge, "ConnChall") \
463+
EM(rxrpc_tx_fail_conn_response, "ConnResp") \
464+
EM(rxrpc_tx_fail_reject, "Reject") \
465+
EM(rxrpc_tx_fail_version_keepalive, "VerKeepalive") \
466+
E_(rxrpc_tx_fail_version_reply, "VerReply")
467+
441468
/*
442469
* Export enum symbols via userspace.
443470
*/
@@ -461,6 +488,7 @@ rxrpc_propose_ack_traces;
461488
rxrpc_propose_ack_outcomes;
462489
rxrpc_congest_modes;
463490
rxrpc_congest_changes;
491+
rxrpc_tx_fail_traces;
464492

465493
/*
466494
* Now redefine the EM() and E_() macros to map the enums to the strings that
@@ -1404,6 +1432,33 @@ TRACE_EVENT(rxrpc_rx_icmp,
14041432
&__entry->srx.transport)
14051433
);
14061434

1435+
TRACE_EVENT(rxrpc_tx_fail,
1436+
TP_PROTO(unsigned int debug_id, rxrpc_serial_t serial, int ret,
1437+
enum rxrpc_tx_fail_trace what),
1438+
1439+
TP_ARGS(debug_id, serial, ret, what),
1440+
1441+
TP_STRUCT__entry(
1442+
__field(unsigned int, debug_id )
1443+
__field(rxrpc_serial_t, serial )
1444+
__field(int, ret )
1445+
__field(enum rxrpc_tx_fail_trace, what )
1446+
),
1447+
1448+
TP_fast_assign(
1449+
__entry->debug_id = debug_id;
1450+
__entry->serial = serial;
1451+
__entry->ret = ret;
1452+
__entry->what = what;
1453+
),
1454+
1455+
TP_printk("c=%08x r=%x ret=%d %s",
1456+
__entry->debug_id,
1457+
__entry->serial,
1458+
__entry->ret,
1459+
__print_symbolic(__entry->what, rxrpc_tx_fail_traces))
1460+
);
1461+
14071462
#endif /* _TRACE_RXRPC_H */
14081463

14091464
/* This part must be outside protection */

net/rxrpc/conn_event.c

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ static void rxrpc_conn_retransmit_call(struct rxrpc_connection *conn,
4040
} __attribute__((packed)) pkt;
4141
struct rxrpc_ackinfo ack_info;
4242
size_t len;
43-
int ioc;
43+
int ret, ioc;
4444
u32 serial, mtu, call_id, padding;
4545

4646
_enter("%d", conn->debug_id);
@@ -135,10 +135,13 @@ static void rxrpc_conn_retransmit_call(struct rxrpc_connection *conn,
135135
break;
136136
}
137137

138-
kernel_sendmsg(conn->params.local->socket, &msg, iov, ioc, len);
138+
ret = kernel_sendmsg(conn->params.local->socket, &msg, iov, ioc, len);
139139
conn->params.peer->last_tx_at = ktime_get_real();
140+
if (ret < 0)
141+
trace_rxrpc_tx_fail(conn->debug_id, serial, ret,
142+
rxrpc_tx_fail_call_final_resend);
143+
140144
_leave("");
141-
return;
142145
}
143146

144147
/*
@@ -236,6 +239,8 @@ static int rxrpc_abort_connection(struct rxrpc_connection *conn,
236239

237240
ret = kernel_sendmsg(conn->params.local->socket, &msg, iov, 2, len);
238241
if (ret < 0) {
242+
trace_rxrpc_tx_fail(conn->debug_id, serial, ret,
243+
rxrpc_tx_fail_conn_abort);
239244
_debug("sendmsg failed: %d", ret);
240245
return -EAGAIN;
241246
}

net/rxrpc/local_event.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,8 @@ static void rxrpc_send_version_request(struct rxrpc_local *local,
7171

7272
ret = kernel_sendmsg(local->socket, &msg, iov, 2, len);
7373
if (ret < 0)
74-
_debug("sendmsg failed: %d", ret);
74+
trace_rxrpc_tx_fail(local->debug_id, 0, ret,
75+
rxrpc_tx_fail_version_reply);
7576

7677
_leave("");
7778
}

net/rxrpc/output.c

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,9 @@ int rxrpc_send_ack_packet(struct rxrpc_call *call, bool ping,
210210
if (ping)
211211
call->ping_time = now;
212212
conn->params.peer->last_tx_at = ktime_get_real();
213+
if (ret < 0)
214+
trace_rxrpc_tx_fail(call->debug_id, serial, ret,
215+
rxrpc_tx_fail_call_ack);
213216

214217
if (call->state < RXRPC_CALL_COMPLETE) {
215218
if (ret < 0) {
@@ -294,6 +297,10 @@ int rxrpc_send_abort_packet(struct rxrpc_call *call)
294297
ret = kernel_sendmsg(conn->params.local->socket,
295298
&msg, iov, 1, sizeof(pkt));
296299
conn->params.peer->last_tx_at = ktime_get_real();
300+
if (ret < 0)
301+
trace_rxrpc_tx_fail(call->debug_id, serial, ret,
302+
rxrpc_tx_fail_call_abort);
303+
297304

298305
rxrpc_put_connection(conn);
299306
return ret;
@@ -387,6 +394,9 @@ int rxrpc_send_data_packet(struct rxrpc_call *call, struct sk_buff *skb,
387394
conn->params.peer->last_tx_at = ktime_get_real();
388395

389396
up_read(&conn->params.local->defrag_sem);
397+
if (ret < 0)
398+
trace_rxrpc_tx_fail(call->debug_id, serial, ret,
399+
rxrpc_tx_fail_call_data_nofrag);
390400
if (ret == -EMSGSIZE)
391401
goto send_fragmentable;
392402

@@ -476,6 +486,10 @@ int rxrpc_send_data_packet(struct rxrpc_call *call, struct sk_buff *skb,
476486
#endif
477487
}
478488

489+
if (ret < 0)
490+
trace_rxrpc_tx_fail(call->debug_id, serial, ret,
491+
rxrpc_tx_fail_call_data_frag);
492+
479493
up_write(&conn->params.local->defrag_sem);
480494
goto done;
481495
}
@@ -493,6 +507,7 @@ void rxrpc_reject_packets(struct rxrpc_local *local)
493507
struct kvec iov[2];
494508
size_t size;
495509
__be32 code;
510+
int ret;
496511

497512
_enter("%d", local->debug_id);
498513

@@ -527,7 +542,10 @@ void rxrpc_reject_packets(struct rxrpc_local *local)
527542
whdr.flags ^= RXRPC_CLIENT_INITIATED;
528543
whdr.flags &= RXRPC_CLIENT_INITIATED;
529544

530-
kernel_sendmsg(local->socket, &msg, iov, 2, size);
545+
ret = kernel_sendmsg(local->socket, &msg, iov, 2, size);
546+
if (ret < 0)
547+
trace_rxrpc_tx_fail(local->debug_id, 0, ret,
548+
rxrpc_tx_fail_reject);
531549
}
532550

533551
rxrpc_free_skb(skb, rxrpc_skb_rx_freed);
@@ -578,7 +596,8 @@ void rxrpc_send_keepalive(struct rxrpc_peer *peer)
578596

579597
ret = kernel_sendmsg(peer->local->socket, &msg, iov, 2, len);
580598
if (ret < 0)
581-
_debug("sendmsg failed: %d", ret);
599+
trace_rxrpc_tx_fail(peer->debug_id, 0, ret,
600+
rxrpc_tx_fail_version_keepalive);
582601

583602
peer->last_tx_at = ktime_get_real();
584603
_leave("");

net/rxrpc/rxkad.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -664,7 +664,8 @@ static int rxkad_issue_challenge(struct rxrpc_connection *conn)
664664

665665
ret = kernel_sendmsg(conn->params.local->socket, &msg, iov, 2, len);
666666
if (ret < 0) {
667-
_debug("sendmsg failed: %d", ret);
667+
trace_rxrpc_tx_fail(conn->debug_id, serial, ret,
668+
rxrpc_tx_fail_conn_challenge);
668669
return -EAGAIN;
669670
}
670671

@@ -719,7 +720,8 @@ static int rxkad_send_response(struct rxrpc_connection *conn,
719720

720721
ret = kernel_sendmsg(conn->params.local->socket, &msg, iov, 3, len);
721722
if (ret < 0) {
722-
_debug("sendmsg failed: %d", ret);
723+
trace_rxrpc_tx_fail(conn->debug_id, serial, ret,
724+
rxrpc_tx_fail_conn_response);
723725
return -EAGAIN;
724726
}
725727

0 commit comments

Comments
 (0)