rxrpc: Add tracepoint for ACK proposal
Add a tracepoint to log proposed ACKs, including whether the proposal is used to update a pending ACK or is discarded in favour of an easlier, higher priority ACK. Whilst we're at it, get rid of the rxrpc_acks() function and access the name array directly. We do, however, need to validate the ACK reason number given to trace_rxrpc_rx_ack() to make sure we don't overrun the array. Signed-off-by: David Howells <dhowells@redhat.com>
This commit is contained in:
@@ -58,14 +58,13 @@ out:
|
||||
*/
|
||||
static void __rxrpc_propose_ACK(struct rxrpc_call *call, u8 ack_reason,
|
||||
u16 skew, u32 serial, bool immediate,
|
||||
bool background)
|
||||
bool background,
|
||||
enum rxrpc_propose_ack_trace why)
|
||||
{
|
||||
enum rxrpc_propose_ack_outcome outcome = rxrpc_propose_ack_use;
|
||||
unsigned long now, ack_at, expiry = rxrpc_soft_ack_delay;
|
||||
s8 prior = rxrpc_ack_priority[ack_reason];
|
||||
|
||||
_enter("{%d},%s,%%%x,%u",
|
||||
call->debug_id, rxrpc_acks(ack_reason), serial, immediate);
|
||||
|
||||
/* Update DELAY, IDLE, REQUESTED and PING_RESPONSE ACK serial
|
||||
* numbers, but we don't alter the timeout.
|
||||
*/
|
||||
@@ -74,15 +73,18 @@ static void __rxrpc_propose_ACK(struct rxrpc_call *call, u8 ack_reason,
|
||||
call->ackr_reason, rxrpc_ack_priority[call->ackr_reason]);
|
||||
if (ack_reason == call->ackr_reason) {
|
||||
if (RXRPC_ACK_UPDATEABLE & (1 << ack_reason)) {
|
||||
outcome = rxrpc_propose_ack_update;
|
||||
call->ackr_serial = serial;
|
||||
call->ackr_skew = skew;
|
||||
}
|
||||
if (!immediate)
|
||||
return;
|
||||
goto trace;
|
||||
} else if (prior > rxrpc_ack_priority[call->ackr_reason]) {
|
||||
call->ackr_reason = ack_reason;
|
||||
call->ackr_serial = serial;
|
||||
call->ackr_skew = skew;
|
||||
} else {
|
||||
outcome = rxrpc_propose_ack_subsume;
|
||||
}
|
||||
|
||||
switch (ack_reason) {
|
||||
@@ -124,17 +126,22 @@ static void __rxrpc_propose_ACK(struct rxrpc_call *call, u8 ack_reason,
|
||||
rxrpc_set_timer(call, rxrpc_timer_set_for_ack);
|
||||
}
|
||||
}
|
||||
|
||||
trace:
|
||||
trace_rxrpc_propose_ack(call, why, ack_reason, serial, immediate,
|
||||
background, outcome);
|
||||
}
|
||||
|
||||
/*
|
||||
* propose an ACK be sent, locking the call structure
|
||||
*/
|
||||
void rxrpc_propose_ACK(struct rxrpc_call *call, u8 ack_reason,
|
||||
u16 skew, u32 serial, bool immediate, bool background)
|
||||
u16 skew, u32 serial, bool immediate, bool background,
|
||||
enum rxrpc_propose_ack_trace why)
|
||||
{
|
||||
spin_lock_bh(&call->lock);
|
||||
__rxrpc_propose_ACK(call, ack_reason, skew, serial,
|
||||
immediate, background);
|
||||
immediate, background, why);
|
||||
spin_unlock_bh(&call->lock);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user