Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 457b4139 authored by David S. Miller's avatar David S. Miller
Browse files

Merge tag 'rxrpc-rewrite-20160907-2' of...

Merge tag 'rxrpc-rewrite-20160907-2' of git://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs



David Howells says:

====================
rxrpc: Local abort tracepoint

Here are two patches.  They need to be applied on top of the just-posted
call refcount overhaul patch:

 (1) Fix the return value of some call completion helpers.

 (2) Add a tracepoint that allows local aborts to be debugged.
====================

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 9103e04b 5a42976d
Loading
Loading
Loading
Loading
+10 −7
Original line number Diff line number Diff line
@@ -377,7 +377,7 @@ int afs_make_call(struct in_addr *addr, struct afs_call *call, gfp_t gfp,
	return wait_mode->wait(call);

error_do_abort:
	rxrpc_kernel_abort_call(afs_socket, rxcall, RX_USER_ABORT);
	rxrpc_kernel_abort_call(afs_socket, rxcall, RX_USER_ABORT, -ret, "KSD");
error_kill_call:
	afs_end_call(call);
	_leave(" = %d", ret);
@@ -425,12 +425,12 @@ static void afs_deliver_to_call(struct afs_call *call)
		case -ENOTCONN:
			abort_code = RX_CALL_DEAD;
			rxrpc_kernel_abort_call(afs_socket, call->rxcall,
						abort_code);
						abort_code, -ret, "KNC");
			goto do_abort;
		case -ENOTSUPP:
			abort_code = RX_INVALID_OPERATION;
			rxrpc_kernel_abort_call(afs_socket, call->rxcall,
						abort_code);
						abort_code, -ret, "KIV");
			goto do_abort;
		case -ENODATA:
		case -EBADMSG:
@@ -440,7 +440,7 @@ static void afs_deliver_to_call(struct afs_call *call)
			if (call->state != AFS_CALL_AWAIT_REPLY)
				abort_code = RXGEN_SS_UNMARSHAL;
			rxrpc_kernel_abort_call(afs_socket, call->rxcall,
						abort_code);
						abort_code, EBADMSG, "KUM");
			goto do_abort;
		}
	}
@@ -463,6 +463,7 @@ static void afs_deliver_to_call(struct afs_call *call)
 */
static int afs_wait_for_call_to_complete(struct afs_call *call)
{
	const char *abort_why;
	int ret;

	DECLARE_WAITQUEUE(myself, current);
@@ -481,9 +482,11 @@ static int afs_wait_for_call_to_complete(struct afs_call *call)
			continue;
		}

		abort_why = "KWC";
		ret = call->error;
		if (call->state == AFS_CALL_COMPLETE)
			break;
		abort_why = "KWI";
		ret = -EINTR;
		if (signal_pending(current))
			break;
@@ -497,7 +500,7 @@ static int afs_wait_for_call_to_complete(struct afs_call *call)
	if (call->state < AFS_CALL_COMPLETE) {
		_debug("call incomplete");
		rxrpc_kernel_abort_call(afs_socket, call->rxcall,
					RX_CALL_DEAD);
					RX_CALL_DEAD, -ret, abort_why);
	}

	_debug("call complete");
@@ -695,7 +698,7 @@ void afs_send_empty_reply(struct afs_call *call)
	case -ENOMEM:
		_debug("oom");
		rxrpc_kernel_abort_call(afs_socket, call->rxcall,
					RX_USER_ABORT);
					RX_USER_ABORT, ENOMEM, "KOO");
	default:
		afs_end_call(call);
		_leave(" [error]");
@@ -734,7 +737,7 @@ void afs_send_simple_reply(struct afs_call *call, const void *buf, size_t len)
	if (n == -ENOMEM) {
		_debug("oom");
		rxrpc_kernel_abort_call(afs_socket, call->rxcall,
					RX_USER_ABORT);
					RX_USER_ABORT, ENOMEM, "KOO");
	}
	afs_end_call(call);
	_leave(" [error]");
+2 −1
Original line number Diff line number Diff line
@@ -35,7 +35,8 @@ int rxrpc_kernel_send_data(struct socket *, struct rxrpc_call *,
			   struct msghdr *, size_t);
int rxrpc_kernel_recv_data(struct socket *, struct rxrpc_call *,
			   void *, size_t, size_t *, bool, u32 *);
void rxrpc_kernel_abort_call(struct socket *, struct rxrpc_call *, u32);
void rxrpc_kernel_abort_call(struct socket *, struct rxrpc_call *,
			     u32, int, const char *);
void rxrpc_kernel_end_call(struct socket *, struct rxrpc_call *);
struct rxrpc_call *rxrpc_kernel_accept_call(struct socket *, unsigned long,
					    rxrpc_notify_rx_t);
+29 −0
Original line number Diff line number Diff line
@@ -84,6 +84,35 @@ TRACE_EVENT(rxrpc_skb,
		      __entry->where)
	    );

