rpcrdma: Merge svcrdma and xprtrdma modules into one

Bi-directional RPC support means code in svcrdma.ko invokes a bit of
code in xprtrdma.ko, and vice versa. To avoid loader/linker loops,
merge the server and client side modules together into a single
module.

When backchannel capabilities are added, the combined module will
register all needed transport capabilities so that Upper Layer
consumers automatically have everything needed to create a
bi-directional transport connection.

Module aliases are added for backwards compatibility with user
space, which still may expect svcrdma.ko or xprtrdma.ko to be
present.

This commit reverts commit 2e8c12e1b7 ("xprtrdma: add separate
Kconfig options for NFSoRDMA client and server support") and
provides a single CONFIG option for enabling the new module.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
This commit is contained in:
Chuck Lever 2015-06-04 11:21:42 -04:00 committed by J. Bruce Fields
parent 0380a3f375
commit ffe1f0df58
7 changed files with 69 additions and 48 deletions

View File

@ -48,28 +48,16 @@ config SUNRPC_DEBUG
If unsure, say Y. If unsure, say Y.
config SUNRPC_XPRT_RDMA_CLIENT config SUNRPC_XPRT_RDMA
tristate "RPC over RDMA Client Support" tristate "RPC-over-RDMA transport"
depends on SUNRPC && INFINIBAND && INFINIBAND_ADDR_TRANS depends on SUNRPC && INFINIBAND && INFINIBAND_ADDR_TRANS
default SUNRPC && INFINIBAND default SUNRPC && INFINIBAND
help help
This option allows the NFS client to support an RDMA-enabled This option allows the NFS client and server to use RDMA
transport. transports (InfiniBand, iWARP, or RoCE).
To compile RPC client RDMA transport support as a module, To compile this support as a module, choose M. The module
choose M here: the module will be called xprtrdma. will be called rpcrdma.ko.
If unsure, say N. If unsure, or you know there is no RDMA capability on your
hardware platform, say N.
config SUNRPC_XPRT_RDMA_SERVER
tristate "RPC over RDMA Server Support"
depends on SUNRPC && INFINIBAND && INFINIBAND_ADDR_TRANS
default SUNRPC && INFINIBAND
help
This option allows the NFS server to support an RDMA-enabled
transport.
To compile RPC server RDMA transport support as a module,
choose M here: the module will be called svcrdma.
If unsure, say N.

View File

@ -5,8 +5,7 @@
obj-$(CONFIG_SUNRPC) += sunrpc.o obj-$(CONFIG_SUNRPC) += sunrpc.o
obj-$(CONFIG_SUNRPC_GSS) += auth_gss/ obj-$(CONFIG_SUNRPC_GSS) += auth_gss/
obj-$(CONFIG_SUNRPC_XPRT_RDMA) += xprtrdma/
obj-y += xprtrdma/
sunrpc-y := clnt.o xprt.o socklib.o xprtsock.o sched.o \ sunrpc-y := clnt.o xprt.o socklib.o xprtsock.o sched.o \
auth.o auth_null.o auth_unix.o auth_generic.o \ auth.o auth_null.o auth_unix.o auth_generic.o \

View File

@ -1,9 +1,7 @@
obj-$(CONFIG_SUNRPC_XPRT_RDMA_CLIENT) += xprtrdma.o obj-$(CONFIG_SUNRPC_XPRT_RDMA) += rpcrdma.o
xprtrdma-y := transport.o rpc_rdma.o verbs.o \ rpcrdma-y := transport.o rpc_rdma.o verbs.o \
fmr_ops.o frwr_ops.o physical_ops.o fmr_ops.o frwr_ops.o physical_ops.o \
svc_rdma.o svc_rdma_transport.o \
obj-$(CONFIG_SUNRPC_XPRT_RDMA_SERVER) += svcrdma.o svc_rdma_marshal.o svc_rdma_sendto.o svc_rdma_recvfrom.o \
module.o
svcrdma-y := svc_rdma.o svc_rdma_transport.o \
svc_rdma_marshal.o svc_rdma_sendto.o svc_rdma_recvfrom.o

View File

@ -0,0 +1,46 @@
/*
* Copyright (c) 2015 Oracle. All rights reserved.
*/
/* rpcrdma.ko module initialization
*/
#include <linux/module.h>
#include <linux/init.h>
#include <linux/sunrpc/svc_rdma.h>
#include "xprt_rdma.h"
#if IS_ENABLED(CONFIG_SUNRPC_DEBUG)
# define RPCDBG_FACILITY RPCDBG_TRANS
#endif
MODULE_AUTHOR("Open Grid Computing and Network Appliance, Inc.");
MODULE_DESCRIPTION("RPC/RDMA Transport");
MODULE_LICENSE("Dual BSD/GPL");
MODULE_ALIAS("svcrdma");
MODULE_ALIAS("xprtrdma");
static void __exit rpc_rdma_cleanup(void)
{
xprt_rdma_cleanup();
svc_rdma_cleanup();
}
static int __init rpc_rdma_init(void)
{
int rc;
rc = svc_rdma_init();
if (rc)
goto out;
rc = xprt_rdma_init();
if (rc)
svc_rdma_cleanup();
out:
return rc;
}
module_init(rpc_rdma_init);
module_exit(rpc_rdma_cleanup);

View File

@ -38,8 +38,7 @@
* *
* Author: Tom Tucker <tom@opengridcomputing.com> * Author: Tom Tucker <tom@opengridcomputing.com>
*/ */
#include <linux/module.h>
#include <linux/init.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/fs.h> #include <linux/fs.h>
#include <linux/sysctl.h> #include <linux/sysctl.h>
@ -295,8 +294,3 @@ int svc_rdma_init(void)
destroy_workqueue(svc_rdma_wq); destroy_workqueue(svc_rdma_wq);
return -ENOMEM; return -ENOMEM;
} }
MODULE_AUTHOR("Tom Tucker <tom@opengridcomputing.com>");
MODULE_DESCRIPTION("SVC RDMA Transport");
MODULE_LICENSE("Dual BSD/GPL");
module_init(svc_rdma_init);
module_exit(svc_rdma_cleanup);

