diff options
author | Tejun Heo <tj@kernel.org> | 2018-03-14 15:45:15 -0400 |
---|---|---|
committer | Tejun Heo <tj@kernel.org> | 2018-03-19 13:12:03 -0400 |
commit | f729863a8c9693527257e63975f615b53ee7622e (patch) | |
tree | 1ebcd741e6919ed9935c7ed54875623ef8584515 /fs/aio.c | |
parent | 8f36aaec9c929f2864196b0799203491f6a67dc6 (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.c | 21 |
1 files changed, 6 insertions, 15 deletions
@@ -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 | */ |
598 | static void free_ioctx(struct work_struct *work) | 596 | static 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 | ||
611 | static 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 | |||
619 | static void free_ioctx_reqs(struct percpu_ref *ref) | 609 | static 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 | /* |