aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2017-11-30 10:07:34 -0500
committerDavid S. Miller <davem@davemloft.net>2017-11-30 10:07:34 -0500
commit6c9257a708883bbafa0971eb985cd266d46db0eb (patch)
tree8ce7db1fc9fc0d14aa923f3f2a848ffc990fe4cb
parent1c08ac0c4bd8e9d66c4dde29bc496c3b430dd028 (diff)
parent282ef4729195c8503f7101d574acfb5e7c8a8209 (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.c4
-rw-r--r--net/rxrpc/conn_event.c50
-rw-r--r--net/rxrpc/conn_object.c2
-rw-r--r--net/rxrpc/input.c4
-rw-r--r--net/rxrpc/sendmsg.c2
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);