diff options
author | David S. Miller <davem@davemloft.net> | 2017-11-30 10:07:34 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2017-11-30 10:07:34 -0500 |
commit | 6c9257a708883bbafa0971eb985cd266d46db0eb (patch) | |
tree | 8ce7db1fc9fc0d14aa923f3f2a848ffc990fe4cb | |
parent | 1c08ac0c4bd8e9d66c4dde29bc496c3b430dd028 (diff) | |
parent | 282ef4729195c8503f7101d574acfb5e7c8a8209 (diff) |
Merge tag 'rxrpc-fixes-20171129' of git://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs
David Howells says:
====================
rxrpc: Fixes
Here are three patches for AF_RXRPC. One removes some whitespace, one
fixes terminal ACK generation and the third makes a couple of places
actually use the timeout value just determined rather than ignoring it.
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | net/rxrpc/call_event.c | 4 | ||||
-rw-r--r-- | net/rxrpc/conn_event.c | 50 | ||||
-rw-r--r-- | net/rxrpc/conn_object.c | 2 | ||||
-rw-r--r-- | net/rxrpc/input.c | 4 | ||||
-rw-r--r-- | net/rxrpc/sendmsg.c | 2 |
5 files changed, 35 insertions, 27 deletions
diff --git a/net/rxrpc/call_event.c b/net/rxrpc/call_event.c index bda952ffe6a6..ad2ab1103189 100644 --- a/net/rxrpc/call_event.c +++ b/net/rxrpc/call_event.c | |||
@@ -123,7 +123,7 @@ static void __rxrpc_propose_ACK(struct rxrpc_call *call, u8 ack_reason, | |||
123 | else | 123 | else |
124 | ack_at = expiry; | 124 | ack_at = expiry; |
125 | 125 | ||
126 | ack_at = jiffies + expiry; | 126 | ack_at += now; |
127 | if (time_before(ack_at, call->ack_at)) { | 127 | if (time_before(ack_at, call->ack_at)) { |
128 | WRITE_ONCE(call->ack_at, ack_at); | 128 | WRITE_ONCE(call->ack_at, ack_at); |
129 | rxrpc_reduce_call_timer(call, ack_at, now, | 129 | rxrpc_reduce_call_timer(call, ack_at, now, |
@@ -426,7 +426,7 @@ recheck_state: | |||
426 | next = call->expect_rx_by; | 426 | next = call->expect_rx_by; |
427 | 427 | ||
428 | #define set(T) { t = READ_ONCE(T); if (time_before(t, next)) next = t; } | 428 | #define set(T) { t = READ_ONCE(T); if (time_before(t, next)) next = t; } |
429 | 429 | ||
430 | set(call->expect_req_by); | 430 | set(call->expect_req_by); |
431 | set(call->expect_term_by); | 431 | set(call->expect_term_by); |
432 | set(call->ack_at); | 432 | set(call->ack_at); |
diff --git a/net/rxrpc/conn_event.c b/net/rxrpc/conn_event.c index 9e9a8db1bc9c..4ca11be6be3c 100644 --- a/net/rxrpc/conn_event.c +++ b/net/rxrpc/conn_event.c | |||
@@ -30,22 +30,18 @@ static void rxrpc_conn_retransmit_call(struct rxrpc_connection *conn, | |||
30 | struct rxrpc_skb_priv *sp = skb ? rxrpc_skb(skb) : NULL; | 30 | struct rxrpc_skb_priv *sp = skb ? rxrpc_skb(skb) : NULL; |
31 | struct rxrpc_channel *chan; | 31 | struct rxrpc_channel *chan; |
32 | struct msghdr msg; | 32 | struct msghdr msg; |
33 | struct kvec iov; | 33 | struct kvec iov[3]; |
34 | struct { | 34 | struct { |
35 | struct rxrpc_wire_header whdr; | 35 | struct rxrpc_wire_header whdr; |
36 | union { | 36 | union { |
37 | struct { | 37 | __be32 abort_code; |
38 | __be32 code; | 38 | struct rxrpc_ackpacket ack; |
39 | } abort; | ||
40 | struct { | ||
41 | struct rxrpc_ackpacket ack; | ||
42 | u8 padding[3]; | ||
43 | struct rxrpc_ackinfo info; | ||
44 | }; | ||
45 | }; | 39 | }; |
46 | } __attribute__((packed)) pkt; | 40 | } __attribute__((packed)) pkt; |
41 | struct rxrpc_ackinfo ack_info; | ||
47 | size_t len; | 42 | size_t len; |
48 | u32 serial, mtu, call_id; | 43 | int ioc; |
44 | u32 serial, mtu, call_id, padding; | ||
49 | 45 | ||
50 | _enter("%d", conn->debug_id); | 46 | _enter("%d", conn->debug_id); |
51 | 47 | ||
@@ -66,6 +62,13 @@ static void rxrpc_conn_retransmit_call(struct rxrpc_connection *conn, | |||
66 | msg.msg_controllen = 0; | 62 | msg.msg_controllen = 0; |
67 | msg.msg_flags = 0; | 63 | msg.msg_flags = 0; |
68 | 64 | ||
65 | iov[0].iov_base = &pkt; | ||
66 | iov[0].iov_len = sizeof(pkt.whdr); | ||
67 | iov[1].iov_base = &padding; | ||
68 | iov[1].iov_len = 3; | ||
69 | iov[2].iov_base = &ack_info; | ||
70 | iov[2].iov_len = sizeof(ack_info); | ||
71 | |||
69 | pkt.whdr.epoch = htonl(conn->proto.epoch); | 72 | pkt.whdr.epoch = htonl(conn->proto.epoch); |
70 | pkt.whdr.cid = htonl(conn->proto.cid); | 73 | pkt.whdr.cid = htonl(conn->proto.cid); |
71 | pkt.whdr.callNumber = htonl(call_id); | 74 | pkt.whdr.callNumber = htonl(call_id); |
@@ -80,8 +83,10 @@ static void rxrpc_conn_retransmit_call(struct rxrpc_connection *conn, | |||
80 | len = sizeof(pkt.whdr); | 83 | len = sizeof(pkt.whdr); |
81 | switch (chan->last_type) { | 84 | switch (chan->last_type) { |
82 | case RXRPC_PACKET_TYPE_ABORT: | 85 | case RXRPC_PACKET_TYPE_ABORT: |
83 | pkt.abort.code = htonl(chan->last_abort); | 86 | pkt.abort_code = htonl(chan->last_abort); |
84 | len += sizeof(pkt.abort); | 87 | iov[0].iov_len += sizeof(pkt.abort_code); |
88 | len += sizeof(pkt.abort_code); | ||
89 | ioc = 1; | ||
85 | break; | 90 | break; |
86 | 91 | ||
87 | case RXRPC_PACKET_TYPE_ACK: | 92 | case RXRPC_PACKET_TYPE_ACK: |
@@ -94,13 +99,19 @@ static void rxrpc_conn_retransmit_call(struct rxrpc_connection *conn, | |||
94 | pkt.ack.serial = htonl(skb ? sp->hdr.serial : 0); | 99 | pkt.ack.serial = htonl(skb ? sp->hdr.serial : 0); |
95 | pkt.ack.reason = skb ? RXRPC_ACK_DUPLICATE : RXRPC_ACK_IDLE; | 100 | pkt.ack.reason = skb ? RXRPC_ACK_DUPLICATE : RXRPC_ACK_IDLE; |
96 | pkt.ack.nAcks = 0; | 101 | pkt.ack.nAcks = 0; |
97 | pkt.info.rxMTU = htonl(rxrpc_rx_mtu); | 102 | ack_info.rxMTU = htonl(rxrpc_rx_mtu); |
98 | pkt.info.maxMTU = htonl(mtu); | 103 | ack_info.maxMTU = htonl(mtu); |
99 | pkt.info.rwind = htonl(rxrpc_rx_window_size); | 104 | ack_info.rwind = htonl(rxrpc_rx_window_size); |
100 | pkt.info.jumbo_max = htonl(rxrpc_rx_jumbo_max); | 105 | ack_info.jumbo_max = htonl(rxrpc_rx_jumbo_max); |
101 | pkt.whdr.flags |= RXRPC_SLOW_START_OK; | 106 | pkt.whdr.flags |= RXRPC_SLOW_START_OK; |
102 | len += sizeof(pkt.ack) + sizeof(pkt.info); | 107 | padding = 0; |
108 | iov[0].iov_len += sizeof(pkt.ack); | ||
109 | len += sizeof(pkt.ack) + 3 + sizeof(ack_info); | ||
110 | ioc = 3; | ||
103 | break; | 111 | break; |
112 | |||
113 | default: | ||
114 | return; | ||
104 | } | 115 | } |
105 | 116 | ||
106 | /* Resync with __rxrpc_disconnect_call() and check that the last call | 117 | /* Resync with __rxrpc_disconnect_call() and check that the last call |
@@ -110,9 +121,6 @@ static void rxrpc_conn_retransmit_call(struct rxrpc_connection *conn, | |||
110 | if (READ_ONCE(chan->last_call) != call_id) | 121 | if (READ_ONCE(chan->last_call) != call_id) |
111 | return; | 122 | return; |
112 | 123 | ||
113 | iov.iov_base = &pkt; | ||
114 | iov.iov_len = len; | ||
115 | |||
116 | serial = atomic_inc_return(&conn->serial); | 124 | serial = atomic_inc_return(&conn->serial); |
117 | pkt.whdr.serial = htonl(serial); | 125 | pkt.whdr.serial = htonl(serial); |
118 | 126 | ||
@@ -127,7 +135,7 @@ static void rxrpc_conn_retransmit_call(struct rxrpc_connection *conn, | |||
127 | break; | 135 | break; |
128 | } | 136 | } |
129 | 137 | ||
130 | kernel_sendmsg(conn->params.local->socket, &msg, &iov, 1, len); | 138 | kernel_sendmsg(conn->params.local->socket, &msg, iov, ioc, len); |
131 | _leave(""); | 139 | _leave(""); |
132 | return; | 140 | return; |
133 | } | 141 | } |
diff --git a/net/rxrpc/conn_object.c b/net/rxrpc/conn_object.c index 1aad04a32d5e..c628351eb900 100644 --- a/net/rxrpc/conn_object.c +++ b/net/rxrpc/conn_object.c | |||
@@ -424,7 +424,7 @@ void rxrpc_service_connection_reaper(struct work_struct *work) | |||
424 | if (earliest != now + MAX_JIFFY_OFFSET) { | 424 | if (earliest != now + MAX_JIFFY_OFFSET) { |
425 | _debug("reschedule reaper %ld", (long)earliest - (long)now); | 425 | _debug("reschedule reaper %ld", (long)earliest - (long)now); |
426 | ASSERT(time_after(earliest, now)); | 426 | ASSERT(time_after(earliest, now)); |
427 | rxrpc_set_service_reap_timer(rxnet, earliest); | 427 | rxrpc_set_service_reap_timer(rxnet, earliest); |
428 | } | 428 | } |
429 | 429 | ||
430 | while (!list_empty(&graveyard)) { | 430 | while (!list_empty(&graveyard)) { |
diff --git a/net/rxrpc/input.c b/net/rxrpc/input.c index 23a5e61d8f79..6fc61400337f 100644 --- a/net/rxrpc/input.c +++ b/net/rxrpc/input.c | |||
@@ -976,7 +976,7 @@ static void rxrpc_input_call_packet(struct rxrpc_call *call, | |||
976 | rxrpc_reduce_call_timer(call, expect_rx_by, now, | 976 | rxrpc_reduce_call_timer(call, expect_rx_by, now, |
977 | rxrpc_timer_set_for_normal); | 977 | rxrpc_timer_set_for_normal); |
978 | } | 978 | } |
979 | 979 | ||
980 | switch (sp->hdr.type) { | 980 | switch (sp->hdr.type) { |
981 | case RXRPC_PACKET_TYPE_DATA: | 981 | case RXRPC_PACKET_TYPE_DATA: |
982 | rxrpc_input_data(call, skb, skew); | 982 | rxrpc_input_data(call, skb, skew); |
@@ -1213,7 +1213,7 @@ void rxrpc_data_ready(struct sock *udp_sk) | |||
1213 | goto reupgrade; | 1213 | goto reupgrade; |
1214 | conn->service_id = sp->hdr.serviceId; | 1214 | conn->service_id = sp->hdr.serviceId; |
1215 | } | 1215 | } |
1216 | 1216 | ||
1217 | if (sp->hdr.callNumber == 0) { | 1217 | if (sp->hdr.callNumber == 0) { |
1218 | /* Connection-level packet */ | 1218 | /* Connection-level packet */ |
1219 | _debug("CONN %p {%d}", conn, conn->debug_id); | 1219 | _debug("CONN %p {%d}", conn, conn->debug_id); |
diff --git a/net/rxrpc/sendmsg.c b/net/rxrpc/sendmsg.c index a1c53ac066a1..09f2a3e05221 100644 --- a/net/rxrpc/sendmsg.c +++ b/net/rxrpc/sendmsg.c | |||
@@ -233,7 +233,7 @@ static void rxrpc_queue_packet(struct rxrpc_sock *rx, struct rxrpc_call *call, | |||
233 | if (resend_at < 1) | 233 | if (resend_at < 1) |
234 | resend_at = 1; | 234 | resend_at = 1; |
235 | 235 | ||
236 | resend_at = now + rxrpc_resend_timeout; | 236 | resend_at += now; |
237 | WRITE_ONCE(call->resend_at, resend_at); | 237 | WRITE_ONCE(call->resend_at, resend_at); |
238 | rxrpc_reduce_call_timer(call, resend_at, now, | 238 | rxrpc_reduce_call_timer(call, resend_at, now, |
239 | rxrpc_timer_set_for_send); | 239 | rxrpc_timer_set_for_send); |