Skip to content

Commit fcda3d5

Browse files
author
Trond Myklebust
committed
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
2 parents 3f0b3cf + 11d0ac1 commit fcda3d5

File tree

16 files changed

+359
-355
lines changed

16 files changed

+359
-355
lines changed

include/linux/sunrpc/rpc_rdma.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
12
/*
23
* Copyright (c) 2015-2017 Oracle. All rights reserved.
34
* Copyright (c) 2003-2007 Network Appliance, Inc. All rights reserved.

include/linux/sunrpc/xprt.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,6 @@ struct rpc_rqst {
8484
void (*rq_release_snd_buf)(struct rpc_rqst *); /* release rq_enc_pages */
8585
struct list_head rq_list;
8686

87-
void *rq_xprtdata; /* Per-xprt private data */
8887
void *rq_buffer; /* Call XDR encode buffer */
8988
size_t rq_callsize;
9089
void *rq_rbuffer; /* Reply XDR decode buffer */
@@ -127,6 +126,8 @@ struct rpc_xprt_ops {
127126
int (*reserve_xprt)(struct rpc_xprt *xprt, struct rpc_task *task);
128127
void (*release_xprt)(struct rpc_xprt *xprt, struct rpc_task *task);
129128
void (*alloc_slot)(struct rpc_xprt *xprt, struct rpc_task *task);
129+
void (*free_slot)(struct rpc_xprt *xprt,
130+
struct rpc_rqst *req);
130131
void (*rpcbind)(struct rpc_task *task);
131132
void (*set_port)(struct rpc_xprt *xprt, unsigned short port);
132133
void (*connect)(struct rpc_xprt *xprt, struct rpc_task *task);
@@ -324,10 +325,13 @@ struct xprt_class {
324325
struct rpc_xprt *xprt_create_transport(struct xprt_create *args);
325326
void xprt_connect(struct rpc_task *task);
326327
void xprt_reserve(struct rpc_task *task);
328+
void xprt_request_init(struct rpc_task *task);
327329
void xprt_retry_reserve(struct rpc_task *task);
328330
int xprt_reserve_xprt(struct rpc_xprt *xprt, struct rpc_task *task);
329331
int xprt_reserve_xprt_cong(struct rpc_xprt *xprt, struct rpc_task *task);
330332
void xprt_alloc_slot(struct rpc_xprt *xprt, struct rpc_task *task);
333+
void xprt_free_slot(struct rpc_xprt *xprt,
334+
struct rpc_rqst *req);
331335
void xprt_lock_and_alloc_slot(struct rpc_xprt *xprt, struct rpc_task *task);
332336
bool xprt_prepare_transmit(struct rpc_task *task);
333337
void xprt_transmit(struct rpc_task *task);

include/linux/sunrpc/xprtrdma.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
12
/*
23
* Copyright (c) 2003-2007 Network Appliance, Inc. All rights reserved.
34
*

include/trace/events/rpcrdma.h

Lines changed: 53 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -528,24 +528,54 @@ TRACE_EVENT(xprtrdma_post_send,
528528

529529
TRACE_EVENT(xprtrdma_post_recv,
530530
TP_PROTO(
531-
const struct rpcrdma_rep *rep,
531+
const struct ib_cqe *cqe
532+
),
533+
534+
TP_ARGS(cqe),
535+
536+
TP_STRUCT__entry(
537+
__field(const void *, cqe)
538+
),
539+
540+
TP_fast_assign(
541+
__entry->cqe = cqe;
542+
),
543+
544+
TP_printk("cqe=%p",
545+
__entry->cqe
546+
)
547+
);
548+
549+
TRACE_EVENT(xprtrdma_post_recvs,
550+
TP_PROTO(
551+
const struct rpcrdma_xprt *r_xprt,
552+
unsigned int count,
532553
int status
533554
),
534555

535-
TP_ARGS(rep, status),
556+
TP_ARGS(r_xprt, count, status),
536557

537558
TP_STRUCT__entry(
538-
__field(const void *, rep)
559+
__field(const void *, r_xprt)
560+
__field(unsigned int, count)
539561
__field(int, status)
562+
__field(int, posted)
563+
__string(addr, rpcrdma_addrstr(r_xprt))
564+
__string(port, rpcrdma_portstr(r_xprt))
540565
),
541566

542567
TP_fast_assign(
543-
__entry->rep = rep;
568+
__entry->r_xprt = r_xprt;
569+
__entry->count = count;
544570
__entry->status = status;
571+
__entry->posted = r_xprt->rx_buf.rb_posted_receives;
572+
__assign_str(addr, rpcrdma_addrstr(r_xprt));
573+
__assign_str(port, rpcrdma_portstr(r_xprt));
545574
),
546575

547-
TP_printk("rep=%p status=%d",
548-
__entry->rep, __entry->status
576+
TP_printk("peer=[%s]:%s r_xprt=%p: %u new recvs, %d active (rc %d)",
577+
__get_str(addr), __get_str(port), __entry->r_xprt,
578+
__entry->count, __entry->posted, __entry->status
549579
)
550580
);
551581

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

585615
TRACE_EVENT(xprtrdma_wc_receive,
586616
TP_PROTO(
587-
const struct rpcrdma_rep *rep,
588617
const struct ib_wc *wc
589618
),
590619

591-
TP_ARGS(rep, wc),
620+
TP_ARGS(wc),
592621

593622
TP_STRUCT__entry(
594-
__field(const void *, rep)
595-
__field(unsigned int, byte_len)
623+
__field(const void *, cqe)
624+
__field(u32, byte_len)
596625
__field(unsigned int, status)
597-
__field(unsigned int, vendor_err)
626+
__field(u32, vendor_err)
598627
),
599628

600629
TP_fast_assign(
601-
__entry->rep = rep;
602-
__entry->byte_len = wc->byte_len;
630+
__entry->cqe = wc->wr_cqe;
603631
__entry->status = wc->status;
604-
__entry->vendor_err = __entry->status ? wc->vendor_err : 0;
632+
if (wc->status) {
633+
__entry->byte_len = 0;
634+
__entry->vendor_err = wc->vendor_err;
635+
} else {
636+
__entry->byte_len = wc->byte_len;
637+
__entry->vendor_err = 0;
638+
}
605639
),
606640

607-
TP_printk("rep=%p, %u bytes: %s (%u/0x%x)",
608-
__entry->rep, __entry->byte_len,
641+
TP_printk("cqe=%p %u bytes: %s (%u/0x%x)",
642+
__entry->cqe, __entry->byte_len,
609643
rdma_show_wc_status(__entry->status),
610644
__entry->status, __entry->vendor_err
611645
)
@@ -616,6 +650,7 @@ DEFINE_FRWR_DONE_EVENT(xprtrdma_wc_li);
616650
DEFINE_FRWR_DONE_EVENT(xprtrdma_wc_li_wake);
617651

618652
DEFINE_MR_EVENT(xprtrdma_localinv);
653+
DEFINE_MR_EVENT(xprtrdma_dma_map);
619654
DEFINE_MR_EVENT(xprtrdma_dma_unmap);
620655
DEFINE_MR_EVENT(xprtrdma_remoteinv);
621656
DEFINE_MR_EVENT(xprtrdma_recover_mr);
@@ -799,7 +834,6 @@ TRACE_EVENT(xprtrdma_allocate,
799834
__field(unsigned int, task_id)
800835
__field(unsigned int, client_id)
801836
__field(const void *, req)
802-
__field(const void *, rep)
803837
__field(size_t, callsize)
804838
__field(size_t, rcvsize)
805839
),
@@ -808,15 +842,13 @@ TRACE_EVENT(xprtrdma_allocate,
808842
__entry->task_id = task->tk_pid;
809843
__entry->client_id = task->tk_client->cl_clid;
810844
__entry->req = req;
811-
__entry->rep = req ? req->rl_reply : NULL;
812845
__entry->callsize = task->tk_rqstp->rq_callsize;
813846
__entry->rcvsize = task->tk_rqstp->rq_rcvsize;
814847
),
815848

816-
TP_printk("task:%u@%u req=%p rep=%p (%zu, %zu)",
849+
TP_printk("task:%u@%u req=%p (%zu, %zu)",
817850
__entry->task_id, __entry->client_id,
818-
__entry->req, __entry->rep,
819-
__entry->callsize, __entry->rcvsize
851+
__entry->req, __entry->callsize, __entry->rcvsize
820852
)
821853
);
822854

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

851-
DEFINE_RXPRT_EVENT(xprtrdma_noreps);
852-
853883
/**
854884
** Callback events
855885
**/

net/sunrpc/clnt.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1546,6 +1546,7 @@ call_reserveresult(struct rpc_task *task)
15461546
task->tk_status = 0;
15471547
if (status >= 0) {
15481548
if (task->tk_rqstp) {
1549+
xprt_request_init(task);
15491550
task->tk_action = call_refresh;
15501551
return;
15511552
}

net/sunrpc/xprt.c

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@
6666
* Local functions
6767
*/
6868
static void xprt_init(struct rpc_xprt *xprt, struct net *net);
69-
static void xprt_request_init(struct rpc_task *, struct rpc_xprt *);
69+
static __be32 xprt_alloc_xid(struct rpc_xprt *xprt);
7070
static void xprt_connect_status(struct rpc_task *task);
7171
static int __xprt_get_cong(struct rpc_xprt *, struct rpc_task *);
7272
static void __xprt_put_cong(struct rpc_xprt *, struct rpc_rqst *);
@@ -987,6 +987,8 @@ bool xprt_prepare_transmit(struct rpc_task *task)
987987
task->tk_status = -EAGAIN;
988988
goto out_unlock;
989989
}
990+
if (!bc_prealloc(req) && !req->rq_xmit_bytes_sent)
991+
req->rq_xid = xprt_alloc_xid(xprt);
990992
ret = true;
991993
out_unlock:
992994
spin_unlock_bh(&xprt->transport_lock);
@@ -1163,10 +1165,10 @@ void xprt_alloc_slot(struct rpc_xprt *xprt, struct rpc_task *task)
11631165
out_init_req:
11641166
xprt->stat.max_slots = max_t(unsigned int, xprt->stat.max_slots,
11651167
xprt->num_reqs);
1168+
spin_unlock(&xprt->reserve_lock);
1169+
11661170
task->tk_status = 0;
11671171
task->tk_rqstp = req;
1168-
xprt_request_init(task, xprt);
1169-
spin_unlock(&xprt->reserve_lock);
11701172
}
11711173
EXPORT_SYMBOL_GPL(xprt_alloc_slot);
11721174

@@ -1184,7 +1186,7 @@ void xprt_lock_and_alloc_slot(struct rpc_xprt *xprt, struct rpc_task *task)
11841186
}
11851187
EXPORT_SYMBOL_GPL(xprt_lock_and_alloc_slot);
11861188

