Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Conflict resolution of af_smc.c from Stephen Rothwell. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -135,7 +135,7 @@ static int rxrpc_bind(struct socket *sock, struct sockaddr *saddr, int len)
|
||||
struct sockaddr_rxrpc *srx = (struct sockaddr_rxrpc *)saddr;
|
||||
struct rxrpc_local *local;
|
||||
struct rxrpc_sock *rx = rxrpc_sk(sock->sk);
|
||||
u16 service_id = srx->srx_service;
|
||||
u16 service_id;
|
||||
int ret;
|
||||
|
||||
_enter("%p,%p,%d", rx, saddr, len);
|
||||
@@ -143,6 +143,7 @@ static int rxrpc_bind(struct socket *sock, struct sockaddr *saddr, int len)
|
||||
ret = rxrpc_validate_address(rx, srx, len);
|
||||
if (ret < 0)
|
||||
goto error;
|
||||
service_id = srx->srx_service;
|
||||
|
||||
lock_sock(&rx->sk);
|
||||
|
||||
@@ -370,18 +371,22 @@ EXPORT_SYMBOL(rxrpc_kernel_end_call);
|
||||
* rxrpc_kernel_check_life - Check to see whether a call is still alive
|
||||
* @sock: The socket the call is on
|
||||
* @call: The call to check
|
||||
* @_life: Where to store the life value
|
||||
*
|
||||
* Allow a kernel service to find out whether a call is still alive - ie. we're
|
||||
* getting ACKs from the server. Returns a number representing the life state
|
||||
* which can be compared to that returned by a previous call.
|
||||
* getting ACKs from the server. Passes back in *_life a number representing
|
||||
* the life state which can be compared to that returned by a previous call and
|
||||
* return true if the call is still alive.
|
||||
*
|
||||
* If the life state stalls, rxrpc_kernel_probe_life() should be called and
|
||||
* then 2RTT waited.
|
||||
*/
|
||||
u32 rxrpc_kernel_check_life(const struct socket *sock,
|
||||
const struct rxrpc_call *call)
|
||||
bool rxrpc_kernel_check_life(const struct socket *sock,
|
||||
const struct rxrpc_call *call,
|
||||
u32 *_life)
|
||||
{
|
||||
return call->acks_latest;
|
||||
*_life = call->acks_latest;
|
||||
return call->state != RXRPC_CALL_COMPLETE;
|
||||
}
|
||||
EXPORT_SYMBOL(rxrpc_kernel_check_life);
|
||||
|
||||
|
@@ -654,6 +654,7 @@ struct rxrpc_call {
|
||||
u8 ackr_reason; /* reason to ACK */
|
||||
u16 ackr_skew; /* skew on packet being ACK'd */
|
||||
rxrpc_serial_t ackr_serial; /* serial of packet being ACK'd */
|
||||
rxrpc_serial_t ackr_first_seq; /* first sequence number received */
|
||||
rxrpc_seq_t ackr_prev_seq; /* previous sequence number received */
|
||||
rxrpc_seq_t ackr_consumed; /* Highest packet shown consumed */
|
||||
rxrpc_seq_t ackr_seen; /* Highest packet shown seen */
|
||||
|
@@ -153,7 +153,8 @@ static void rxrpc_conn_retransmit_call(struct rxrpc_connection *conn,
|
||||
* pass a connection-level abort onto all calls on that connection
|
||||
*/
|
||||
static void rxrpc_abort_calls(struct rxrpc_connection *conn,
|
||||
enum rxrpc_call_completion compl)
|
||||
enum rxrpc_call_completion compl,
|
||||
rxrpc_serial_t serial)
|
||||
{
|
||||
struct rxrpc_call *call;
|
||||
int i;
|
||||
@@ -173,6 +174,9 @@ static void rxrpc_abort_calls(struct rxrpc_connection *conn,
|
||||
call->call_id, 0,
|
||||
conn->abort_code,
|
||||
conn->error);
|
||||
else
|
||||
trace_rxrpc_rx_abort(call, serial,
|
||||
conn->abort_code);
|
||||
if (rxrpc_set_call_completion(call, compl,
|
||||
conn->abort_code,
|
||||
conn->error))
|
||||
@@ -213,8 +217,6 @@ static int rxrpc_abort_connection(struct rxrpc_connection *conn,
|
||||
conn->state = RXRPC_CONN_LOCALLY_ABORTED;
|
||||
spin_unlock_bh(&conn->state_lock);
|
||||
|
||||
rxrpc_abort_calls(conn, RXRPC_CALL_LOCALLY_ABORTED);
|
||||
|
||||
msg.msg_name = &conn->params.peer->srx.transport;
|
||||
msg.msg_namelen = conn->params.peer->srx.transport_len;
|
||||
msg.msg_control = NULL;
|
||||
@@ -242,6 +244,7 @@ static int rxrpc_abort_connection(struct rxrpc_connection *conn,
|
||||
len = iov[0].iov_len + iov[1].iov_len;
|
||||
|
||||
serial = atomic_inc_return(&conn->serial);
|
||||
rxrpc_abort_calls(conn, RXRPC_CALL_LOCALLY_ABORTED, serial);
|
||||
whdr.serial = htonl(serial);
|
||||
_proto("Tx CONN ABORT %%%u { %d }", serial, conn->abort_code);
|
||||
|
||||
@@ -321,7 +324,7 @@ static int rxrpc_process_event(struct rxrpc_connection *conn,
|
||||
conn->error = -ECONNABORTED;
|
||||
conn->abort_code = abort_code;
|
||||
conn->state = RXRPC_CONN_REMOTELY_ABORTED;
|
||||
rxrpc_abort_calls(conn, RXRPC_CALL_REMOTELY_ABORTED);
|
||||
rxrpc_abort_calls(conn, RXRPC_CALL_REMOTELY_ABORTED, sp->hdr.serial);
|
||||
return -ECONNABORTED;
|
||||
|
||||
case RXRPC_PACKET_TYPE_CHALLENGE:
|
||||
|
@@ -837,7 +837,7 @@ static void rxrpc_input_ack(struct rxrpc_call *call, struct sk_buff *skb,
|
||||
u8 acks[RXRPC_MAXACKS];
|
||||
} buf;
|
||||
rxrpc_serial_t acked_serial;
|
||||
rxrpc_seq_t first_soft_ack, hard_ack;
|
||||
rxrpc_seq_t first_soft_ack, hard_ack, prev_pkt;
|
||||
int nr_acks, offset, ioffset;
|
||||
|
||||
_enter("");
|
||||
@@ -851,13 +851,14 @@ static void rxrpc_input_ack(struct rxrpc_call *call, struct sk_buff *skb,
|
||||
|
||||
acked_serial = ntohl(buf.ack.serial);
|
||||
first_soft_ack = ntohl(buf.ack.firstPacket);
|
||||
prev_pkt = ntohl(buf.ack.previousPacket);
|
||||
hard_ack = first_soft_ack - 1;
|
||||
nr_acks = buf.ack.nAcks;
|
||||
summary.ack_reason = (buf.ack.reason < RXRPC_ACK__INVALID ?
|
||||
buf.ack.reason : RXRPC_ACK__INVALID);
|
||||
|
||||
trace_rxrpc_rx_ack(call, sp->hdr.serial, acked_serial,
|
||||
first_soft_ack, ntohl(buf.ack.previousPacket),
|
||||
first_soft_ack, prev_pkt,
|
||||
summary.ack_reason, nr_acks);
|
||||
|
||||
if (buf.ack.reason == RXRPC_ACK_PING_RESPONSE)
|
||||
@@ -878,8 +879,9 @@ static void rxrpc_input_ack(struct rxrpc_call *call, struct sk_buff *skb,
|
||||
rxrpc_propose_ack_respond_to_ack);
|
||||
}
|
||||
|
||||
/* Discard any out-of-order or duplicate ACKs. */
|
||||
if (before_eq(sp->hdr.serial, call->acks_latest))
|
||||
/* Discard any out-of-order or duplicate ACKs (outside lock). */
|
||||
if (before(first_soft_ack, call->ackr_first_seq) ||
|
||||
before(prev_pkt, call->ackr_prev_seq))
|
||||
return;
|
||||
|
||||
buf.info.rxMTU = 0;
|
||||
@@ -890,12 +892,16 @@ static void rxrpc_input_ack(struct rxrpc_call *call, struct sk_buff *skb,
|
||||
|
||||
spin_lock(&call->input_lock);
|
||||
|
||||
/* Discard any out-of-order or duplicate ACKs. */
|
||||
if (before_eq(sp->hdr.serial, call->acks_latest))
|
||||
/* Discard any out-of-order or duplicate ACKs (inside lock). */
|
||||
if (before(first_soft_ack, call->ackr_first_seq) ||
|
||||
before(prev_pkt, call->ackr_prev_seq))
|
||||
goto out;
|
||||
call->acks_latest_ts = skb->tstamp;
|
||||
call->acks_latest = sp->hdr.serial;
|
||||
|
||||
call->ackr_first_seq = first_soft_ack;
|
||||
call->ackr_prev_seq = prev_pkt;
|
||||
|
||||
/* Parse rwind and mtu sizes if provided. */
|
||||
if (buf.info.rxMTU)
|
||||
rxrpc_input_ackinfo(call, skb, &buf.info);
|
||||
|
@@ -157,6 +157,11 @@ void rxrpc_error_report(struct sock *sk)
|
||||
|
||||
_enter("%p{%d}", sk, local->debug_id);
|
||||
|
||||
/* Clear the outstanding error value on the socket so that it doesn't
|
||||
* cause kernel_sendmsg() to return it later.
|
||||
*/
|
||||
sock_error(sk);
|
||||
|
||||
skb = sock_dequeue_err_skb(sk);
|
||||
if (!skb) {
|
||||
_leave("UDP socket errqueue empty");
|
||||
|
@@ -152,12 +152,13 @@ static void rxrpc_notify_end_tx(struct rxrpc_sock *rx, struct rxrpc_call *call,
|
||||
}
|
||||
|
||||
/*
|
||||
* Queue a DATA packet for transmission, set the resend timeout and send the
|
||||
* packet immediately
|
||||
* Queue a DATA packet for transmission, set the resend timeout and send
|
||||
* the packet immediately. Returns the error from rxrpc_send_data_packet()
|
||||
* in case the caller wants to do something with it.
|
||||
*/
|
||||
static void rxrpc_queue_packet(struct rxrpc_sock *rx, struct rxrpc_call *call,
|
||||
struct sk_buff *skb, bool last,
|
||||
rxrpc_notify_end_tx_t notify_end_tx)
|
||||
static int rxrpc_queue_packet(struct rxrpc_sock *rx, struct rxrpc_call *call,
|
||||
struct sk_buff *skb, bool last,
|
||||
rxrpc_notify_end_tx_t notify_end_tx)
|
||||
{
|
||||
struct rxrpc_skb_priv *sp = rxrpc_skb(skb);
|
||||
unsigned long now;
|
||||
@@ -250,7 +251,8 @@ static void rxrpc_queue_packet(struct rxrpc_sock *rx, struct rxrpc_call *call,
|
||||
|
||||
out:
|
||||
rxrpc_free_skb(skb, rxrpc_skb_tx_freed);
|
||||
_leave("");
|
||||
_leave(" = %d", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -423,9 +425,10 @@ static int rxrpc_send_data(struct rxrpc_sock *rx,
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
|
||||
rxrpc_queue_packet(rx, call, skb,
|
||||
!msg_data_left(msg) && !more,
|
||||
notify_end_tx);
|
||||
ret = rxrpc_queue_packet(rx, call, skb,
|
||||
!msg_data_left(msg) && !more,
|
||||
notify_end_tx);
|
||||
/* Should check for failure here */
|
||||
skb = NULL;
|
||||
}
|
||||
} while (msg_data_left(msg) > 0);
|
||||
|
Reference in New Issue
Block a user