aboutsummaryrefslogtreecommitdiffstats
path: root/fs/aio.c
diff options
context:
space:
mode:
authorTejun Heo <tj@kernel.org>2018-03-14 15:45:15 -0400
committerTejun Heo <tj@kernel.org>2018-03-19 13:12:03 -0400
commitf729863a8c9693527257e63975f615b53ee7622e (patch)
tree1ebcd741e6919ed9935c7ed54875623ef8584515 /fs/aio.c
parent8f36aaec9c929f2864196b0799203491f6a67dc6 (diff)
fs/aio: Use rcu_work instead of explicit rcu and work item
Workqueue now has rcu_work. Use it instead of open-coding rcu -> work item bouncing. Signed-off-by: Tejun Heo <tj@kernel.org>
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/*