From: Tejun Heo <tj@kernel.org>
To: axboe@kernel.dk
Cc: shli@kernel.org, linux-kernel@vger.kernel.org,
kernel-team@fb.com, lizefan@huawei.com, hannes@cmpxchg.org,
cgroups@vger.kernel.org, guro@fb.com, Tejun Heo <tj@kernel.org>
Subject: [PATCH 2/7] blkcg: use percpu_ref for blkcg_gq->refcnt
Date: Sun, 12 Nov 2017 14:26:08 -0800 [thread overview]
Message-ID: <20171112222613.3613362-3-tj@kernel.org> (raw)
In-Reply-To: <20171112222613.3613362-1-tj@kernel.org>
blkcg_gq->refcnt is an atomic_t. This was due to the following two
reasons.
* When blkcg_gq was added, the percpu memory allocator didn't support
allocations from !GFP_KERNEL contexts. Because blkcg_gq's are
created from IO issue paths, it couldn't use GFP_KERNEL allocations.
* A blkcg_gq represents the connection between a cgroup and a
request_queue. Because a in-flight bio already pins both, blkcg_gq
didn't usually need explicit pinning, making the use of atomic_t
acceptable albeit restrictive and fragile.
Now that the percpu allocator supports !GFP_KERNEL allocations,
there's no reason to keep using atomic_t refcnt. This will allow
clean separation between bio and request layers helping blkcg support
in blk-mq.
Signed-off-by: Tejun Heo <tj@kernel.org>
---
block/blk-cgroup.c | 21 ++++++++++++++++-----
include/linux/blk-cgroup.h | 13 ++++---------
2 files changed, 20 insertions(+), 14 deletions(-)
diff --git a/block/blk-cgroup.c b/block/blk-cgroup.c
index 6482be5..60a4486 100644
--- a/block/blk-cgroup.c
+++ b/block/blk-cgroup.c
@@ -78,6 +78,7 @@ static void blkg_free(struct blkcg_gq *blkg)
blkg_rwstat_exit(&blkg->stat_ios);
blkg_rwstat_exit(&blkg->stat_bytes);
+ percpu_ref_exit(&blkg->refcnt);
kfree(blkg);
}
@@ -89,7 +90,7 @@ static void blkg_free(struct blkcg_gq *blkg)
* Having a reference to blkg under an rcu allows accesses to only values
* local to groups like group stats and group rate limits.
*/
-void __blkg_release_rcu(struct rcu_head *rcu_head)
+static void blkg_release_rcu(struct rcu_head *rcu_head)
{
struct blkcg_gq *blkg = container_of(rcu_head, struct blkcg_gq, rcu_head);
@@ -102,7 +103,13 @@ void __blkg_release_rcu(struct rcu_head *rcu_head)
blkg_free(blkg);
}
-EXPORT_SYMBOL_GPL(__blkg_release_rcu);
+
+static void blkg_release(struct percpu_ref *refcnt)
+{
+ struct blkcg_gq *blkg = container_of(refcnt, struct blkcg_gq, refcnt);
+
+ call_rcu(&blkg->rcu_head, blkg_release_rcu);
+}
/**
* blkg_alloc - allocate a blkg
@@ -123,6 +130,11 @@ static struct blkcg_gq *blkg_alloc(struct blkcg *blkcg, struct request_queue *q,
if (!blkg)
return NULL;
+ if (percpu_ref_init(&blkg->refcnt, blkg_release, 0, gfp_mask)) {
+ kfree(blkg);
+ return NULL;
+ }
+
if (blkg_rwstat_init(&blkg->stat_bytes, gfp_mask) ||
blkg_rwstat_init(&blkg->stat_ios, gfp_mask))
goto err_free;
@@ -130,7 +142,6 @@ static struct blkcg_gq *blkg_alloc(struct blkcg *blkcg, struct request_queue *q,
blkg->q = q;
INIT_LIST_HEAD(&blkg->q_node);
blkg->blkcg = blkcg;
- atomic_set(&blkg->refcnt, 1);
/* root blkg uses @q->root_rl, init rl only for !root blkgs */
if (blkcg != &blkcg_root) {
@@ -266,7 +277,7 @@ static struct blkcg_gq *blkg_create(struct blkcg *blkcg,
return blkg;
/* @blkg failed fully initialized, use the usual release path */
- blkg_put(blkg);
+ percpu_ref_kill(&blkg->refcnt);
return ERR_PTR(ret);
err_put_congested:
@@ -373,7 +384,7 @@ static void blkg_destroy(struct blkcg_gq *blkg)
* Put the reference taken at the time of creation so that when all
* queues are gone, group can be destroyed.
*/
- blkg_put(blkg);
+ percpu_ref_kill(&blkg->refcnt);
}
/**
diff --git a/include/linux/blk-cgroup.h b/include/linux/blk-cgroup.h
index 8bbc371..c0d4736 100644
--- a/include/linux/blk-cgroup.h
+++ b/include/linux/blk-cgroup.h
@@ -19,7 +19,7 @@
#include <linux/seq_file.h>
#include <linux/radix-tree.h>
#include <linux/blkdev.h>
-#include <linux/atomic.h>
+#include <linux/percpu-refcount.h>
/* percpu_counter batch for blkg_[rw]stats, per-cpu drift doesn't matter */
#define BLKG_STAT_CPU_BATCH (INT_MAX / 2)
@@ -123,7 +123,7 @@ struct blkcg_gq {
struct request_list rl;
/* reference count */
- atomic_t refcnt;
+ struct percpu_ref refcnt;
/* is this blkg online? protected by both blkcg and q locks */
bool online;
@@ -355,21 +355,16 @@ static inline int blkg_path(struct blkcg_gq *blkg, char *buf, int buflen)
*/
static inline void blkg_get(struct blkcg_gq *blkg)
{
- WARN_ON_ONCE(atomic_read(&blkg->refcnt) <= 0);
- atomic_inc(&blkg->refcnt);
+ percpu_ref_get(&blkg->refcnt);
}
-void __blkg_release_rcu(struct rcu_head *rcu);
-
/**
* blkg_put - put a blkg reference
* @blkg: blkg to put
*/
static inline void blkg_put(struct blkcg_gq *blkg)
{
- WARN_ON_ONCE(atomic_read(&blkg->refcnt) <= 0);
- if (atomic_dec_and_test(&blkg->refcnt))
- call_rcu(&blkg->rcu_head, __blkg_release_rcu);
+ percpu_ref_put(&blkg->refcnt);
}
/**
--
2.9.5
next prev parent reply other threads:[~2017-11-12 22:26 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-11-12 22:26 [PATCHSET] blkcg: basic accounting and throttling fixes Tejun Heo
2017-11-12 22:26 ` Tejun Heo
2017-11-12 22:26 ` [PATCH 1/7] blkcg: relocate __blkg_release_rcu() Tejun Heo
[not found] ` <20171112222613.3613362-2-tj-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
2017-11-14 23:12 ` Shaohua Li
2017-11-14 23:12 ` Shaohua Li
2017-11-12 22:26 ` Tejun Heo [this message]
[not found] ` <20171112222613.3613362-3-tj-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
2017-11-14 23:12 ` [PATCH 2/7] blkcg: use percpu_ref for blkcg_gq->refcnt Shaohua Li
2017-11-14 23:12 ` Shaohua Li
2017-11-12 22:26 ` [PATCH 3/7] blkcg: associate a request with its blkcg_gq instead of request_list Tejun Heo
2017-11-13 20:15 ` [PATCH v2 " Tejun Heo
2017-11-13 20:15 ` Tejun Heo
[not found] ` <20171113201523.GM983427-4dN5La/x3IkLX0oZNxdnEQ2O0Ztt9esIQQ4Iyu8u01E@public.gmane.org>
2017-11-14 23:17 ` Shaohua Li
2017-11-14 23:17 ` Shaohua Li
2017-11-15 17:11 ` Tejun Heo
2017-11-12 22:26 ` [PATCH 4/7] blkcg: refactor blkcg_gq lookup and creation in blkcg_bio_issue_check() Tejun Heo
[not found] ` <20171112222613.3613362-5-tj-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
2017-11-14 23:18 ` Shaohua Li
2017-11-14 23:18 ` Shaohua Li
[not found] ` <20171112222613.3613362-1-tj-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
2017-11-12 22:26 ` [PATCH 5/7] blkcg: associate blk-mq requests with the matching blkcg_gqs Tejun Heo
2017-11-12 22:26 ` Tejun Heo
2017-11-12 22:26 ` [PATCH 6/7] blkcg: account requests instead of bios for request based request_queues Tejun Heo
[not found] ` <20171112222613.3613362-7-tj-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
2017-11-14 23:23 ` Shaohua Li
2017-11-14 23:23 ` Shaohua Li
[not found] ` <20171114232355.vjxlzfbqbqj5ihq4-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
2017-11-15 17:18 ` [PATCH v2 " Tejun Heo
2017-11-15 17:18 ` Tejun Heo
2017-11-15 17:19 ` [PATCH " Jens Axboe
2017-11-15 17:19 ` Jens Axboe
[not found] ` <9a2ddc6a-d618-a896-290c-254ffeb5e9d6-tSWWG44O7X1aa/9Udqfwiw@public.gmane.org>
2017-11-15 17:22 ` [PATCH v3 " Tejun Heo
2017-11-15 17:22 ` Tejun Heo
2017-11-12 22:26 ` [PATCH 7/7] blk-throtl: don't throttle the same IO multiple times Tejun Heo
[not found] ` <20171112222613.3613362-8-tj-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
2017-11-13 4:07 ` Shaohua Li
2017-11-13 4:07 ` Shaohua Li
[not found] ` <20171113040716.kaheegc4qub42n6z-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
2017-11-13 11:13 ` Tejun Heo
2017-11-13 11:13 ` Tejun Heo
[not found] ` <20171113111348.GF983427-4dN5La/x3IkLX0oZNxdnEQ2O0Ztt9esIQQ4Iyu8u01E@public.gmane.org>
2017-11-13 15:57 ` Tejun Heo
2017-11-13 15:57 ` Tejun Heo
[not found] ` <20171113155745.GI983427-4dN5La/x3IkLX0oZNxdnEQ2O0Ztt9esIQQ4Iyu8u01E@public.gmane.org>
2017-11-13 19:54 ` Shaohua Li
2017-11-13 19:54 ` Shaohua Li
[not found] ` <20171113195413.b5lzqem2pt2bg4oe-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
2017-11-13 19:58 ` Tejun Heo
2017-11-13 19:58 ` Tejun Heo
2017-11-13 19:58 ` Shaohua Li
2017-11-13 19:58 ` Shaohua Li
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20171112222613.3613362-3-tj@kernel.org \
--to=tj@kernel.org \
--cc=axboe@kernel.dk \
--cc=cgroups@vger.kernel.org \
--cc=guro@fb.com \
--cc=hannes@cmpxchg.org \
--cc=kernel-team@fb.com \
--cc=linux-kernel@vger.kernel.org \
--cc=lizefan@huawei.com \
--cc=shli@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.