aboutsummaryrefslogtreecommitdiffstats
path: root/fs/gfs2
diff options
context:
space:
mode:
authorSteven Whitehouse <swhiteho@redhat.com>2010-09-13 11:23:00 -0400
committerSteven Whitehouse <swhiteho@redhat.com>2010-09-20 06:20:36 -0400
commit9fa0ea9f26f64fbfc3dfd51d1dc2c230b65ffb19 (patch)
tree39d893961545394f1a504ed3d63fe900f76b95ef /fs/gfs2
parent1fea7c25a05d388c0cdbe02cbdaf3a2e70885581 (diff)
GFS2: Use new workqueue scheme
The recovery workqueue can be freezable since we want it to finish what it is doing if the system is to be frozen (although why you'd want to freeze a cluster node is beyond me since it will result in it being ejected from the cluster). It does still make sense for single node GFS2 filesystems though. The glock workqueue will benefit from being able to run more work items concurrently. A test running postmark shows improved performance and multi-threaded workloads are likely to benefit even more. It needs to be high priority because the latency directly affects the latency of filesystem glock operations. The delete workqueue is similar to the recovery workqueue in that it must not get blocked by memory allocations, and may run for a long time. Potentially other GFS2 threads might also be converted to workqueues, but I'll leave that for a later patch. Signed-off-by: Steven Whitehouse <swhiteho@redhat.com> Acked-by: Tejun Heo <tj@kernel.org>
Diffstat (limited to 'fs/gfs2')
-rw-r--r--fs/gfs2/glock.c6
-rw-r--r--fs/gfs2/main.c2
2 files changed, 5 insertions, 3 deletions
diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c
index 8e478e27f1f7..c3f2a5cc8efb 100644
--- a/fs/gfs2/glock.c
+++ b/fs/gfs2/glock.c
@@ -1783,10 +1783,12 @@ int __init gfs2_glock_init(void)
1783 } 1783 }
1784#endif 1784#endif
1785 1785
1786 glock_workqueue = create_workqueue("glock_workqueue"); 1786 glock_workqueue = alloc_workqueue("glock_workqueue", WQ_RESCUER |
1787 WQ_HIGHPRI | WQ_FREEZEABLE, 0);
1787 if (IS_ERR(glock_workqueue)) 1788 if (IS_ERR(glock_workqueue))
1788 return PTR_ERR(glock_workqueue); 1789 return PTR_ERR(glock_workqueue);
1789 gfs2_delete_workqueue = create_workqueue("delete_workqueue"); 1790 gfs2_delete_workqueue = alloc_workqueue("delete_workqueue", WQ_RESCUER |
1791 WQ_FREEZEABLE, 0);
1790 if (IS_ERR(gfs2_delete_workqueue)) { 1792 if (IS_ERR(gfs2_delete_workqueue)) {
1791 destroy_workqueue(glock_workqueue); 1793 destroy_workqueue(glock_workqueue);
1792 return PTR_ERR(gfs2_delete_workqueue); 1794 return PTR_ERR(gfs2_delete_workqueue);
diff --git a/fs/gfs2/main.c b/fs/gfs2/main.c
index b1e9630eb46a..1c8bbf29e602 100644
--- a/fs/gfs2/main.c
+++ b/fs/gfs2/main.c
@@ -140,7 +140,7 @@ static int __init init_gfs2_fs(void)
140 140
141 error = -ENOMEM; 141 error = -ENOMEM;
142 gfs_recovery_wq = alloc_workqueue("gfs_recovery", 142 gfs_recovery_wq = alloc_workqueue("gfs_recovery",
143 WQ_NON_REENTRANT | WQ_RESCUER, 0); 143 WQ_RESCUER | WQ_FREEZEABLE, 0);
144 if (!gfs_recovery_wq) 144 if (!gfs_recovery_wq)
145 goto fail_wq; 145 goto fail_wq;
146 146