rxrpc: Don't store the rxrpc header in the Tx queue sk_buffs
Don't store the rxrpc protocol header in sk_buffs on the transmit queue, but rather generate it on the fly and pass it to kernel_sendmsg() as a separate iov. This reduces the amount of storage required. Note that the security header is still stored in the sk_buff as it may get encrypted along with the data (and doesn't change with each transmission). Signed-off-by: David Howells <dhowells@redhat.com>
This commit is contained in:
@@ -139,7 +139,6 @@ void rxrpc_propose_ACK(struct rxrpc_call *call, u8 ack_reason,
|
||||
*/
|
||||
static void rxrpc_resend(struct rxrpc_call *call)
|
||||
{
|
||||
struct rxrpc_wire_header *whdr;
|
||||
struct rxrpc_skb_priv *sp;
|
||||
struct sk_buff *skb;
|
||||
rxrpc_seq_t cursor, seq, top;
|
||||
@@ -201,15 +200,8 @@ static void rxrpc_resend(struct rxrpc_call *call)
|
||||
skb = call->rxtx_buffer[ix];
|
||||
rxrpc_get_skb(skb, rxrpc_skb_tx_got);
|
||||
spin_unlock_bh(&call->lock);
|
||||
sp = rxrpc_skb(skb);
|
||||
|
||||
/* Each Tx packet needs a new serial number */
|
||||
sp->hdr.serial = atomic_inc_return(&call->conn->serial);
|
||||
|
||||
whdr = (struct rxrpc_wire_header *)skb->head;
|
||||
whdr->serial = htonl(sp->hdr.serial);
|
||||
|
||||
if (rxrpc_send_data_packet(call->conn, skb) < 0) {
|
||||
if (rxrpc_send_data_packet(call, skb) < 0) {
|
||||
call->resend_at = now + 2;
|
||||
rxrpc_free_skb(skb, rxrpc_skb_tx_freed);
|
||||
return;
|
||||
@@ -217,6 +209,7 @@ static void rxrpc_resend(struct rxrpc_call *call)
|
||||
|
||||
if (rxrpc_is_client_call(call))
|
||||
rxrpc_expose_client_call(call);
|
||||
sp = rxrpc_skb(skb);
|
||||
sp->resend_at = now + rxrpc_resend_timeout;
|
||||
|
||||
rxrpc_free_skb(skb, rxrpc_skb_tx_freed);
|
||||
|
Reference in New Issue
Block a user