diff options
author | David Howells <dhowells@redhat.com> | 2016-09-22 00:29:31 +0100 |
---|---|---|
committer | David Howells <dhowells@redhat.com> | 2016-09-22 01:23:50 +0100 |
commit | 5a924b8951f835b5ff8a3d9f434f3b230fc9905f (patch) | |
tree | 078edaea66512bc65011d3fcf1dead7ec8df405a /net/rxrpc/call_event.c | |
parent | 2d7a892626b5616a00d27a40fa23d70d5e618269 (diff) | |
download | op-kernel-dev-5a924b8951f835b5ff8a3d9f434f3b230fc9905f.zip op-kernel-dev-5a924b8951f835b5ff8a3d9f434f3b230fc9905f.tar.gz |
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>
Diffstat (limited to 'net/rxrpc/call_event.c')
-rw-r--r-- | net/rxrpc/call_event.c | 11 |
1 files changed, 2 insertions, 9 deletions
diff --git a/net/rxrpc/call_event.c b/net/rxrpc/call_event.c index 7d1b998..6247ce2 100644 --- a/net/rxrpc/call_event.c +++ b/net/rxrpc/call_event.c @@ -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); |