View File

@ -48,7 +48,6 @@
*/ */
#include <linux/module.h> #include <linux/module.h>
#include <linux/init.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/seq_file.h> #include <linux/seq_file.h>
#include <linux/sunrpc/addr.h> #include <linux/sunrpc/addr.h>
@ -59,11 +58,6 @@
# define RPCDBG_FACILITY RPCDBG_TRANS # define RPCDBG_FACILITY RPCDBG_TRANS
#endif #endif
MODULE_LICENSE("Dual BSD/GPL");
MODULE_DESCRIPTION("RPC/RDMA Transport for Linux kernel NFS");
MODULE_AUTHOR("Network Appliance, Inc.");
/* /*
* tunables * tunables
*/ */
@ -711,7 +705,7 @@ static struct xprt_class xprt_rdma = {
.setup = xprt_setup_rdma, .setup = xprt_setup_rdma,
}; };
static void __exit xprt_rdma_cleanup(void) void xprt_rdma_cleanup(void)
{ {
int rc; int rc;
@ -728,7 +722,7 @@ static void __exit xprt_rdma_cleanup(void)
__func__, rc); __func__, rc);
} }
static int __init xprt_rdma_init(void) int xprt_rdma_init(void)
{ {
int rc; int rc;
@ -753,6 +747,3 @@ static int __init xprt_rdma_init(void)
#endif #endif
return 0; return 0;
} }
module_init(xprt_rdma_init);
module_exit(xprt_rdma_cleanup);

View File

@ -480,6 +480,11 @@ void rpcrdma_reply_handler(struct rpcrdma_rep *);
*/ */
int rpcrdma_marshal_req(struct rpc_rqst *); int rpcrdma_marshal_req(struct rpc_rqst *);
/* RPC/RDMA module init - xprtrdma/transport.c
*/
int xprt_rdma_init(void);
void xprt_rdma_cleanup(void);
/* Temporary NFS request map cache. Created in svc_rdma.c */ /* Temporary NFS request map cache. Created in svc_rdma.c */
extern struct kmem_cache *svc_rdma_map_cachep; extern struct kmem_cache *svc_rdma_map_cachep;
/* WR context cache. Created in svc_rdma.c */ /* WR context cache. Created in svc_rdma.c */