OpenVZ Forum


Home » Mailing lists » Devel » [PATCH v2 00/12] NFS: callback threads containerization
[PATCH v2 09/12] NFS; callback per-net usage counting introduced [message #46431 is a reply to message #46423] Tue, 22 May 2012 07:36 Go to previous messageGo to previous message
Stanislav Kinsbursky is currently offline  Stanislav Kinsbursky
Messages: 683
Registered: October 2011
Senior Member
This patch also introduces refcount-aware nfs_callback_down_net() wrapper for
svc_shutdown_net().

Signed-off-by: Stanislav Kinsbursky <skinsbursky@parallels.com>
---
fs/nfs/callback.c | 19 +++++++++++++++++--
fs/nfs/netns.h | 1 +
2 files changed, 18 insertions(+), 2 deletions(-)

diff --git a/fs/nfs/callback.c b/fs/nfs/callback.c
index d25085f..dbedd7e 100644
--- a/fs/nfs/callback.c
+++ b/fs/nfs/callback.c
@@ -285,10 +285,25 @@ static int nfs_callback_start_svc(int minorversion, struct rpc_xprt *xprt,
return 0;
}

+static void nfs_callback_down_net(u32 minorversion, struct svc_serv *serv, struct net *net)
+{
+ struct nfs_net *nn = net_generic(net, nfs_net_id);
+
+ if (--nn->cb_users[minorversion])
+ return;
+
+ dprintk("NFS: destroy per-net callback data; net=%p\n", net);
+ svc_shutdown_net(serv, net);
+}
+
static int nfs_callback_up_net(int minorversion, struct svc_serv *serv, struct net *net)
{
+ struct nfs_net *nn = net_generic(net, nfs_net_id);
int ret;

+ if (nn->cb_users[minorversion]++)
+ return 0;
+
dprintk("NFS: create per-net callback data; net=%p\n", net);

ret = svc_bind(serv, net);
@@ -391,7 +406,7 @@ err_create:
return ret;

err_start:
- svc_shutdown_net(serv, net);
+ nfs_callback_down_net(minorversion, serv, net);
dprintk("NFS: Couldn't create server thread; err = %d\n", ret);
goto err_net;
}
@@ -404,10 +419,10 @@ void nfs_callback_down(int minorversion, struct net *net)
struct nfs_callback_data *cb_info = &nfs_callback_info[minorversion];

mutex_lock(&nfs_callback_mutex);
+ nfs_callback_down_net(minorversion, cb_info->serv, net);
cb_info->users--;
if (cb_info->users == 0 && cb_info->task != NULL) {
kthread_stop(cb_info->task);
- svc_shutdown_net(cb_info->serv, net);
svc_exit_thread(cb_info->rqst);
cb_info->serv = NULL;
cb_info->rqst = NULL;
diff --git a/fs/nfs/netns.h b/fs/nfs/netns.h
index bd72a55..db3e495 100644
--- a/fs/nfs/netns.h
+++ b/fs/nfs/netns.h
@@ -20,6 +20,7 @@ struct nfs_net {
struct idr cb_ident_idr; /* Protected by nfs_client_lock */
unsigned short nfs_callback_tcpport;
unsigned short nfs_callback_tcpport6;
+ int cb_users[NFS4_MAX_MINOR_VERSION + 1];
#endif
spinlock_t nfs_client_lock;
};
 
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Previous Topic: [RFC] memcg: propagate kmem limiting information to children
Next Topic: [PATCH] NFS: init client before declaration
Goto Forum:
  


Current Time: Fri Jul 25 14:40:48 GMT 2025

Total time taken to generate the page: 0.18307 seconds