svcrdma: Optimize svc_rdma_cc_init()
authorChuck Lever <chuck.lever@oracle.com>
Mon, 11 Dec 2023 15:24:15 +0000 (10:24 -0500)
committerChuck Lever <chuck.lever@oracle.com>
Sun, 7 Jan 2024 22:54:32 +0000 (17:54 -0500)
The atomic_inc_return() in svc_rdma_send_cid_init() is expensive.

Some svc_rdma_chunk_ctxt's now reside in long-lived container
structures. They don't need a fresh completion ID for every I/O
operation.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
net/sunrpc/xprtrdma/svc_rdma_recvfrom.c
net/sunrpc/xprtrdma/svc_rdma_rw.c
net/sunrpc/xprtrdma/svc_rdma_sendto.c

index ac6351e292c55cb0a7f69c334f2b66fe1cd16487..38f01652dc6d878d7364324aa5d2a3fd32c753a2 100644 (file)
@@ -123,7 +123,7 @@ svc_rdma_recv_ctxt_alloc(struct svcxprt_rdma *rdma)
        dma_addr_t addr;
        void *buffer;
 
-       ctxt = kmalloc_node(sizeof(*ctxt), GFP_KERNEL, node);
+       ctxt = kzalloc_node(sizeof(*ctxt), GFP_KERNEL, node);
        if (!ctxt)
                goto fail0;
        buffer = kmalloc_node(rdma->sc_max_req_size, GFP_KERNEL, node);
index eab71f3867fa979f056c7ca57572b9d4aabe19b5..ff54bb268b7d24ee777d143242a11e6cd630427c 100644 (file)
@@ -154,7 +154,10 @@ static int svc_rdma_rw_ctx_init(struct svcxprt_rdma *rdma,
 void svc_rdma_cc_init(struct svcxprt_rdma *rdma,
                      struct svc_rdma_chunk_ctxt *cc)
 {
-       svc_rdma_send_cid_init(rdma, &cc->cc_cid);
+       struct rpc_rdma_cid *cid = &cc->cc_cid;
+
+       if (unlikely(!cid->ci_completion_id))
+               svc_rdma_send_cid_init(rdma, cid);
 
        INIT_LIST_HEAD(&cc->cc_rwctxts);
        cc->cc_sqecount = 0;
@@ -221,15 +224,13 @@ svc_rdma_write_info_alloc(struct svcxprt_rdma *rdma,
 {
        struct svc_rdma_write_info *info;
 
-       info = kmalloc_node(sizeof(*info), GFP_KERNEL,
+       info = kzalloc_node(sizeof(*info), GFP_KERNEL,
                            ibdev_to_node(rdma->sc_cm_id->device));
        if (!info)
                return info;
 
        info->wi_rdma = rdma;
        info->wi_chunk = chunk;
-       info->wi_seg_off = 0;
-       info->wi_seg_no = 0;
        svc_rdma_cc_init(rdma, &info->wi_cc);
        info->wi_cc.cc_cqe.done = svc_rdma_write_done;
        return info;
index c9585e469ca83722e6c07d18fb6d72a8bfffbbd4..1a49b7f0204120e9d43c08d2152781b84c907cc4 100644 (file)
@@ -122,7 +122,7 @@ svc_rdma_send_ctxt_alloc(struct svcxprt_rdma *rdma)
        void *buffer;
        int i;
 
-       ctxt = kmalloc_node(struct_size(ctxt, sc_sges, rdma->sc_max_send_sges),
+       ctxt = kzalloc_node(struct_size(ctxt, sc_sges, rdma->sc_max_send_sges),
                            GFP_KERNEL, node);
        if (!ctxt)
                goto fail0;