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

Commit fcda3d5d authored by Trond Myklebust's avatar Trond Myklebust
Browse files

Merge tag 'nfs-rdma-for-4.18-1' of git://git.linux-nfs.org/projects/anna/linux-nfs

NFS-over-RDMA client updates for Linux 4.18

Stable patches:
- xprtrdma: Return -ENOBUFS when no pages are available

New features:
- Add ->alloc_slot() and ->free_slot() functions

Bugfixes and cleanups:
- Add missing SPDX tags to some files
- Try to fail mount quickly if client has no RDMA devices
- Create transport IDs in the correct network namespace
- Fix max_send_wr computation
- Clean up receive tracepoints
- Refactor receive handling
- Remove unused functions
parents 3f0b3cf4 11d0ac16
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
/*
 * Copyright (c) 2015-2017 Oracle. All rights reserved.
 * Copyright (c) 2003-2007 Network Appliance, Inc. All rights reserved.
+5 −1
Original line number Diff line number Diff line
@@ -84,7 +84,6 @@ struct rpc_rqst {
	void (*rq_release_snd_buf)(struct rpc_rqst *); /* release rq_enc_pages */
	struct list_head	rq_list;

	void			*rq_xprtdata;	/* Per-xprt private data */
	void			*rq_buffer;	/* Call XDR encode buffer */
	size_t			rq_callsize;
	void			*rq_rbuffer;	/* Reply XDR decode buffer */
