Skip to content

Commit bb6aeba

Browse files
trondmypdamschuma-ntap
authored andcommitted
NFSv4.x: Switch to using svc_set_num_threads() to manage the callback threads
This will allow us to bump the number of callback threads at will. Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
1 parent 3b01c11 commit bb6aeba

File tree

2 files changed

+15
-66
lines changed

2 files changed

+15
-66
lines changed

fs/nfs/callback.c

Lines changed: 13 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,6 @@
3131
struct nfs_callback_data {
3232
unsigned int users;
3333
struct svc_serv *serv;
34-
struct svc_rqst *rqst;
35-
struct task_struct *task;
3634
};
3735

3836
static struct nfs_callback_data nfs_callback_info[NFS4_MAX_MINOR_VERSION + 1];
@@ -89,15 +87,6 @@ nfs4_callback_svc(void *vrqstp)
8987
return 0;
9088
}
9189

92-
/*
93-
* Prepare to bring up the NFSv4 callback service
94-
*/
95-
static struct svc_rqst *
96-
nfs4_callback_up(struct svc_serv *serv)
97-
{
98-
return svc_prepare_thread(serv, &serv->sv_pools[0], NUMA_NO_NODE);
99-
}
100-
10190
#if defined(CONFIG_NFS_V4_1)
10291
/*
10392
* The callback service for NFSv4.1 callbacks
@@ -139,19 +128,6 @@ nfs41_callback_svc(void *vrqstp)
139128
return 0;
140129
}
141130

142-
/*
143-
* Bring up the NFSv4.1 callback service
144-
*/
145-
static struct svc_rqst *
146-
nfs41_callback_up(struct svc_serv *serv)
147-
{
148-
struct svc_rqst *rqstp;
149-
150-
rqstp = svc_prepare_thread(serv, &serv->sv_pools[0], NUMA_NO_NODE);
151-
dprintk("--> %s return %d\n", __func__, PTR_ERR_OR_ZERO(rqstp));
152-
return rqstp;
153-
}
154-
155131
static inline void nfs_callback_bc_serv(u32 minorversion, struct rpc_xprt *xprt,
156132
struct svc_serv *serv)
157133
{
@@ -163,12 +139,6 @@ static inline void nfs_callback_bc_serv(u32 minorversion, struct rpc_xprt *xprt,
163139
xprt->bc_serv = serv;
164140
}
165141
#else
166-
static struct svc_rqst *
167-
nfs41_callback_up(struct svc_serv *serv)
168-
{
169-
return ERR_PTR(-ENOTSUPP);
170-
}
171-
172142
static inline void nfs_callback_bc_serv(u32 minorversion, struct rpc_xprt *xprt,
173143
struct svc_serv *serv)
174144
{
@@ -178,42 +148,19 @@ static inline void nfs_callback_bc_serv(u32 minorversion, struct rpc_xprt *xprt,
178148
static int nfs_callback_start_svc(int minorversion, struct rpc_xprt *xprt,
179149
struct svc_serv *serv)
180150
{
181-
struct svc_rqst *rqstp;
182-
struct nfs_callback_data *cb_info = &nfs_callback_info[minorversion];
151+
const int nrservs = NFS4_NR_CALLBACK_THREADS;
183152
int ret;
184153

185154
nfs_callback_bc_serv(minorversion, xprt, serv);
186155

187-
if (cb_info->task)
156+
if (serv->sv_nrthreads-1 == nrservs)
188157
return 0;
189158

190-
switch (minorversion) {
191-
case 0:
192-
/* v4.0 callback setup */
193-
rqstp = nfs4_callback_up(serv);
194-
break;
195-
default:
196-
rqstp = nfs41_callback_up(serv);
197-
}
198-
199-
if (IS_ERR(rqstp))
200-
return PTR_ERR(rqstp);
201-
202-
svc_sock_update_bufs(serv);
203-
204-
cb_info->rqst = rqstp;
205-
cb_info->task = kthread_create(serv->sv_ops->svo_function,
206-
cb_info->rqst,
207-
"nfsv4.%u-svc", minorversion);
208-
if (IS_ERR(cb_info->task)) {
209-
ret = PTR_ERR(cb_info->task);
210-
svc_exit_thread(cb_info->rqst);
211-
cb_info->rqst = NULL;
212-
cb_info->task = NULL;
159+
ret = serv->sv_ops->svo_setup(serv, NULL, nrservs);
160+
if (ret) {
161+
serv->sv_ops->svo_setup(serv, NULL, 0);
213162
return ret;
214163
}
215-
rqstp->rq_task = cb_info->task;
216-
wake_up_process(cb_info->task);
217164
dprintk("nfs_callback_up: service started\n");
218165
return 0;
219166
}
@@ -270,12 +217,14 @@ static int nfs_callback_up_net(int minorversion, struct svc_serv *serv,
270217
static struct svc_serv_ops nfs40_cb_sv_ops = {
271218
.svo_function = nfs4_callback_svc,
272219
.svo_enqueue_xprt = svc_xprt_do_enqueue,
220+
.svo_setup = svc_set_num_threads,
273221
.svo_module = THIS_MODULE,
274222
};
275223
#if defined(CONFIG_NFS_V4_1)
276224
static struct svc_serv_ops nfs41_cb_sv_ops = {
277225
.svo_function = nfs41_callback_svc,
278226
.svo_enqueue_xprt = svc_xprt_do_enqueue,
227+
.svo_setup = svc_set_num_threads,
279228
.svo_module = THIS_MODULE,
280229
};
281230

@@ -394,20 +343,18 @@ int nfs_callback_up(u32 minorversion, struct rpc_xprt *xprt)
394343
void nfs_callback_down(int minorversion, struct net *net)
395344
{
396345
struct nfs_callback_data *cb_info = &nfs_callback_info[minorversion];
346+
struct svc_serv *serv;
397347

398348
mutex_lock(&nfs_callback_mutex);
399-
nfs_callback_down_net(minorversion, cb_info->serv, net);
349+
serv = cb_info->serv;
350+
nfs_callback_down_net(minorversion, serv, net);
400351
cb_info->users--;
401352
if (cb_info->users == 0) {
402-
if (cb_info->task != NULL) {
403-
kthread_stop(cb_info->task);
404-
dprintk("nfs_callback_down: service stopped\n");
405-
}
406-
svc_exit_thread(cb_info->rqst);
353+
svc_get(serv);
354+
serv->sv_ops->svo_setup(serv, NULL, 0);
355+
svc_destroy(serv);
407356
dprintk("nfs_callback_down: service destroyed\n");
408357
cb_info->serv = NULL;
409-
cb_info->rqst = NULL;
410-
cb_info->task = NULL;
411358
}
412359
mutex_unlock(&nfs_callback_mutex);
413360
}

fs/nfs/callback.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,8 @@ extern void nfs_callback_down(int minorversion, struct net *net);
198198
#define NFS41_BC_MIN_CALLBACKS 1
199199
#define NFS41_BC_MAX_CALLBACKS 1
200200

201+
#define NFS4_NR_CALLBACK_THREADS 1
202+
201203
extern unsigned int nfs_callback_set_tcpport;
202204

203205
#endif /* __LINUX_FS_NFS_CALLBACK_H */

0 commit comments

Comments
 (0)