diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2018-04-03 18:00:13 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2018-04-03 18:00:13 -0700 |
commit | d92cd810e64aa7cf22b05f0ea1c7d3e8dbae75fe (patch) | |
tree | 592e040010a30d1dbce4e54eb597011af0df290e /fs | |
parent | a23867f1d2de572f84b459651dfe99fa9e79fadf (diff) | |
parent | f75da8a8a918d7c343a2ec95d1ed99e5689e0f23 (diff) | |
download | linux-stable-d92cd810e64aa7cf22b05f0ea1c7d3e8dbae75fe.tar.gz linux-stable-d92cd810e64aa7cf22b05f0ea1c7d3e8dbae75fe.tar.bz2 linux-stable-d92cd810e64aa7cf22b05f0ea1c7d3e8dbae75fe.zip |
Merge branch 'for-4.17' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/wq
Pull workqueue updates from Tejun Heo:
"rcu_work addition and a couple trivial changes"
* 'for-4.17' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/wq:
workqueue: remove the comment about the old manager_arb mutex
workqueue: fix the comments of nr_idle
fs/aio: Use rcu_work instead of explicit rcu and work item
cgroup: Use rcu_work instead of explicit rcu and work item
RCU, workqueue: Implement rcu_work
Diffstat (limited to 'fs')
-rw-r--r-- | fs/aio.c | 21 |
1 files changed, 6 insertions, 15 deletions
@@ -115,8 +115,7 @@ struct kioctx { struct page **ring_pages; long nr_pages; - struct rcu_head free_rcu; - struct work_struct free_work; /* see free_ioctx() */ + struct rcu_work free_rwork; /* see free_ioctx() */ /* * signals when all in-flight requests are done @@ -592,13 +591,12 @@ static int kiocb_cancel(struct aio_kiocb *kiocb) /* * free_ioctx() should be RCU delayed to synchronize against the RCU * protected lookup_ioctx() and also needs process context to call - * aio_free_ring(), so the double bouncing through kioctx->free_rcu and - * ->free_work. + * aio_free_ring(). Use rcu_work. */ static void free_ioctx(struct work_struct *work) { - struct kioctx *ctx = container_of(work, struct kioctx, free_work); - + struct kioctx *ctx = container_of(to_rcu_work(work), struct kioctx, + free_rwork); pr_debug("freeing %p\n", ctx); aio_free_ring(ctx); @@ -608,14 +606,6 @@ static void free_ioctx(struct work_struct *work) kmem_cache_free(kioctx_cachep, ctx); } -static void free_ioctx_rcufn(struct rcu_head *head) -{ - struct kioctx *ctx = container_of(head, struct kioctx, free_rcu); - - INIT_WORK(&ctx->free_work, free_ioctx); - schedule_work(&ctx->free_work); -} - static void free_ioctx_reqs(struct percpu_ref *ref) { struct kioctx *ctx = container_of(ref, struct kioctx, reqs); @@ -625,7 +615,8 @@ static void free_ioctx_reqs(struct percpu_ref *ref) complete(&ctx->rq_wait->comp); /* Synchronize against RCU protected table->table[] dereferences */ - call_rcu(&ctx->free_rcu, free_ioctx_rcufn); + INIT_RCU_WORK(&ctx->free_rwork, free_ioctx); + queue_rcu_work(system_wq, &ctx->free_rwork); } /* |