sunrpc: Create sockets in namespaces
Subsystems (4)
v3 cover sunrpc: Create sockets in namespaces
v3 changes:
Moved the generic xprt alloc/free code to xprt.c.
Got David's ack on the 8th patch :)
v2 changes:
Fixed comments from Chuck and Trond.
Added one patch, that factors out rpc_xprt allocation as well.
v1:
This set implements pulling the net * argument down to the existing sock_create_kern calls in the sunrpc layer and creating the sockets in the given net.
Thanks,
Pavel
PATCH v3 1/9 sunrpc: Factor out rpc_xprt allocation
--- include/linux/sunrpc/xprt.h | 1 + net/sunrpc/xprt.c | 22 ++++++++++++++++++++++ net/sunrpc/xprtrdma/transport.c | 13 ++----------- net/sunrpc/xprtsock.c | 15 +++------------ 4 files changed, 28 insertions(+), 23 deletions(-)
include/linux/sunrpc/xprt.h +1 -0
@@ -280,6 +280,7 @@ void xprt_release_xprt_cong(struct rpc_xprt *xprt, struct rpc_task *task);void xprt_release (struct rpc_task *task);struct rpc_xprt *xprt_get (struct rpc_xprt *xprt);void xprt_put (struct rpc_xprt *xprt); +struct rpc_xprt *xprt_alloc (int size,int max_req);static inline __be32 *xprt_skip_transport_header (struct rpc_xprt *xprt,__be32 *p) {
net/sunrpc/xprt.c +22 -0
@@ -962,6 +962,28 @@ static void xprt_free_slot(struct rpc_xprt *xprt, struct rpc_rqst *req)spin_unlock (&xprt->reserve_lock); } +struct rpc_xprt *xprt_alloc (int size,int max_req) +{ +struct rpc_xprt *xprt; + + xprt =kzalloc (size,GFP_KERNEL ); +if (xprt ==NULL ) + goto out; + + xprt->max_reqs = max_req; + xprt->slot =kcalloc (max_req,sizeof (struct rpc_rqst ),GFP_KERNEL ); +if (xprt->slot ==NULL ) + goto out_free; + +return xprt; + +out_free: +kfree (xprt); +out: +return NULL ; +} +EXPORT_SYMBOL_GPL (xprt_alloc); +/** * xprt_reserve - allocate an RPC request slot * @task: RPC task requesting a slot allocation
net/sunrpc/xprtrdma/transport.c +2 -11
@@ -285,23 +285,14 @@ xprt_setup_rdma(struct xprt_create *args)return ERR_PTR (-EBADF ); } - xprt =kzalloc (sizeof (struct rpcrdma_xprt ),GFP_KERNEL ); + xprt =xprt_alloc (sizeof (struct rpcrdma_xprt ), + xprt_rdma_slot_table_entries);if (xprt ==NULL ) {dprintk ("RPC: %s: couldn't allocate rpcrdma_xprt\n" , __func__);return ERR_PTR (-ENOMEM ); } - xprt->max_reqs = xprt_rdma_slot_table_entries; - xprt->slot =kcalloc (xprt->max_reqs, -sizeof (struct rpc_rqst ),GFP_KERNEL ); -if (xprt->slot ==NULL ) { -dprintk ("RPC: %s: couldn't allocate %d slots\n" , - __func__, xprt->max_reqs); -kfree (xprt); -return ERR_PTR (-ENOMEM ); - } -/* 60 second timeout, no retries */ xprt->timeout = &xprt_rdma_default_timeout; xprt->bind_timeout = (60U *HZ );
net/sunrpc/xprtsock.c +3 -12
@@ -2273,23 +2273,14 @@ static struct rpc_xprt *xs_setup_xprt(struct xprt_create *args,return ERR_PTR (-EBADF ); } - new =kzalloc (sizeof (*new),GFP_KERNEL ); -if (new ==NULL ) { + xprt =xprt_alloc (sizeof (*new), slot_table_size); +if (xprt ==NULL ) {dprintk ("RPC: xs_setup_xprt: couldn't allocate " "rpc_xprt\n" );return ERR_PTR (-ENOMEM ); } - xprt = &new->xprt; - - xprt->max_reqs = slot_table_size; - xprt->slot =kcalloc (xprt->max_reqs,sizeof (struct rpc_rqst ),GFP_KERNEL ); -if (xprt->slot ==NULL ) { -kfree (xprt); -dprintk ("RPC: xs_setup_xprt: couldn't allocate slot " -"table\n" ); -return ERR_PTR (-ENOMEM ); - } + new = container_of(xprt, struct sock_xprt, xprt);memcpy (&xprt->addr, args->dstaddr, args->addrlen); xprt->addrlen = args->addrlen;if (args->srcaddr)
Signature · 1 line
1.5.5.6
PATCH v3 2/9 sunrpc: Factor out rpc_xprt freeing
In reply to Pavel Emelyanov--- include/linux/sunrpc/xprt.h | 1 + net/sunrpc/xprt.c | 7 +++++++ net/sunrpc/xprtrdma/transport.c | 7 ++----- net/sunrpc/xprtsock.c | 12 ++++-------- 4 files changed, 14 insertions(+), 13 deletions(-)
include/linux/sunrpc/xprt.h +1 -0
@@ -281,6 +281,7 @@ void xprt_release(struct rpc_task *task);struct rpc_xprt *xprt_get (struct rpc_xprt *xprt);void xprt_put (struct rpc_xprt *xprt);struct rpc_xprt *xprt_alloc (int size,int max_req); +void xprt_free (struct rpc_xprt *);static inline __be32 *xprt_skip_transport_header (struct rpc_xprt *xprt,__be32 *p) {
net/sunrpc/xprt.c +7 -0
@@ -984,6 +984,13 @@ out: }EXPORT_SYMBOL_GPL (xprt_alloc); +void xprt_free (struct rpc_xprt *xprt) +{ +kfree (xprt->slot); +kfree (xprt); +} +EXPORT_SYMBOL_GPL (xprt_free); +/** * xprt_reserve - allocate an RPC request slot * @task: RPC task requesting a slot allocation
net/sunrpc/xprtrdma/transport.c +2 -5
@@ -251,9 +251,7 @@ xprt_rdma_destroy(struct rpc_xprt *xprt)xprt_rdma_free_addresses (xprt); -kfree (xprt->slot); - xprt->slot =NULL ; -kfree (xprt); +xprt_free (xprt);dprintk ("RPC: %s: returning\n" , __func__);
@@ -401,8 +399,7 @@ out3: out2:rpcrdma_ia_close (&new_xprt->rx_ia); out1: -kfree (xprt->slot); -kfree (xprt); +xprt_free (xprt);return ERR_PTR (rc); }
net/sunrpc/xprtsock.c +4 -8
@@ -774,8 +774,7 @@ static void xs_destroy(struct rpc_xprt *xprt)xs_close (xprt);xs_free_peer_addresses (xprt); -kfree (xprt->slot); -kfree (xprt); +xprt_free (xprt);module_put (THIS_MODULE ); }
@@ -2362,8 +2361,7 @@ static struct rpc_xprt *xs_setup_udp(struct xprt_create *args)return xprt; ret =ERR_PTR (-EINVAL ); out_err: -kfree (xprt->slot); -kfree (xprt); +xprt_free (xprt);return ret; }
@@ -2438,8 +2436,7 @@ static struct rpc_xprt *xs_setup_tcp(struct xprt_create *args)return xprt; ret =ERR_PTR (-EINVAL ); out_err: -kfree (xprt->slot); -kfree (xprt); +xprt_free (xprt);return ret; }
@@ -2519,8 +2516,7 @@ static struct rpc_xprt *xs_setup_bc_tcp(struct xprt_create *args)return xprt; ret =ERR_PTR (-EINVAL ); out_err: -kfree (xprt->slot); -kfree (xprt); +xprt_free (xprt);return ret; }
Signature · 1 line
1.5.5.6
PATCH v3 3/9 sunrpc: Add net argument to svc_create_xprt
In reply to Pavel Emelyanov--- fs/lockd/svc.c | 2 +- fs/nfs/callback.c | 4 ++-- fs/nfsd/nfsctl.c | 4 ++-- fs/nfsd/nfssvc.c | 5 +++-- include/linux/sunrpc/svc_xprt.h | 4 ++-- net/sunrpc/svc_xprt.c | 4 ++-- 6 files changed, 12 insertions(+), 11 deletions(-)
fs/lockd/svc.c +1 -1
@@ -206,7 +206,7 @@ static int create_lockd_listener(struct svc_serv *serv, const char *name, xprt =svc_find_xprt (serv, name, family,0 );if (xprt ==NULL ) -return svc_create_xprt (serv, name, family, port, +return svc_create_xprt (serv, name, &init_net, family, port,SVC_SOCK_DEFAULTS );svc_xprt_put (xprt);return 0 ;
fs/nfs/callback.c +2 -2
@@ -109,7 +109,7 @@ nfs4_callback_up(struct svc_serv *serv) {int ret; - ret =svc_create_xprt (serv,"tcp" ,PF_INET , + ret =svc_create_xprt (serv,"tcp" , &init_net,PF_INET , nfs_callback_set_tcpport,SVC_SOCK_ANONYMOUS );if (ret <=0 ) goto out_err;
@@ -117,7 +117,7 @@ nfs4_callback_up(struct svc_serv *serv)dprintk ("NFS: Callback listener port = %u (af %u)\n" , nfs_callback_tcpport,PF_INET ); - ret =svc_create_xprt (serv,"tcp" ,PF_INET6 , + ret =svc_create_xprt (serv,"tcp" , &init_net,PF_INET6 , nfs_callback_set_tcpport,SVC_SOCK_ANONYMOUS );if (ret >0 ) { nfs_callback_tcpport6 = ret;
fs/nfsd/nfsctl.c +2 -2
@@ -1015,12 +1015,12 @@ static ssize_t __write_ports_addxprt(char *buf)if (err !=0 )return err; - err =svc_create_xprt (nfsd_serv, transport, + err =svc_create_xprt (nfsd_serv, transport, &init_net,PF_INET , port,SVC_SOCK_ANONYMOUS );if (err <0 ) goto out_err; - err =svc_create_xprt (nfsd_serv, transport, + err =svc_create_xprt (nfsd_serv, transport, &init_net,PF_INET6 , port,SVC_SOCK_ANONYMOUS );if (err <0 && err != -EAFNOSUPPORT ) goto out_close;
fs/nfsd/nfssvc.c +3 -2
@@ -16,6 +16,7 @@#include <linux/lockd/bind.h> #include <linux/nfsacl.h> #include <linux/seq_file.h> +#include <net/net_namespace.h> #include "nfsd.h" #include "cache.h" #include "vfs.h"
@@ -186,12 +187,12 @@ static int nfsd_init_socks(int port)if (!list_empty (&nfsd_serv->sv_permsocks))return 0 ; - error =svc_create_xprt (nfsd_serv,"udp" ,PF_INET , port, + error =svc_create_xprt (nfsd_serv,"udp" , &init_net,PF_INET , port,SVC_SOCK_DEFAULTS );if (error <0 )return error; - error =svc_create_xprt (nfsd_serv,"tcp" ,PF_INET , port, + error =svc_create_xprt (nfsd_serv,"tcp" , &init_net,PF_INET , port,SVC_SOCK_DEFAULTS );if (error <0 )return error;
include/linux/sunrpc/svc_xprt.h +2 -2
@@ -74,8 +74,8 @@ int svc_reg_xprt_class(struct svc_xprt_class *);void svc_unreg_xprt_class (struct svc_xprt_class *);void svc_xprt_init (struct svc_xprt_class *,struct svc_xprt *,struct svc_serv *); -int svc_create_xprt (struct svc_serv *,const char *,const int , -const unsigned short ,int ); +int svc_create_xprt (struct svc_serv *,const char *,struct net *, +const int ,const unsigned short ,int );void svc_xprt_enqueue (struct svc_xprt *xprt);void svc_xprt_received (struct svc_xprt *);void svc_xprt_put (struct svc_xprt *xprt);
net/sunrpc/svc_xprt.c +2 -2
@@ -204,8 +204,8 @@ static struct svc_xprt *__svc_xpo_create(struct svc_xprt_class *xcl, }int svc_create_xprt (struct svc_serv *serv,const char *xprt_name, -const int family,const unsigned short port, -int flags) +struct net *net,const int family, +const unsigned short port,int flags) {struct svc_xprt_class *xcl;
Signature · 1 line
1.5.5.6
PATCH v3 4/9 sunrpc: Pull net argument downto svc_create_socket
In reply to Pavel EmelyanovAfter this the socket creation in it knows the context.
--- include/linux/sunrpc/svc_xprt.h | 1 + net/sunrpc/svc_xprt.c | 5 +++-- net/sunrpc/svcsock.c | 10 +++++++--- net/sunrpc/xprtrdma/svc_rdma_transport.c | 2 ++ 4 files changed, 13 insertions(+), 5 deletions(-)
include/linux/sunrpc/svc_xprt.h +1 -0
@@ -12,6 +12,7 @@struct svc_xprt_ops {struct svc_xprt *(*xpo_create)(struct svc_serv *, +struct net *net,struct sockaddr *,int ,int );struct svc_xprt *(*xpo_accept)(struct svc_xprt *);
net/sunrpc/svc_xprt.c +3 -2
@@ -166,6 +166,7 @@ EXPORT_SYMBOL_GPL(svc_xprt_init);static struct svc_xprt *__svc_xpo_create (struct svc_xprt_class *xcl,struct svc_serv *serv, +struct net *net,const int family,const unsigned short port,int flags)
@@ -200,7 +201,7 @@ static struct svc_xprt *__svc_xpo_create(struct svc_xprt_class *xcl,return ERR_PTR (-EAFNOSUPPORT ); } -return xcl->xcl_ops->xpo_create (serv, sap, len, flags); +return xcl->xcl_ops->xpo_create (serv, net, sap, len, flags); } int svc_create_xprt(struct svc_serv *serv, const char *xprt_name,
@@ -221,7 +222,7 @@ int svc_create_xprt(struct svc_serv *serv, const char *xprt_name, goto err;spin_unlock (&svc_xprt_class_lock); - newxprt =__svc_xpo_create (xcl, serv, family, port, flags); + newxprt =__svc_xpo_create (xcl, serv, net, family, port, flags);if (IS_ERR (newxprt)) {module_put (xcl->xcl_owner);return PTR_ERR (newxprt);
net/sunrpc/svcsock.c +7 -3
@@ -64,7 +64,8 @@ static void svc_tcp_sock_detach(struct svc_xprt *);static void svc_sock_free (struct svc_xprt *);static struct svc_xprt *svc_create_socket (struct svc_serv *,int , -struct sockaddr *,int ,int ); +struct net *,struct sockaddr *, +int ,int );#ifdef CONFIG_DEBUG_LOCK_ALLOC static struct lock_class_key svc_key[2 ];static struct lock_class_key svc_slock_key[2 ];
@@ -657,10 +658,11 @@ static struct svc_xprt *svc_udp_accept(struct svc_xprt *xprt) }static struct svc_xprt *svc_udp_create (struct svc_serv *serv, +struct net *net,struct sockaddr *sa,int salen,int flags) { -return svc_create_socket (serv,IPPROTO_UDP , sa, salen, flags); +return svc_create_socket (serv,IPPROTO_UDP , net, sa, salen, flags); }static struct svc_xprt_ops svc_udp_ops = {
@@ -1178,10 +1180,11 @@ static int svc_tcp_has_wspace(struct svc_xprt *xprt) }static struct svc_xprt *svc_tcp_create (struct svc_serv *serv, +struct net *net,struct sockaddr *sa,int salen,int flags) { -return svc_create_socket (serv,IPPROTO_TCP , sa, salen, flags); +return svc_create_socket (serv,IPPROTO_TCP , net, sa, salen, flags); }static struct svc_xprt_ops svc_tcp_ops = {
@@ -1385,6 +1388,7 @@ EXPORT_SYMBOL_GPL(svc_addsock);*/ static struct svc_xprt *svc_create_socket (struct svc_serv *serv,int protocol, +struct net *net,struct sockaddr *sin,int len,int flags) {
net/sunrpc/xprtrdma/svc_rdma_transport.c +2 -0
@@ -52,6 +52,7 @@#define RPCDBG_FACILITY RPCDBG_SVCXPRTstatic struct svc_xprt *svc_rdma_create (struct svc_serv *serv, +struct net *net,struct sockaddr *sa,int salen,int flags);static struct svc_xprt *svc_rdma_accept (struct svc_xprt *xprt);
@@ -670,6 +671,7 @@ static int rdma_cma_handler(struct rdma_cm_id *cma_id,* Create a listening RDMA service endpoint. */ static struct svc_xprt *svc_rdma_create (struct svc_serv *serv, +struct net *net,struct sockaddr *sa,int salen,int flags) {
Signature · 1 line
1.5.5.6
PATCH v3 5/9 sunrpc: Add net to rpc_create_args
In reply to Pavel Emelyanov--- fs/lockd/host.c | 1 + fs/lockd/mon.c | 1 + fs/nfs/client.c | 1 + fs/nfs/mount_clnt.c | 2 ++ fs/nfsd/nfs4callback.c | 1 + include/linux/sunrpc/clnt.h | 1 + net/sunrpc/rpcb_clnt.c | 2 ++ 7 files changed, 9 insertions(+), 0 deletions(-)
fs/lockd/host.c +1 -0
@@ -353,6 +353,7 @@ nlm_bind_host(struct nlm_host *host) .to_retries = 5U, };struct rpc_create_args args = { + .net = &init_net, .protocol = host->h_proto, .address =nlm_addr (host), .addrsize = host->h_addrlen,
fs/lockd/mon.c +1 -0
@@ -69,6 +69,7 @@ static struct rpc_clnt *nsm_create(void) .sin_addr.s_addr = htonl(INADDR_LOOPBACK), };struct rpc_create_args args = { + .net = &init_net, .protocol =XPRT_TRANSPORT_UDP , .address = (struct sockaddr *)&sin, .addrsize =sizeof (sin),
fs/nfs/client.c +1 -0
@@ -601,6 +601,7 @@ static int nfs_create_rpc_client(struct nfs_client *clp, {struct rpc_clnt *clnt =NULL ;struct rpc_create_args args = { + .net = &init_net, .protocol = clp->cl_proto, .address = (struct sockaddr *)&clp->cl_addr, .addrsize = clp->cl_addrlen,
fs/nfs/mount_clnt.c +2 -0
@@ -153,6 +153,7 @@ int nfs_mount(struct nfs_mount_request *info) .rpc_resp = &result, };struct rpc_create_args args = { + .net = &init_net, .protocol = info->protocol, .address = info->sap, .addrsize = info->salen,
@@ -224,6 +225,7 @@ void nfs_umount(const struct nfs_mount_request *info) .to_retries = 2, };struct rpc_create_args args = { + .net = &init_net, .protocol =IPPROTO_UDP , .address = info->sap, .addrsize = info->salen,
fs/nfsd/nfs4callback.c +1 -0
@@ -479,6 +479,7 @@ int setup_callback_client(struct nfs4_client *clp, struct nfs4_cb_conn *cb) .to_retries = 0, };struct rpc_create_args args = { + .net = &init_net, .protocol =XPRT_TRANSPORT_TCP , .address = (struct sockaddr *) &cb->cb_addr, .addrsize = cb->cb_addrlen,
include/linux/sunrpc/clnt.h +1 -0
@@ -102,6 +102,7 @@ struct rpc_procinfo { #ifdef __KERNEL__ struct rpc_create_args { + struct net *net; int protocol; struct sockaddr *address; size_t addrsize;
net/sunrpc/rpcb_clnt.c +2 -0
@@ -177,6 +177,7 @@ static DEFINE_MUTEX(rpcb_create_local_mutex);static int rpcb_create_local (void ) {struct rpc_create_args args = { + .net = &init_net, .protocol =XPRT_TRANSPORT_TCP , .address = (struct sockaddr *)&rpcb_inaddr_loopback, .addrsize =sizeof (rpcb_inaddr_loopback),
@@ -228,6 +229,7 @@ static struct rpc_clnt *rpcb_create(char *hostname, struct sockaddr *srvaddr, size_t salen, int proto, u32 version) { struct rpc_create_args args = { + .net = &init_net, .protocol = proto, .address = srvaddr, .addrsize = salen,
Signature · 1 line
1.5.5.6
PATCH v3 6/9 sunrpc: Add net to xprt_create
In reply to Pavel Emelyanov--- include/linux/sunrpc/xprt.h | 1 + net/sunrpc/clnt.c | 1 + 2 files changed, 2 insertions(+), 0 deletions(-)
include/linux/sunrpc/xprt.h +1 -0
@@ -249,6 +249,7 @@ static inline int bc_prealloc(struct rpc_rqst *req)struct xprt_create {int ident;/* XPRT_TRANSPORT identifier */ +struct net * net;struct sockaddr * srcaddr;/* optional local address */ struct sockaddr * dstaddr;/* remote peer address */ size_t addrlen;
net/sunrpc/clnt.c +1 -0
@@ -284,6 +284,7 @@ struct rpc_clnt *rpc_create(struct rpc_create_args *args)struct rpc_xprt *xprt;struct rpc_clnt *clnt;struct xprt_create xprtargs = { + .net = args->net, .ident = args->protocol, .srcaddr = args->saddress, .dstaddr = args->address,
Signature · 1 line
1.5.5.6
PATCH v3 7/9 sunrpc: Tag rpc_xprt with net
In reply to Pavel EmelyanovThe net is known from the xprt_create and this tagging will also give un the context in the conntection workers where real sockets are created.
--- include/linux/sunrpc/xprt.h | 3 ++- net/sunrpc/xprt.c | 4 +++- net/sunrpc/xprtrdma/transport.c | 2 +- net/sunrpc/xprtsock.c | 2 +- 4 files changed, 7 insertions(+), 4 deletions(-)
include/linux/sunrpc/xprt.h +2 -1
@@ -224,6 +224,7 @@ struct rpc_xprt { bklog_u;/* backlog queue utilization */ } stat; +struct net *xprt_net;const char *address_strings[RPC_DISPLAY_MAX ]; };
@@ -281,7 +282,7 @@ void xprt_release_xprt_cong(struct rpc_xprt *xprt, struct rpc_task *task);void xprt_release (struct rpc_task *task);struct rpc_xprt *xprt_get (struct rpc_xprt *xprt);void xprt_put (struct rpc_xprt *xprt); -struct rpc_xprt *xprt_alloc (int size,int max_req); +struct rpc_xprt *xprt_alloc (struct net *net,int size,int max_req);void xprt_free (struct rpc_xprt *);static inline __be32 *xprt_skip_transport_header (struct rpc_xprt *xprt,__be32 *p)
net/sunrpc/xprt.c +3 -1
@@ -962,7 +962,7 @@ static void xprt_free_slot(struct rpc_xprt *xprt, struct rpc_rqst *req)spin_unlock (&xprt->reserve_lock); } -struct rpc_xprt *xprt_alloc (int size,int max_req) +struct rpc_xprt *xprt_alloc (struct net *net,int size,int max_req) {struct rpc_xprt *xprt;
@@ -975,6 +975,7 @@ struct rpc_xprt *xprt_alloc(int size, int max_req)if (xprt->slot ==NULL ) goto out_free; + xprt->xprt_net =get_net (net);return xprt; out_free:
@@ -986,6 +987,7 @@ EXPORT_SYMBOL_GPL(xprt_alloc);void xprt_free (struct rpc_xprt *xprt) { +put_net (xprt->xprt_net);kfree (xprt->slot);kfree (xprt); }
net/sunrpc/xprtrdma/transport.c +1 -1
@@ -283,7 +283,7 @@ xprt_setup_rdma(struct xprt_create *args)return ERR_PTR (-EBADF ); } - xprt =xprt_alloc (sizeof (struct rpcrdma_xprt ), + xprt =xprt_alloc (args->net,sizeof (struct rpcrdma_xprt ), xprt_rdma_slot_table_entries);if (xprt ==NULL ) { dprintk("RPC: %s: couldn't allocate rpcrdma_xprt\n",
net/sunrpc/xprtsock.c +1 -1
@@ -2272,7 +2272,7 @@ static struct rpc_xprt *xs_setup_xprt(struct xprt_create *args,return ERR_PTR (-EBADF ); } - xprt =xprt_alloc (sizeof (*new), slot_table_size); + xprt =xprt_alloc (args->net,sizeof (*new), slot_table_size);if (xprt ==NULL ) {dprintk ("RPC: xs_setup_xprt: couldn't allocate " "rpc_xprt\n" );
Signature · 1 line
1.5.5.6
PATCH v3 8/9 net: Export __sock_create
In reply to Pavel Emelyanov--- include/linux/net.h | 2 ++ net/socket.c | 3 ++- 2 files changed, 4 insertions(+), 1 deletions(-)
include/linux/net.h +2 -0
@@ -229,6 +229,8 @@ enum {extern int sock_wake_async (struct socket *sk,int how,int band);extern int sock_register (const struct net_proto_family *fam);extern void sock_unregister (int family); +extern int __sock_create (struct net *net,int family,int type,int proto, +struct socket **res,int kern);extern int sock_create (int family,int type,int proto,struct socket **res); extern int sock_create_kern(int family, int type, int proto,
net/socket.c +2 -1
@@ -1144,7 +1144,7 @@ call_kill: }EXPORT_SYMBOL (sock_wake_async); -static int __sock_create (struct net *net,int family,int type,int protocol, +int __sock_create (struct net *net,int family,int type,int protocol,struct socket **res,int kern) {int err;
@@ -1256,6 +1256,7 @@ out_release:rcu_read_unlock (); goto out_sock_release; } +EXPORT_SYMBOL (__sock_create);int sock_create (int family,int type,int protocol,struct socket **res) {
Signature · 1 line
1.5.5.6
PATCH v3 9/9 sunrpc: Create sockets in net namespaces
In reply to Pavel EmelyanovThe context is already known in all the sock_create callers.
--- net/sunrpc/svcsock.c | 2 +- net/sunrpc/xprtsock.c | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-)
net/sunrpc/svcsock.c +1 -1
@@ -1425,7 +1425,7 @@ static struct svc_xprt *svc_create_socket(struct svc_serv *serv,return ERR_PTR (-EINVAL ); } - error =sock_create_kern (family, type, protocol, &sock); + error =__sock_create (net, family, type, protocol, &sock,1 );if (error <0 )return ERR_PTR (error);
net/sunrpc/xprtsock.c +4 -4
@@ -1680,7 +1680,7 @@ static void xs_udp_connect_worker4(struct work_struct *work)/* Start by resetting any existing state */ xs_reset_transport (transport); - err =sock_create_kern (PF_INET ,SOCK_DGRAM ,IPPROTO_UDP , &sock); + err =__sock_create (xprt->xprt_net,PF_INET ,SOCK_DGRAM ,IPPROTO_UDP , &sock,1 );if (err <0 ) {dprintk ("RPC: can't create UDP transport socket (%d).\n" , -err); goto out;
@@ -1725,7 +1725,7 @@ static void xs_udp_connect_worker6(struct work_struct *work)/* Start by resetting any existing state */ xs_reset_transport (transport); - err =sock_create_kern (PF_INET6 ,SOCK_DGRAM ,IPPROTO_UDP , &sock); + err =__sock_create (xprt->xprt_net,PF_INET6 ,SOCK_DGRAM ,IPPROTO_UDP , &sock,1 );if (err <0 ) {dprintk ("RPC: can't create UDP transport socket (%d).\n" , -err); goto out;
@@ -1931,7 +1931,7 @@ static struct socket *xs_create_tcp_sock4(struct rpc_xprt *xprt,int err;/* start from scratch */ - err =sock_create_kern (PF_INET ,SOCK_STREAM ,IPPROTO_TCP , &sock); + err =__sock_create (xprt->xprt_net,PF_INET ,SOCK_STREAM ,IPPROTO_TCP , &sock,1 );if (err <0 ) {dprintk ("RPC: can't create TCP transport socket (%d).\n" , -err);
@@ -1970,7 +1970,7 @@ static struct socket *xs_create_tcp_sock6(struct rpc_xprt *xprt,int err;/* start from scratch */ - err =sock_create_kern (PF_INET6 ,SOCK_STREAM ,IPPROTO_TCP , &sock); + err =__sock_create (xprt->xprt_net,PF_INET6 ,SOCK_STREAM ,IPPROTO_TCP , &sock,1 );if (err <0 ) {dprintk ("RPC: can't create TCP transport socket (%d).\n" , -err);
Signature · 1 line
1.5.5.6
Quoted 4 lines · Pavel Emelyanov
v3 changes:
Moved the generic xprt alloc/free code toxprt.c.
Got David's ack on the 8th patch :)
Quoted 8 lines
v2 changes:
Fixed comments from Chuck and Trond.
Added one patch, that factors outrpc_xprtallocation as well.v1:
This set implements pulling the net * argument down to the existingsock_create_kerncalls in the sunrpc layer and creating the sockets in the given net.
Shall I commit this to my for-2.6.37 tree? Objections?
--b.
Quoted 9 lines · J. Bruce Fields
Quoted 8 lines · Pavel Emelyanov
v3 changes:
Moved the generic xprt alloc/free code toxprt.c.
Got David's ack on the 8th patch :)v2 changes:
Fixed comments from Chuck and Trond.
Added one patch, that factors outrpc_xprtallocation as well.
Quoted 6 lines
Quoted 4 lines
v1:
This set implements pulling the net * argument down to the existingsock_create_kerncalls in the sunrpc layer and creating the sockets in the given net.Shall I commit this to my for-2.6.37 tree? Objections?
I think it looks OK.
But I was wondering if there were any other changes needed for the RDMA transport capability, or had we decided that would happen at a latter point, or that changes are entirely unneeded (are namespaces already supported in the IB stack)?
Signature · 1 line
chuck[dot]lever[at]oracle[dot]com
Quoted 7 lines
Quoted 1 line
Shall I commit this to my for-2.6.37 tree? Objections?
I think it looks OK.
But I was wondering if there were any other changes needed for the RDMA transport capability, or had we decided that would happen at a latter point, or that changes are entirely unneeded
We definitely need more changes in the RDMA transport, but I would like to have it done later (unless someone other than me starts doing it earlier ;) ).
Quoted 1 line
(are namespaces already supported in the IB stack)?
Nope. And this makes RDMA netnsization even more harder :(
Quoted 10 lines · Pavel Emelyanov
Quoted 7 lines
Quoted 1 line
Shall I commit this to my for-2.6.37 tree? Objections?
I think it looks OK.
But I was wondering if there were any other changes needed for the RDMA transport capability, or had we decided that would happen at a latter point, or that changes are entirely unneeded
We definitely need more changes in the RDMA transport, but I would like to have it done later (unless someone other than me starts doing it earlier ;) ).
OK, thanks for clearing that up. It makes sense to keep the scope of this socket patch set narrow, but I don't want the RDMA pieces to get lost. The more we let the RDMA and socket transport capabilities differ, the harder it will be to support RDMA in the long run.
Anyway, Bruce, I have no objection to the latest version of this socket patch set, fwiw.
Quoted 3 lines
Quoted 1 line
(are namespaces already supported in the IB stack)?
Nope. And this makes RDMA netnsization even more harder :(
Signature · 1 line
chuck[dot]lever[at]oracle[dot]com
Quoted 11 lines · Chuck Lever
Quoted 8 lines · Pavel Emelyanov
Quoted 7 lines
Quoted 1 line
Shall I commit this to my for-2.6.37 tree? Objections?
I think it looks OK.
But I was wondering if there were any other changes needed for the RDMA transport capability, or had we decided that would happen at a latter point, or that changes are entirely unneeded
Quoted 7 lines
Quoted 2 lines
We definitely need more changes in the RDMA transport, but I would like to have it done later (unless someone other than me starts doing it earlier ;) ).
OK, thanks for clearing that up. It makes sense to keep the scope of this socket patch set narrow, but I don't want the RDMA pieces to get lost. The more we let the RDMA and socket transport capabilities differ, the harder it will be to support RDMA in the long run.
OK, but I may have problems with the IB hardware. If you can advise me the way to test the RDMA without it, it would be very helpful.
Quoted 6 lines
Anyway, Bruce, I have no objection to the latest version of this socket patch set, fwiw.
Quoted 3 lines
Quoted 1 line
(are namespaces already supported in the IB stack)?
Nope. And this makes RDMA netnsization even more harder :(
Quoted 11 lines · Chuck Lever
Quoted 8 lines · Pavel Emelyanov
Quoted 7 lines
Quoted 1 line
Shall I commit this to my for-2.6.37 tree? Objections?
I think it looks OK.
But I was wondering if there were any other changes needed for the RDMA transport capability, or had we decided that would happen at a latter point, or that changes are entirely unneeded
Quoted 6 lines
Quoted 2 lines
We definitely need more changes in the RDMA transport, but I would like to have it done later (unless someone other than me starts doing it earlier ;) ).
OK, thanks for clearing that up. It makes sense to keep the scope of this socket patch set narrow, but I don't want the RDMA pieces to get lost. The more we let the RDMA and socket transport capabilities differ, the harder it will be to support RDMA in the long run.
Anyway, Bruce, I have no objection to the latest version of this socket patch set, fwiw.
Applied and pushed out, thanks Pavel and Chuck....
--b.
Just curious--is there still work left on nfs and rpc containerization? And what's left to do there?
--b.
Quoted 15 lines · Pavel Emelyanov
v3 changes:
Moved the generic xprt alloc/free code toxprt.c.
Got David's ack on the 8th patch :)v2 changes:
Fixed comments from Chuck and Trond.
Added one patch, that factors outrpc_xprtallocation as well.v1:
This set implements pulling the net * argument down to the existingsock_create_kerncalls in the sunrpc layer and creating the sockets in the given net.Thanks,
Pavel
Quoted 2 lines · J. Bruce Fields
Just curious--is there still work left on nfs and rpc containerization? And what's left to do there?
Yes, there's still more work todo. Unfortunately it is stalled now, but I plan to return back to it soon. Sorry about it.
Quoted 20 lines
--b.
Quoted 8 lines · Pavel Emelyanov
v3 changes:
Moved the generic xprt alloc/free code toxprt.c.
Got David's ack on the 8th patch :)v2 changes:
Fixed comments from Chuck and Trond.
Added one patch, that factors outrpc_xprtallocation as well.Quoted 7 lines
v1:
This set implements pulling the net * argument down to the existingsock_create_kerncalls in the sunrpc layer and creating the sockets in the given net.Thanks,
Pavel.
Quoted 6 lines · Pavel Emelyanov
Quoted 2 lines · J. Bruce Fields
Just curious--is there still work left on nfs and rpc containerization? And what's left to do there?
Yes, there's still more work todo. Unfortunately it is stalled now, but I plan to return back to it soon. Sorry about it.
No big deal, just wondering how big what's left is; do you have a list somewhere?
--b.