@@ -127,6 +126,8 @@ struct rpc_xprt_ops {
	int		(*reserve_xprt)(struct rpc_xprt *xprt, struct rpc_task *task);
	void		(*release_xprt)(struct rpc_xprt *xprt, struct rpc_task *task);
	void		(*alloc_slot)(struct rpc_xprt *xprt, struct rpc_task *task);
	void		(*free_slot)(struct rpc_xprt *xprt,
				     struct rpc_rqst *req);
	void		(*rpcbind)(struct rpc_task *task);
	void		(*set_port)(struct rpc_xprt *xprt, unsigned short port);
	void		(*connect)(struct rpc_xprt *xprt, struct rpc_task *task);
@@ -324,10 +325,13 @@ struct xprt_class {
struct rpc_xprt		*xprt_create_transport(struct xprt_create *args);
void			xprt_connect(struct rpc_task *task);
void			xprt_reserve(struct rpc_task *task);
void			xprt_request_init(struct rpc_task *task);
void			xprt_retry_reserve(struct rpc_task *task);
int			xprt_reserve_xprt(struct rpc_xprt *xprt, struct rpc_task *task);
int			xprt_reserve_xprt_cong(struct rpc_xprt *xprt, struct rpc_task *task);
void			xprt_alloc_slot(struct rpc_xprt *xprt, struct rpc_task *task);
void			xprt_free_slot(struct rpc_xprt *xprt,
				       struct rpc_rqst *req);
void			xprt_lock_and_alloc_slot(struct rpc_xprt *xprt, struct rpc_task *task);
bool			xprt_prepare_transmit(struct rpc_task *task);
void			xprt_transmit(struct rpc_task *task);
+1 −0
Original line number Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
/*
 * Copyright (c) 2003-2007 Network Appliance, Inc. All rights reserved.
 *
+53 −23
Original line number Diff line number Diff line
@@ -528,24 +528,54 @@ TRACE_EVENT(xprtrdma_post_send,

TRACE_EVENT(xprtrdma_post_recv,
	TP_PROTO(
		const struct rpcrdma_rep *rep,
		const struct ib_cqe *cqe
	),

	TP_ARGS(cqe),

	TP_STRUCT__entry(
		__field(const void *, cqe)
	),

	TP_fast_assign(
		__entry->cqe = cqe;
	),

	TP_printk("cqe=%p",
		__entry->cqe
	)
);

TRACE_EVENT(xprtrdma_post_recvs,
	TP_PROTO(
		const struct rpcrdma_xprt *r_xprt,
		unsigned int count,
		int status
	),

	TP_ARGS(rep, status),
	TP_ARGS(r_xprt, count, status),

	TP_STRUCT__entry(
		__field(const void *, rep)
		__field(const void *, r_xprt)
		__field(unsigned int, count)
		__field(int, status)
		__field(int, posted)
		__string(addr, rpcrdma_addrstr(r_xprt))
		__string(port, rpcrdma_portstr(r_xprt))
	),

	TP_fast_assign(
		__entry->rep = rep;
		__entry->r_xprt = r_xprt;
		__entry->count = count;
		__entry->status = status;
		__entry->posted = r_xprt->rx_buf.rb_posted_receives;
		__assign_str(addr, rpcrdma_addrstr(r_xprt));
		__assign_str(port, rpcrdma_portstr(r_xprt));
	),

	TP_printk("rep=%p status=%d",
		__entry->rep, __entry->status
	TP_printk("peer=[%s]:%s r_xprt=%p: %u new recvs, %d active (rc %d)",
		__get_str(addr), __get_str(port), __entry->r_xprt,
		__entry->count, __entry->posted, __entry->status
	)
);

@@ -584,28 +614,32 @@ TRACE_EVENT(xprtrdma_wc_send,

TRACE_EVENT(xprtrdma_wc_receive,
	TP_PROTO(
		const struct rpcrdma_rep *rep,
		const struct ib_wc *wc
	),

	TP_ARGS(rep, wc),
	TP_ARGS(wc),

	TP_STRUCT__entry(
		__field(const void *, rep)
		__field(unsigned int, byte_len)
		__field(const void *, cqe)
		__field(u32, byte_len)
		__field(unsigned int, status)
		__field(unsigned int, vendor_err)
		__field(u32, vendor_err)
	),

	TP_fast_assign(
		__entry->rep = rep;
		__entry->byte_len = wc->byte_len;
		__entry->cqe = wc->wr_cqe;
		__entry->status = wc->status;
		__entry->vendor_err = __entry->status ? wc->vendor_err : 0;
		if (wc->status) {
			__entry->byte_len = 0;
			__entry->vendor_err = wc->vendor_err;
		} else {
			__entry->byte_len = wc->byte_len;
			__entry->vendor_err = 0;
		}
	),

	TP_printk("rep=%p, %u bytes: %s (%u/0x%x)",
		__entry->rep, __entry->byte_len,
	TP_printk("cqe=%p %u bytes: %s (%u/0x%x)",
		__entry->cqe, __entry->byte_len,
		rdma_show_wc_status(__entry->status),
		__entry->status, __entry->vendor_err
	)
@@ -616,6 +650,7 @@ DEFINE_FRWR_DONE_EVENT(xprtrdma_wc_li);
DEFINE_FRWR_DONE_EVENT(xprtrdma_wc_li_wake);

DEFINE_MR_EVENT(xprtrdma_localinv);
DEFINE_MR_EVENT(xprtrdma_dma_map);
DEFINE_MR_EVENT(xprtrdma_dma_unmap);
DEFINE_MR_EVENT(xprtrdma_remoteinv);
DEFINE_MR_EVENT(xprtrdma_recover_mr);
@@ -799,7 +834,6 @@ TRACE_EVENT(xprtrdma_allocate,
		__field(unsigned int, task_id)
		__field(unsigned int, client_id)
		__field(const void *, req)
		__field(const void *, rep)
		__field(size_t, callsize)
		__field(size_t, rcvsize)
	),
@@ -808,15 +842,13 @@ TRACE_EVENT(xprtrdma_allocate,
		__entry->task_id = task->tk_pid;
		__entry->client_id = task->tk_client->cl_clid;
		__entry->req = req;
		__entry->rep = req ? req->rl_reply : NULL;
		__entry->callsize = task->tk_rqstp->rq_callsize;
		__entry->rcvsize = task->tk_rqstp->rq_rcvsize;
	),

	TP_printk("task:%u@%u req=%p rep=%p (%zu, %zu)",
	TP_printk("task:%u@%u req=%p (%zu, %zu)",
		__entry->task_id, __entry->client_id,
		__entry->req, __entry->rep,
		__entry->callsize, __entry->rcvsize
		__entry->req, __entry->callsize, __entry->rcvsize
	)
);

@@ -848,8 +880,6 @@ TRACE_EVENT(xprtrdma_rpc_done,
	)
);

DEFINE_RXPRT_EVENT(xprtrdma_noreps);

/**
 ** Callback events
 **/
+1 −0
Original line number Diff line number Diff line
@@ -1546,6 +1546,7 @@ call_reserveresult(struct rpc_task *task)
	task->tk_status = 0;
	if (status >= 0) {
		if (task->tk_rqstp) {
			xprt_request_init(task);
			task->tk_action = call_refresh;
			return;
		}
Loading