From 62d6c11e3c39fa9e986c8c4c8335df5eb5428b71 Mon Sep 17 00:00:00 2001 From: Zach Brown Date: Mon, 13 Aug 2018 13:31:28 -0700 Subject: [PATCH] scoutfs: clean up workqueue flags We had gotten a bit sloppy with the workqueue flags. We needed _UNBOUND in some workqueues where we wanted concurrency by scheduling across cpus instead of waiting for the current (very long running) work on a cpu to finish. We add NON_REENTRANT out of an abundance of caution. It has gone away in modern kernels and is probably not needed here, but according to the docs we would want it so we at least document that fact by using it. Signed-off-by: Zach Brown --- kmod/src/data.c | 2 +- kmod/src/lock.c | 3 ++- kmod/src/net.c | 3 ++- kmod/src/server.c | 3 ++- kmod/src/trans.c | 3 ++- 5 files changed, 9 insertions(+), 5 deletions(-) diff --git a/kmod/src/data.c b/kmod/src/data.c index 5485af0b..46b18588 100644 --- a/kmod/src/data.c +++ b/kmod/src/data.c @@ -1371,7 +1371,7 @@ int scoutfs_data_setup(struct super_block *sb) INIT_WORK(&datinf->return_work, scoutfs_data_return_server_extents_worker); - datinf->workq = alloc_workqueue("scoutfs_data", 0, 1); + datinf->workq = alloc_workqueue("scoutfs_data", WQ_UNBOUND, 1); if (!datinf->workq) { kfree(datinf); return -ENOMEM; diff --git a/kmod/src/lock.c b/kmod/src/lock.c index f565be1e..e8a6a425 100644 --- a/kmod/src/lock.c +++ b/kmod/src/lock.c @@ -1445,7 +1445,8 @@ int scoutfs_lock_setup(struct super_block *sb) } linfo->workq = alloc_workqueue("scoutfs_lock_work", - WQ_UNBOUND|WQ_HIGHPRI, 0); + WQ_NON_REENTRANT | WQ_UNBOUND | + WQ_HIGHPRI, 0); if (!linfo->workq) { ret = -ENOMEM; goto out; diff --git a/kmod/src/net.c b/kmod/src/net.c index c871d468..27e567fb 100644 --- a/kmod/src/net.c +++ b/kmod/src/net.c @@ -1561,7 +1561,8 @@ int scoutfs_net_setup(struct super_block *sb) scoutfs_tseq_tree_init(&ninf->msg_tseq_tree, net_tseq_show_msg); ninf->shutdown_workq = alloc_workqueue("scoutfs_net_shutdown", - WQ_UNBOUND, 0); + WQ_UNBOUND | WQ_NON_REENTRANT, + 0); if (!ninf->shutdown_workq) { ret = -ENOMEM; goto out; diff --git a/kmod/src/server.c b/kmod/src/server.c index 8f8eda8b..a91cf005 100644 --- a/kmod/src/server.c +++ b/kmod/src/server.c @@ -1339,7 +1339,8 @@ int scoutfs_server_setup(struct super_block *sb) INIT_LIST_HEAD(&server->pending_frees); INIT_LIST_HEAD(&server->clients); - server->wq = alloc_workqueue("scoutfs_server", WQ_NON_REENTRANT, 0); + server->wq = alloc_workqueue("scoutfs_server", + WQ_UNBOUND | WQ_NON_REENTRANT, 0); if (!server->wq) { kfree(server); return -ENOMEM; diff --git a/kmod/src/trans.c b/kmod/src/trans.c index 9e45b7e2..710fa6cd 100644 --- a/kmod/src/trans.c +++ b/kmod/src/trans.c @@ -480,7 +480,8 @@ int scoutfs_setup_trans(struct super_block *sb) spin_lock_init(&tri->lock); - sbi->trans_write_workq = alloc_workqueue("scoutfs_trans", 0, 1); + sbi->trans_write_workq = alloc_workqueue("scoutfs_trans", + WQ_UNBOUND, 1); if (!sbi->trans_write_workq) { kfree(tri); return -ENOMEM;