1187-
static void xprt_free_slot(struct rpc_xprt *xprt, struct rpc_rqst *req)
1189+
void xprt_free_slot(struct rpc_xprt *xprt, struct rpc_rqst *req)
11881190
{
11891191
spin_lock(&xprt->reserve_lock);
11901192
if (!xprt_dynamic_free_slot(xprt, req)) {
@@ -1194,6 +1196,7 @@ static void xprt_free_slot(struct rpc_xprt *xprt, struct rpc_rqst *req)
11941196
xprt_wake_up_backlog(xprt);
11951197
spin_unlock(&xprt->reserve_lock);
11961198
}
1199+
EXPORT_SYMBOL_GPL(xprt_free_slot);
11971200

11981201
static void xprt_free_all_slots(struct rpc_xprt *xprt)
11991202
{
@@ -1303,16 +1306,16 @@ static inline void xprt_init_xid(struct rpc_xprt *xprt)
13031306
xprt->xid = prandom_u32();
13041307
}
13051308

1306-
static void xprt_request_init(struct rpc_task *task, struct rpc_xprt *xprt)
1309+
void xprt_request_init(struct rpc_task *task)
13071310
{
1311+
struct rpc_xprt *xprt = task->tk_xprt;
13081312
struct rpc_rqst *req = task->tk_rqstp;
13091313

13101314
INIT_LIST_HEAD(&req->rq_list);
13111315
req->rq_timeout = task->tk_client->cl_timeout->to_initval;
13121316
req->rq_task = task;
13131317
req->rq_xprt = xprt;
13141318
req->rq_buffer = NULL;
1315-
req->rq_xid = xprt_alloc_xid(xprt);
13161319
req->rq_connect_cookie = xprt->connect_cookie - 1;
13171320
req->rq_bytes_sent = 0;
13181321
req->rq_snd_buf.len = 0;
@@ -1373,7 +1376,7 @@ void xprt_release(struct rpc_task *task)
13731376

13741377
dprintk("RPC: %5u release request %p\n", task->tk_pid, req);
13751378
if (likely(!bc_prealloc(req)))
1376-
xprt_free_slot(xprt, req);
1379+
xprt->ops->free_slot(xprt, req);
13771380
else
13781381
xprt_free_bc_request(req);
13791382
}

0 commit comments

Comments
 (0)