TRACE_EVENT(rxrpc_abort,
	    TP_PROTO(const char *why, u32 cid, u32 call_id, rxrpc_seq_t seq,
		     int abort_code, int error),

	    TP_ARGS(why, cid, call_id, seq, abort_code, error),

	    TP_STRUCT__entry(
		    __array(char,			why, 4		)
		    __field(u32,			cid		)
		    __field(u32,			call_id		)
		    __field(rxrpc_seq_t,		seq		)
		    __field(int,			abort_code	)
		    __field(int,			error		)
			     ),

	    TP_fast_assign(
		    memcpy(__entry->why, why, 4);
		    __entry->cid = cid;
		    __entry->call_id = call_id;
		    __entry->abort_code = abort_code;
		    __entry->error = error;
		    __entry->seq = seq;
			   ),

	    TP_printk("%08x:%08x s=%u a=%d e=%d %s",
		      __entry->cid, __entry->call_id, __entry->seq,
		      __entry->abort_code, __entry->error, __entry->why)
	    );

#endif /* _TRACE_RXRPC_H */

/* This part must be outside protection */
+17 −10
Original line number Diff line number Diff line
@@ -155,7 +155,8 @@ struct rxrpc_security {
			     void *);

	/* verify the security on a received packet */
	int (*verify_packet)(struct rxrpc_call *, struct sk_buff *, u32 *);
	int (*verify_packet)(struct rxrpc_call *, struct sk_buff *,
			     rxrpc_seq_t, u16);

	/* issue a challenge */
	int (*issue_challenge)(struct rxrpc_connection *);
@@ -608,7 +609,7 @@ static inline bool rxrpc_set_call_completion(struct rxrpc_call *call,
					     u32 abort_code,
					     int error)
{
	int ret;
	bool ret;

	write_lock_bh(&call->state_lock);
	ret = __rxrpc_set_call_completion(call, compl, abort_code, error);
@@ -619,24 +620,30 @@ static inline bool rxrpc_set_call_completion(struct rxrpc_call *call,
/*
 * Record that a call successfully completed.
 */
static inline void __rxrpc_call_completed(struct rxrpc_call *call)
static inline bool __rxrpc_call_completed(struct rxrpc_call *call)
{
	__rxrpc_set_call_completion(call, RXRPC_CALL_SUCCEEDED, 0, 0);
	return __rxrpc_set_call_completion(call, RXRPC_CALL_SUCCEEDED, 0, 0);
}

static inline void rxrpc_call_completed(struct rxrpc_call *call)
static inline bool rxrpc_call_completed(struct rxrpc_call *call)
{
	bool ret;

	write_lock_bh(&call->state_lock);
	__rxrpc_call_completed(call);
	ret = __rxrpc_call_completed(call);
	write_unlock_bh(&call->state_lock);
	return ret;
}

/*
 * Record that a call is locally aborted.
 */
static inline bool __rxrpc_abort_call(struct rxrpc_call *call,
static inline bool __rxrpc_abort_call(const char *why, struct rxrpc_call *call,
				      rxrpc_seq_t seq,
				      u32 abort_code, int error)
{
	trace_rxrpc_abort(why, call->cid, call->call_id, seq,
			  abort_code, error);
	if (__rxrpc_set_call_completion(call,
					RXRPC_CALL_LOCALLY_ABORTED,
					abort_code, error)) {
@@ -646,13 +653,13 @@ static inline bool __rxrpc_abort_call(struct rxrpc_call *call,
	return false;
}

static inline bool rxrpc_abort_call(struct rxrpc_call *call,
				    u32 abort_code, int error)
static inline bool rxrpc_abort_call(const char *why, struct rxrpc_call *call,
				    rxrpc_seq_t seq, u32 abort_code, int error)
{
	bool ret;

	write_lock_bh(&call->state_lock);
	ret = __rxrpc_abort_call(call, abort_code, error);
	ret = __rxrpc_abort_call(why, call, seq, abort_code, error);
	write_unlock_bh(&call->state_lock);
	return ret;
}
+4 −3
Original line number Diff line number Diff line
@@ -598,7 +598,8 @@ static int rxrpc_process_rx_queue(struct rxrpc_call *call,

		/* secured packets must be verified and possibly decrypted */
		if (call->conn->security->verify_packet(call, skb,
							_abort_code) < 0)
							sp->hdr.seq,
							sp->hdr.cksum) < 0)
			goto protocol_error;

		rxrpc_insert_oos_packet(call, skb);
@@ -982,7 +983,7 @@ void rxrpc_process_call(struct work_struct *work)
	}

	if (test_bit(RXRPC_CALL_EV_LIFE_TIMER, &call->events)) {
		rxrpc_abort_call(call, RX_CALL_TIMEOUT, ETIME);
		rxrpc_abort_call("EXP", call, 0, RX_CALL_TIMEOUT, ETIME);

		_debug("post timeout");
		if (rxrpc_post_message(call, RXRPC_SKB_MARK_LOCAL_ERROR,
@@ -1005,7 +1006,7 @@ void rxrpc_process_call(struct work_struct *work)
		case -EKEYEXPIRED:
		case -EKEYREJECTED:
		case -EPROTO:
			rxrpc_abort_call(call, abort_code, -ret);
			rxrpc_abort_call("PRO", call, 0, abort_code, -ret);
			goto kill_ACKs;
		}
	}
Loading