svcrdma: Allocate new transports on device's NUMA node
authorChuck Lever <chuck.lever@oracle.com>
Mon, 5 Jun 2023 13:11:24 +0000 (09:11 -0400)
committerChuck Lever <chuck.lever@oracle.com>
Mon, 12 Jun 2023 16:16:34 +0000 (12:16 -0400)
The physical device's NUMA node ID is available when allocating an
svc_xprt for an incoming connection. Use that value to ensure the
svc_xprt structure is allocated on the NUMA node closest to the
device.

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

index ca04f7a..2abd895 100644 (file)
@@ -64,7 +64,7 @@
 #define RPCDBG_FACILITY        RPCDBG_SVCXPRT
 
 static struct svcxprt_rdma *svc_rdma_create_xprt(struct svc_serv *serv,
-                                                struct net *net);
+                                                struct net *net, int node);
 static struct svc_xprt *svc_rdma_create(struct svc_serv *serv,
                                        struct net *net,
                                        struct sockaddr *sa, int salen,
@@ -123,14 +123,14 @@ static void qp_event_handler(struct ib_event *event, void *context)
 }
 
 static struct svcxprt_rdma *svc_rdma_create_xprt(struct svc_serv *serv,
-                                                struct net *net)
+                                                struct net *net, int node)
 {
-       struct svcxprt_rdma *cma_xprt = kzalloc(sizeof *cma_xprt, GFP_KERNEL);
+       struct svcxprt_rdma *cma_xprt;
 
-       if (!cma_xprt) {
-               dprintk("svcrdma: failed to create new transport\n");
+       cma_xprt = kzalloc_node(sizeof(*cma_xprt), GFP_KERNEL, node);
+       if (!cma_xprt)
                return NULL;
-       }
+
        svc_xprt_init(net, &svc_rdma_class, &cma_xprt->sc_xprt, serv);
        INIT_LIST_HEAD(&cma_xprt->sc_accept_q);
        INIT_LIST_HEAD(&cma_xprt->sc_rq_dto_q);
@@ -193,9 +193,9 @@ static void handle_connect_req(struct rdma_cm_id *new_cma_id,
        struct svcxprt_rdma *newxprt;
        struct sockaddr *sa;
 
-       /* Create a new transport */
        newxprt = svc_rdma_create_xprt(listen_xprt->sc_xprt.xpt_server,
-                                      listen_xprt->sc_xprt.xpt_net);
+                                      listen_xprt->sc_xprt.xpt_net,
+                                      ibdev_to_node(new_cma_id->device));
        if (!newxprt)
                return;
        newxprt->sc_cm_id = new_cma_id;
@@ -304,7 +304,7 @@ static struct svc_xprt *svc_rdma_create(struct svc_serv *serv,
 
        if (sa->sa_family != AF_INET && sa->sa_family != AF_INET6)
                return ERR_PTR(-EAFNOSUPPORT);
-       cma_xprt = svc_rdma_create_xprt(serv, net);
+       cma_xprt = svc_rdma_create_xprt(serv, net, NUMA_NO_NODE);
        if (!cma_xprt)
                return ERR_PTR(-ENOMEM);
        set_bit(XPT_LISTENER, &cma_xprt->sc_xprt.xpt_flags);