Commit 58da282b authored by NeilBrown's avatar NeilBrown Committed by Linus Torvalds

[PATCH] knfsd: nfsd4: create separate laundromat workqueue

We're running the laundromat work on the default kevent worker thread.  But
the laundromat takes the nfsv4 state semaphore, which is used for way too much
stuff, and the potential for deadlocks is high.  Better to have this on a
separate workqueue.
Signed-off-by: default avatarJ. Bruce Fields <bfields@citi.umich.edu>
Signed-off-by: default avatarNeil Brown <neilb@cse.unsw.edu.au>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent dfc83565
...@@ -1844,6 +1844,7 @@ nfsd4_process_open2(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nf ...@@ -1844,6 +1844,7 @@ nfsd4_process_open2(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nf
return status; return status;
} }
static struct workqueue_struct *laundry_wq;
static struct work_struct laundromat_work; static struct work_struct laundromat_work;
static void laundromat_main(void *); static void laundromat_main(void *);
static DECLARE_WORK(laundromat_work, laundromat_main, NULL); static DECLARE_WORK(laundromat_work, laundromat_main, NULL);
...@@ -1951,7 +1952,7 @@ laundromat_main(void *not_used) ...@@ -1951,7 +1952,7 @@ laundromat_main(void *not_used)
t = nfs4_laundromat(); t = nfs4_laundromat();
dprintk("NFSD: laundromat_main - sleeping for %ld seconds\n", t); dprintk("NFSD: laundromat_main - sleeping for %ld seconds\n", t);
schedule_delayed_work(&laundromat_work, t*HZ); queue_delayed_work(laundry_wq, &laundromat_work, t*HZ);
} }
/* search ownerid_hashtbl[] and close_lru for stateid owner /* search ownerid_hashtbl[] and close_lru for stateid owner
...@@ -3211,7 +3212,8 @@ __nfs4_state_init(void) ...@@ -3211,7 +3212,8 @@ __nfs4_state_init(void)
printk("NFSD: starting %ld-second grace period\n", grace_time); printk("NFSD: starting %ld-second grace period\n", grace_time);
grace_end = boot_time + grace_time; grace_end = boot_time + grace_time;
INIT_WORK(&laundromat_work,laundromat_main, NULL); INIT_WORK(&laundromat_work,laundromat_main, NULL);
schedule_delayed_work(&laundromat_work, NFSD_LEASE_TIME*HZ); laundry_wq = create_singlethread_workqueue("nfsd4");
queue_delayed_work(laundry_wq, &laundromat_work, NFSD_LEASE_TIME*HZ);
} }
int int
...@@ -3287,7 +3289,8 @@ __nfs4_state_shutdown(void) ...@@ -3287,7 +3289,8 @@ __nfs4_state_shutdown(void)
} }
cancel_delayed_work(&laundromat_work); cancel_delayed_work(&laundromat_work);
flush_scheduled_work(); flush_workqueue(laundry_wq);
destroy_workqueue(laundry_wq);
nfs4_init = 0; nfs4_init = 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment