Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp461474imu; Mon, 26 Nov 2018 13:23:36 -0800 (PST) X-Google-Smtp-Source: AJdET5chTbUcpoKM01uIS/2tIrApEr28RD9ioGzP1ZKW1vYQQic/fKoi5O2/tLs4jbIXAVwL/jpP X-Received: by 2002:a63:4566:: with SMTP id u38mr26545153pgk.4.1543267416908; Mon, 26 Nov 2018 13:23:36 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1543267416; cv=none; d=google.com; s=arc-20160816; b=iEK2kP927kP1PqtieOD8Qd4R2SJ+Exe88x5uj1dqpYwUWBkK6KM4q5yqxUpqvoqt2j 65Lk3U/1UmHGkSpDTlpj+yX8zfZxKsaXATKmRt7wR3ck5mAvWgnJMi2RalbemdE7LYQ7 4ziWZcSf+Ck7Zt5yeZp05jbfer2Expn90E3J9qULPvnqwhOMIRQgGzQ5V+lIsa92ksVU tIlqdrTmLXlH/Dt+SP+Nq0COZol9VvKtcDKvWlXnrW/6K3IJaGYJ1amKc5D1gPerkItj j45ntQT/HbeS/QS0kDe3Ar9QlVa+kp1TxI+R6PTUrJOr2ZgTnYehqVbcwk371ZmpLTRS NOFQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from; bh=gP/C9ys/Mqfj+3mExxovAotTitY6XkzhFUujBY1Qrdo=; b=tkXC4Hros3lCZWnGhDzE7IL7gfCwmgUjtiSOyrAS7P69KOgsgdfdc1HUeKp8vJCKa8 cZaS3YoUJK2Ec1dg30BPpzpVWyQM3IpYWY8HWS+0mD8tKtv0VoU6TP6NT6Vs662Bc/oZ 3rwJzpDviua9p54dVcTQS9CGluLHY48KZNfCL9UyZju1ulKswMvNpHxtVD77eh769Y7s AiPEXsb1wF1B2CLsiX8ukkJzUOd3lUd8K44BE9Ssn7qGScE6si98y6l27puupfPN87Ng zZC9NrxsnIeONjsJBVsyneKKoA2Wk3K7y7nMGBdQA6J0QtR9AATds1LxBnmrzLj1DAlU 0xXw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id e1-v6si1437427ple.148.2018.11.26.13.23.21; Mon, 26 Nov 2018 13:23:36 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727428AbeK0IPZ (ORCPT + 99 others); Tue, 27 Nov 2018 03:15:25 -0500 Received: from mail-yb1-f195.google.com ([209.85.219.195]:38598 "EHLO mail-yb1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726296AbeK0IPY (ORCPT ); Tue, 27 Nov 2018 03:15:24 -0500 Received: by mail-yb1-f195.google.com with SMTP id u103-v6so8141711ybi.5; Mon, 26 Nov 2018 13:19:57 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=gP/C9ys/Mqfj+3mExxovAotTitY6XkzhFUujBY1Qrdo=; b=AiFkzZDJ33kftzJXCua1TwZshx/PshFmcoKlOvEcFJoJayQQmqGiMWF1Cqegj8BnHi VG3MQ1ENma23Ef9iBe47k8Ipei8b4V9jLb4SBejSFyf6CBqlxYvKoYGQ9pDc2EA5TV0M EJx0AyAbqaIBlpGqRvfKQLRQJSlEE3MF1GTIuXMVba8bWEZJY9F2ps6c0H+Ys9NhU9gl GfysbrB8BtH77BWMZE5XlakaIPTD4rcmQtQ7lI0ir+l9lbeJ7wtw77ytbIGIh4z3VIPv itZ10dSsFmrBf6G8fp/OblcVvSxv9SztKf0BRjhSKsBhMEbUWNRsMi2U2Dn5ehqleMhz 5Ysg== X-Gm-Message-State: AA+aEWZ5XucGEbvtgjOeRaxqyxFj7lDtAE4GVd5j9E9EmMS7DdIXApn8 M5am/Tzi3LzZFOeu4gOX2WI= X-Received: by 2002:a25:185:: with SMTP id 127-v6mr29503345ybb.257.1543267196956; Mon, 26 Nov 2018 13:19:56 -0800 (PST) Received: from dennisz-mbp.thefacebook.com ([199.201.65.135]) by smtp.gmail.com with ESMTPSA id d135-v6sm495462ywh.43.2018.11.26.13.19.55 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 26 Nov 2018 13:19:56 -0800 (PST) From: Dennis Zhou To: Jens Axboe , Tejun Heo , Johannes Weiner , Josef Bacik Cc: kernel-team@fb.com, linux-block@vger.kernel.org, cgroups@vger.kernel.org, linux-kernel@vger.kernel.org, Dennis Zhou Subject: [PATCH 04/13] blkcg: introduce common blkg association logic Date: Mon, 26 Nov 2018 16:19:37 -0500 Message-Id: <20181126211946.77067-5-dennis@kernel.org> X-Mailer: git-send-email 2.13.5 In-Reply-To: <20181126211946.77067-1-dennis@kernel.org> References: <20181126211946.77067-1-dennis@kernel.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org There are 3 ways blkg association can happen: association with the current css, with the page css (swap), or from the wbc css (writeback). This patch handles how association is done for the first case where we are associating bsaed on the current css. If there is already a blkg associated, the css will be reused and association will be redone as the request_queue may have changed. Signed-off-by: Dennis Zhou --- block/bio.c | 81 ++++++++++++++++++++++++++++++++++++++----- block/blk-iolatency.c | 10 ++---- block/blk-throttle.c | 6 ++-- include/linux/bio.h | 5 ++- 4 files changed, 81 insertions(+), 21 deletions(-) diff --git a/block/bio.c b/block/bio.c index edc8a73b98d5..de0133329b71 100644 --- a/block/bio.c +++ b/block/bio.c @@ -2009,7 +2009,34 @@ int bio_associate_blkcg(struct bio *bio, struct cgroup_subsys_state *blkcg_css) EXPORT_SYMBOL_GPL(bio_associate_blkcg); /** - * bio_associate_blkg - associate a bio with the a blkg + * bio_has_queue - required check for blkg association + * @bio: target bio + * + * A blkg represents the relationship between a blkcg and a request_queue. + * If there is no request_queue, there is no blkg and therefore nothing to + * associate with. + */ +static inline bool bio_has_queue(struct bio *bio) +{ + return bio->bi_disk && bio->bi_disk->queue; +} + +/** + * bio_disassociate_blkg - puts back the blkg reference if associated + * @bio: target bio + * + * Helper to disassociate the blkg from @bio if a blkg is associated. + */ +void bio_disassociate_blkg(struct bio *bio) +{ + if (bio->bi_blkg) { + blkg_put(bio->bi_blkg); + bio->bi_blkg = NULL; + } +} + +/** + * __bio_associate_blkg - associate a bio with the a blkg * @bio: target bio * @blkg: the blkg to associate * @@ -2022,12 +2049,48 @@ EXPORT_SYMBOL_GPL(bio_associate_blkcg); * A reference will be taken on the @blkg and will be released when @bio is * freed. */ -int bio_associate_blkg(struct bio *bio, struct blkcg_gq *blkg) +static void __bio_associate_blkg(struct bio *bio, struct blkcg_gq *blkg) { - if (unlikely(bio->bi_blkg)) - return -EBUSY; + if (bio->bi_blkg) + bio_disassociate_blkg(bio); + bio->bi_blkg = blkg_try_get_closest(blkg); - return 0; +} + +/** + * bio_associate_blkg - associate a bio with a blkg from q + * @bio: target bio + * + * Associate @bio with the blkg found from the bio's css and request_queue. + * If one is not found, bio_lookup_blkg() creates the blkg. If a blkg is + * already associated, the css is reused and association redone as the + * request_queue may have changed. + */ +void bio_associate_blkg(struct bio *bio) +{ + struct request_queue *q; + struct blkcg *blkcg; + struct blkcg_gq *blkg; + + if (!bio_has_queue(bio)) + return; + + q = bio->bi_disk->queue; + + rcu_read_lock(); + + bio_associate_blkcg(bio, NULL); + blkcg = bio_blkcg(bio); + + if (!blkcg->css.parent) { + __bio_associate_blkg(bio, q->root_blkg); + } else { + blkg = blkg_lookup_create(blkcg, q); + + __bio_associate_blkg(bio, blkg); + } + + rcu_read_unlock(); } /** @@ -2040,10 +2103,7 @@ void bio_disassociate_task(struct bio *bio) css_put(bio->bi_css); bio->bi_css = NULL; } - if (bio->bi_blkg) { - blkg_put(bio->bi_blkg); - bio->bi_blkg = NULL; - } + bio_disassociate_blkg(bio); } /** @@ -2055,6 +2115,9 @@ void bio_clone_blkcg_association(struct bio *dst, struct bio *src) { if (src->bi_css) WARN_ON(bio_associate_blkcg(dst, src->bi_css)); + + if (src->bi_blkg) + __bio_associate_blkg(dst, src->bi_blkg); } EXPORT_SYMBOL_GPL(bio_clone_blkcg_association); #endif /* CONFIG_BLK_CGROUP */ diff --git a/block/blk-iolatency.c b/block/blk-iolatency.c index 46e86c34cf79..cdbd10564e66 100644 --- a/block/blk-iolatency.c +++ b/block/blk-iolatency.c @@ -472,21 +472,15 @@ static void check_scale_change(struct iolatency_grp *iolat) static void blkcg_iolatency_throttle(struct rq_qos *rqos, struct bio *bio) { struct blk_iolatency *blkiolat = BLKIOLATENCY(rqos); - struct blkcg *blkcg; struct blkcg_gq *blkg; - struct request_queue *q = rqos->q; bool issue_as_root = bio_issue_as_root_blkg(bio); if (!blk_iolatency_enabled(blkiolat)) return; - rcu_read_lock(); - bio_associate_blkcg(bio, NULL); - blkcg = bio_blkcg(bio); - blkg = blkg_lookup_create(blkcg, q); + bio_associate_blkg(bio); + blkg = bio->bi_blkg; bio_issue_init(&bio->bi_issue, bio_sectors(bio)); - bio_associate_blkg(bio, blkg); - rcu_read_unlock(); while (blkg && blkg->parent) { struct iolatency_grp *iolat = blkg_to_lat(blkg); diff --git a/block/blk-throttle.c b/block/blk-throttle.c index d648d6720f46..228c3a007ebc 100644 --- a/block/blk-throttle.c +++ b/block/blk-throttle.c @@ -2115,10 +2115,10 @@ static inline void throtl_update_latency_buckets(struct throtl_data *td) } #endif -static void blk_throtl_assoc_bio(struct throtl_grp *tg, struct bio *bio) +static void blk_throtl_assoc_bio(struct bio *bio) { #ifdef CONFIG_BLK_DEV_THROTTLING_LOW - bio_associate_blkg(bio, tg_to_blkg(tg)); + bio_associate_blkg(bio); bio_issue_init(&bio->bi_issue, bio_sectors(bio)); #endif } @@ -2143,7 +2143,7 @@ bool blk_throtl_bio(struct request_queue *q, struct blkcg_gq *blkg, throtl_update_latency_buckets(td); - blk_throtl_assoc_bio(tg, bio); + blk_throtl_assoc_bio(bio); blk_throtl_update_idletime(tg); sq = &tg->service_queue; diff --git a/include/linux/bio.h b/include/linux/bio.h index 056fb627edb3..62715a5a4f32 100644 --- a/include/linux/bio.h +++ b/include/linux/bio.h @@ -511,12 +511,15 @@ static inline int bio_associate_blkcg_from_page(struct bio *bio, #ifdef CONFIG_BLK_CGROUP int bio_associate_blkcg(struct bio *bio, struct cgroup_subsys_state *blkcg_css); -int bio_associate_blkg(struct bio *bio, struct blkcg_gq *blkg); +void bio_disassociate_blkg(struct bio *bio); +void bio_associate_blkg(struct bio *bio); void bio_disassociate_task(struct bio *bio); void bio_clone_blkcg_association(struct bio *dst, struct bio *src); #else /* CONFIG_BLK_CGROUP */ static inline int bio_associate_blkcg(struct bio *bio, struct cgroup_subsys_state *blkcg_css) { return 0; } +static inline void bio_disassociate_blkg(struct bio *bio) { } +static inline void bio_associate_blkg(struct bio *bio) { } static inline void bio_disassociate_task(struct bio *bio) { } static inline void bio_clone_blkcg_association(struct bio *dst, struct bio *src) { } -- 2.17.1