summaryrefslogtreecommitdiffstats
path: root/fs/aio.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2018-04-03 21:00:13 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2018-04-03 21:00:13 -0400
commitd92cd810e64aa7cf22b05f0ea1c7d3e8dbae75fe (patch)
tree592e040010a30d1dbce4e54eb597011af0df290e /fs/aio.c
parenta23867f1d2de572f84b459651dfe99fa9e79fadf (diff)
parentf75da8a8a918d7c343a2ec95d1ed99e5689e0f23 (diff)
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/aio.c')
-rw-r--r--fs/aio.c21
1 files changed, 6 insertions, 15 deletions
diff --git a/fs/aio.c b/fs/aio.c
index 6bcd3fb5265a..88d7927ffbc6 100644
--- a/fs/aio.c
+++ b/fs/aio.c
@@ -115,8 +115,7 @@ struct kioctx {
115 struct page **ring_pages; 115 struct page **ring_pages;
116 long nr_pages; 116 long nr_pages;
117 117
118 struct rcu_head free_rcu; 118 struct rcu_work free_rwork; /* see free_ioctx() */
119 struct work_struct free_work; /* see free_ioctx() */
120 119
121 /* 120 /*
122 * signals when all in-flight requests are done 121 * signals when all in-flight requests are done
@@ -592,13 +591,12 @@ static int kiocb_cancel(struct aio_kiocb *kiocb)
592/* 591/*
593 * free_ioctx() should be RCU delayed to synchronize against the RCU 592 * free_ioctx() should be RCU delayed to synchronize against the RCU
594 * protected lookup_ioctx() and also needs process context to call 593 * protected lookup_ioctx() and also needs process context to call
595 * aio_free_ring(), so the double bouncing through kioctx->free_rcu and 594 * aio_free_ring(). Use rcu_work.
596 * ->free_work.
597 */ 595 */
598static void free_ioctx(struct work_struct *work) 596static void free_ioctx(struct work_struct *work)
599{ 597{
600 struct kioctx *ctx = container_of(work, struct kioctx, free_work); 598 struct kioctx *ctx = container_of(to_rcu_work(work), struct kioctx,
601 599 free_rwork);
602 pr_debug("freeing %p\n", ctx); 600 pr_debug("freeing %p\n", ctx);
603 601
604 aio_free_ring(ctx); 602 aio_free_ring(ctx);
@@ -608,14 +606,6 @@ static void free_ioctx(struct work_struct *work)
608 kmem_cache_free(kioctx_cachep, ctx); 606 kmem_cache_free(kioctx_cachep, ctx);
609} 607}
610 608
611static void free_ioctx_rcufn(struct rcu_head *head)
612{
613 struct kioctx *ctx = container_of(head, struct kioctx, free_rcu);
614
615 INIT_WORK(&ctx->free_work, free_ioctx);
616 schedule_work(&ctx->free_work);
617}
618
619static void free_ioctx_reqs(struct percpu_ref *ref) 609static void free_ioctx_reqs(struct percpu_ref *ref)
620{ 610{
621 struct kioctx *ctx = container_of(ref, struct kioctx, reqs); 611 struct kioctx *ctx = container_of(ref, struct kioctx, reqs);
@@ -625,7 +615,8 @@ static void free_ioctx_reqs(struct percpu_ref *ref)
625 complete(&ctx->rq_wait->comp); 615 complete(&ctx->rq_wait->comp);
626 616
627 /* Synchronize against RCU protected table->table[] dereferences */ 617 /* Synchronize against RCU protected table->table[] dereferences */
628 call_rcu(&ctx->free_rcu, free_ioctx_rcufn); 618 INIT_RCU_WORK(&ctx->free_rwork, free_ioctx);
619 queue_rcu_work(system_wq, &ctx->free_rwork);
629} 620}
630 621
631/* 622/*