提交 2ea75a10 编写于 作者: S Stanislav Kinsbursky 提交者: Trond Myklebust

SUNRPC: optimize net_ns dereferencing in rpcbind creation calls

Static rpcbind creation functions can be parametrized by network namespace
pointer, calculated only once, instead of using init_net pointer (or taking it
from current when virtualization will be comleted) in many places.
Signed-off-by: NStanislav Kinsbursky <skinsbursky@parallels.com>
Signed-off-by: NTrond Myklebust <Trond.Myklebust@netapp.com>
上级 dff02d49
...@@ -161,10 +161,10 @@ static void rpcb_map_release(void *data) ...@@ -161,10 +161,10 @@ static void rpcb_map_release(void *data)
kfree(map); kfree(map);
} }
static int rpcb_get_local(void) static int rpcb_get_local(struct net *net)
{ {
int cnt; int cnt;
struct sunrpc_net *sn = net_generic(&init_net, sunrpc_net_id); struct sunrpc_net *sn = net_generic(net, sunrpc_net_id);
spin_lock(&sn->rpcb_clnt_lock); spin_lock(&sn->rpcb_clnt_lock);
if (sn->rpcb_users) if (sn->rpcb_users)
...@@ -201,9 +201,10 @@ void rpcb_put_local(void) ...@@ -201,9 +201,10 @@ void rpcb_put_local(void)
} }
} }
static void rpcb_set_local(struct rpc_clnt *clnt, struct rpc_clnt *clnt4) static void rpcb_set_local(struct net *net, struct rpc_clnt *clnt,
struct rpc_clnt *clnt4)
{ {
struct sunrpc_net *sn = net_generic(&init_net, sunrpc_net_id); struct sunrpc_net *sn = net_generic(net, sunrpc_net_id);
/* Protected by rpcb_create_local_mutex */ /* Protected by rpcb_create_local_mutex */
sn->rpcb_local_clnt = clnt; sn->rpcb_local_clnt = clnt;
...@@ -211,22 +212,23 @@ static void rpcb_set_local(struct rpc_clnt *clnt, struct rpc_clnt *clnt4) ...@@ -211,22 +212,23 @@ static void rpcb_set_local(struct rpc_clnt *clnt, struct rpc_clnt *clnt4)
smp_wmb(); smp_wmb();
sn->rpcb_users = 1; sn->rpcb_users = 1;
dprintk("RPC: created new rpcb local clients (rpcb_local_clnt: " dprintk("RPC: created new rpcb local clients (rpcb_local_clnt: "
"%p, rpcb_local_clnt4: %p)\n", sn->rpcb_local_clnt, "%p, rpcb_local_clnt4: %p) for net %p%s\n",
sn->rpcb_local_clnt4); sn->rpcb_local_clnt, sn->rpcb_local_clnt4,
net, (net == &init_net) ? " (init_net)" : "");
} }
/* /*
* Returns zero on success, otherwise a negative errno value * Returns zero on success, otherwise a negative errno value
* is returned. * is returned.
*/ */
static int rpcb_create_local_unix(void) static int rpcb_create_local_unix(struct net *net)
{ {
static const struct sockaddr_un rpcb_localaddr_rpcbind = { static const struct sockaddr_un rpcb_localaddr_rpcbind = {
.sun_family = AF_LOCAL, .sun_family = AF_LOCAL,
.sun_path = RPCBIND_SOCK_PATHNAME, .sun_path = RPCBIND_SOCK_PATHNAME,
}; };
struct rpc_create_args args = { struct rpc_create_args args = {
.net = &init_net, .net = net,
.protocol = XPRT_TRANSPORT_LOCAL, .protocol = XPRT_TRANSPORT_LOCAL,
.address = (struct sockaddr *)&rpcb_localaddr_rpcbind, .address = (struct sockaddr *)&rpcb_localaddr_rpcbind,
.addrsize = sizeof(rpcb_localaddr_rpcbind), .addrsize = sizeof(rpcb_localaddr_rpcbind),
...@@ -259,7 +261,7 @@ static int rpcb_create_local_unix(void) ...@@ -259,7 +261,7 @@ static int rpcb_create_local_unix(void)
clnt4 = NULL; clnt4 = NULL;
} }
rpcb_set_local(clnt, clnt4); rpcb_set_local(net, clnt, clnt4);
out: out:
return result; return result;
...@@ -269,7 +271,7 @@ static int rpcb_create_local_unix(void) ...@@ -269,7 +271,7 @@ static int rpcb_create_local_unix(void)
* Returns zero on success, otherwise a negative errno value * Returns zero on success, otherwise a negative errno value
* is returned. * is returned.
*/ */
static int rpcb_create_local_net(void) static int rpcb_create_local_net(struct net *net)
{ {
static const struct sockaddr_in rpcb_inaddr_loopback = { static const struct sockaddr_in rpcb_inaddr_loopback = {
.sin_family = AF_INET, .sin_family = AF_INET,
...@@ -277,7 +279,7 @@ static int rpcb_create_local_net(void) ...@@ -277,7 +279,7 @@ static int rpcb_create_local_net(void)
.sin_port = htons(RPCBIND_PORT), .sin_port = htons(RPCBIND_PORT),
}; };
struct rpc_create_args args = { struct rpc_create_args args = {
.net = &init_net, .net = net,
.protocol = XPRT_TRANSPORT_TCP, .protocol = XPRT_TRANSPORT_TCP,
.address = (struct sockaddr *)&rpcb_inaddr_loopback, .address = (struct sockaddr *)&rpcb_inaddr_loopback,
.addrsize = sizeof(rpcb_inaddr_loopback), .addrsize = sizeof(rpcb_inaddr_loopback),
...@@ -311,7 +313,7 @@ static int rpcb_create_local_net(void) ...@@ -311,7 +313,7 @@ static int rpcb_create_local_net(void)
clnt4 = NULL; clnt4 = NULL;
} }
rpcb_set_local(clnt, clnt4); rpcb_set_local(net, clnt, clnt4);
out: out:
return result; return result;
...@@ -325,16 +327,17 @@ int rpcb_create_local(void) ...@@ -325,16 +327,17 @@ int rpcb_create_local(void)
{ {
static DEFINE_MUTEX(rpcb_create_local_mutex); static DEFINE_MUTEX(rpcb_create_local_mutex);
int result = 0; int result = 0;
struct net *net = &init_net;
if (rpcb_get_local()) if (rpcb_get_local(net))
return result; return result;
mutex_lock(&rpcb_create_local_mutex); mutex_lock(&rpcb_create_local_mutex);
if (rpcb_get_local()) if (rpcb_get_local(net))
goto out; goto out;
if (rpcb_create_local_unix() != 0) if (rpcb_create_local_unix(net) != 0)
result = rpcb_create_local_net(); result = rpcb_create_local_net(net);
out: out:
mutex_unlock(&rpcb_create_local_mutex); mutex_unlock(&rpcb_create_local_mutex);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册