Received: by 2002:a05:6a10:1a4d:0:0:0:0 with SMTP id nk13csp4625183pxb; Sat, 12 Feb 2022 11:50:00 -0800 (PST) X-Google-Smtp-Source: ABdhPJzsQ04s/os+h+QdzXSMWqRZ+//whVIgGgrnSItoqNvPcm248W0JNCymG7yEr/yNp0xgAVGt X-Received: by 2002:a05:6402:23a7:: with SMTP id j39mr7750886eda.317.1644695400577; Sat, 12 Feb 2022 11:50:00 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1644695400; cv=none; d=google.com; s=arc-20160816; b=Nq3uWImHNTWu2UCstQZHEQVePyS0Q+ftlLAG8zuiTYTZKG0zpSKUHBq2DtW2eJrL8q frLbrJx+w+mvdj3gGW1NFf27zB1QNASsUDo21VOC/ApS/NCCd8AHuzqU0qtSR5KVDqV3 61P/vyF1Q1+if8lKEgc/GTQLss5Zb5zPifgiWZau93nfpL0+7+KuuAqUd6ykjymiJHwL uTl9fIUCumFKcLCNUV5GpgSUEiT+thiWtFvk3AluAZ1x0wvFxsK4Irf1DKXh6ee+QD6H fujigdXpKV132yiTD0q1zJhbBWQKg+CI9sFTDqXFbNgACM+ovWYlIFnpvZL7WeCPhY/y h53w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from; bh=1luDY71unBzQjQl41E6Ym8KZFiPy85z9g2rDoDInAzo=; b=I2l/Qo2UeabWEaRb+YjcXWCBOmg0wm2NyhMpXeOwrur2PMNUdYRlKWzcW/dy2KEFOd An+KgZYKryPM3u4TKl9/OG3cbXCGAIJEa9L2oifkGTJLwM+sTI/yZlYGjs1E+DgcEIfn 1PJEAQSLPvGwyg5ZmLJ77tSK76qho1ORKSAnH5naUr/Q9PdgqMm6nle1O7eWH1AKGnYU 9iZEgXacL9Iz5DTwqB9XyIfvTQOC7+ku5+g5c2iib8e2RD33y1rVToNjj0/wigW6pbDq gdXiAHxGyFRqek2FNDI/iVUEf/B3rWvlMyrVmUuectLUNCaVejLdIwIY8EgiravhGnZE yRNw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=huawei.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id gs33si4060573ejc.556.2022.02.12.11.49.34; Sat, 12 Feb 2022 11:50:00 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=huawei.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S241082AbiBJLkq (ORCPT + 97 others); Thu, 10 Feb 2022 06:40:46 -0500 Received: from mxb-00190b01.gslb.pphosted.com ([23.128.96.19]:41704 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S241058AbiBJLko (ORCPT ); Thu, 10 Feb 2022 06:40:44 -0500 Received: from szxga08-in.huawei.com (szxga08-in.huawei.com [45.249.212.255]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3913BFF0; Thu, 10 Feb 2022 03:40:45 -0800 (PST) Received: from kwepemi100001.china.huawei.com (unknown [172.30.72.56]) by szxga08-in.huawei.com (SkyGuard) with ESMTP id 4JvZT763HKz1FCY9; Thu, 10 Feb 2022 19:36:27 +0800 (CST) Received: from kwepemm600009.china.huawei.com (7.193.23.164) by kwepemi100001.china.huawei.com (7.221.188.215) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.21; Thu, 10 Feb 2022 19:40:41 +0800 Received: from huawei.com (10.175.127.227) by kwepemm600009.china.huawei.com (7.193.23.164) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.21; Thu, 10 Feb 2022 19:40:40 +0800 From: Yu Kuai To: , , CC: , , , , Subject: [PATCH v9] block: cancel all throttled bios in del_gendisk() Date: Thu, 10 Feb 2022 19:56:37 +0800 Message-ID: <20220210115637.1074927-1-yukuai3@huawei.com> X-Mailer: git-send-email 2.31.1 MIME-Version: 1.0 Content-Transfer-Encoding: 7BIT Content-Type: text/plain; charset=US-ASCII X-Originating-IP: [10.175.127.227] X-ClientProxiedBy: dggems701-chm.china.huawei.com (10.3.19.178) To kwepemm600009.china.huawei.com (7.193.23.164) X-CFilter-Loop: Reflected X-Spam-Status: No, score=-4.2 required=5.0 tests=BAYES_00,RCVD_IN_DNSWL_MED, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Throttled bios can't be issued after del_gendisk() is done, thus it's better to cancel them immediately rather than waiting for throttle is done. For example, if user thread is throttled with low bps while it's issuing large io, and the device is deleted. The user thread will wait for a long time for io to return. Signed-off-by: Yu Kuai --- Changes in v9: - some minor changes as suggested by Ming. Changes in v8: - fold two patches into one Changes in v7: - use the new solution as suggested by Ming. block/blk-throttle.c | 44 +++++++++++++++++++++++++++++++++++++++++--- block/blk-throttle.h | 2 ++ block/genhd.c | 2 ++ 3 files changed, 45 insertions(+), 3 deletions(-) diff --git a/block/blk-throttle.c b/block/blk-throttle.c index 7c462c006b26..ca92e5fa2769 100644 --- a/block/blk-throttle.c +++ b/block/blk-throttle.c @@ -43,8 +43,12 @@ static struct workqueue_struct *kthrotld_workqueue; enum tg_state_flags { - THROTL_TG_PENDING = 1 << 0, /* on parent's pending tree */ - THROTL_TG_WAS_EMPTY = 1 << 1, /* bio_lists[] became non-empty */ + /* on parent's pending tree */ + THROTL_TG_PENDING = 1 << 0, + /* bio_lists[] became non-empty */ + THROTL_TG_WAS_EMPTY = 1 << 1, + /* starts to cancel all bios, will be set if the disk is deleted */ + THROTL_TG_CANCELING = 1 << 2, }; #define rb_entry_tg(node) rb_entry((node), struct throtl_grp, rb_node) @@ -871,7 +875,8 @@ static bool tg_may_dispatch(struct throtl_grp *tg, struct bio *bio, bio != throtl_peek_queued(&tg->service_queue.queued[rw])); /* If tg->bps = -1, then BW is unlimited */ - if (bps_limit == U64_MAX && iops_limit == UINT_MAX) { + if ((bps_limit == U64_MAX && iops_limit == UINT_MAX) || + tg->flags & THROTL_TG_CANCELING) { if (wait) *wait = 0; return true; @@ -1763,6 +1768,39 @@ static bool throtl_hierarchy_can_upgrade(struct throtl_grp *tg) return false; } +void blk_throtl_cancel_bios(struct request_queue *q) +{ + struct cgroup_subsys_state *pos_css; + struct blkcg_gq *blkg; + + spin_lock_irq(&q->queue_lock); + /* + * queue_lock is held, rcu lock is not needed here technically. + * However, rcu lock is still held to emphasize that following + * path need RCU protection and to prevent warning from lockdep. + */ + rcu_read_lock(); + blkg_for_each_descendant_post(blkg, pos_css, q->root_blkg) { + struct throtl_grp *tg = blkg_to_tg(blkg); + struct throtl_service_queue *sq = &tg->service_queue; + + /* + * Set the flag to make sure throtl_pending_timer_fn() won't + * stop until all throttled bios are dispatched. + */ + blkg_to_tg(blkg)->flags |= THROTL_TG_CANCELING; + /* + * Update disptime after setting the above flag to make sure + * throtl_select_dispatch() won't exit without dispatching. + */ + tg_update_disptime(tg); + + throtl_schedule_pending_timer(sq, jiffies + 1); + } + rcu_read_unlock(); + spin_unlock_irq(&q->queue_lock); +} + static bool throtl_can_upgrade(struct throtl_data *td, struct throtl_grp *this_tg) { diff --git a/block/blk-throttle.h b/block/blk-throttle.h index 175f03abd9e4..2ae467ac17ea 100644 --- a/block/blk-throttle.h +++ b/block/blk-throttle.h @@ -160,12 +160,14 @@ static inline void blk_throtl_exit(struct request_queue *q) { } static inline void blk_throtl_register_queue(struct request_queue *q) { } static inline void blk_throtl_charge_bio_split(struct bio *bio) { } static inline bool blk_throtl_bio(struct bio *bio) { return false; } +static inline void blk_throtl_cancel_bios(struct request_queue *q) { } #else /* CONFIG_BLK_DEV_THROTTLING */ int blk_throtl_init(struct request_queue *q); void blk_throtl_exit(struct request_queue *q); void blk_throtl_register_queue(struct request_queue *q); void blk_throtl_charge_bio_split(struct bio *bio); bool __blk_throtl_bio(struct bio *bio); +void blk_throtl_cancel_bios(struct request_queue *q); static inline bool blk_throtl_bio(struct bio *bio) { struct throtl_grp *tg = blkg_to_tg(bio->bi_blkg); diff --git a/block/genhd.c b/block/genhd.c index 9589d1d59afa..6acc98cd0365 100644 --- a/block/genhd.c +++ b/block/genhd.c @@ -29,6 +29,7 @@ #include "blk.h" #include "blk-mq-sched.h" #include "blk-rq-qos.h" +#include "blk-throttle.h" static struct kobject *block_depr; @@ -625,6 +626,7 @@ void del_gendisk(struct gendisk *disk) blk_mq_freeze_queue_wait(q); + blk_throtl_cancel_bios(disk->queue); rq_qos_exit(q); blk_sync_queue(q); blk_flush_integrity(); -- 2.31.1