From patchwork Wed Mar 9 07:40:45 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhaoyang Huang X-Patchwork-Id: 12774807 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5CDA0C433F5 for ; Wed, 9 Mar 2022 07:41:15 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id D85AC8D0015; Wed, 9 Mar 2022 02:41:14 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id D35CB8D0001; Wed, 9 Mar 2022 02:41:14 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id C243E8D0015; Wed, 9 Mar 2022 02:41:14 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (relay.a.hostedemail.com [64.99.140.24]) by kanga.kvack.org (Postfix) with ESMTP id B25B78D0001 for ; Wed, 9 Mar 2022 02:41:14 -0500 (EST) Received: from smtpin13.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id 7BB9223CAD for ; Wed, 9 Mar 2022 07:41:14 +0000 (UTC) X-FDA: 79224052068.13.3A2ECD5 Received: from mail-qv1-f41.google.com (mail-qv1-f41.google.com [209.85.219.41]) by imf15.hostedemail.com (Postfix) with ESMTP id D9686A0002 for ; Wed, 9 Mar 2022 07:41:13 +0000 (UTC) Received: by mail-qv1-f41.google.com with SMTP id gm1so1356548qvb.7 for ; Tue, 08 Mar 2022 23:41:13 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=mime-version:references:in-reply-to:from:date:message-id:subject:to; bh=VZaf/MeKryF+BTlBqQ5utQRz4EsZx6ns2d5kX8BFXPo=; b=U2M2W3bIVB2clsqBUBRCR9wdFGV4rvtGYDycURm9Cuhq39PuXcZL1/fPKZ++lfyzry 6DdFsLab2wMeQBq3IN1mXBZ1J6RsoNHa5DDV697Qgrjd6B0j3S0XUB/VSlDsuvB0ylG2 vl9PzXeJVbQxZDrTogGzDaS7rmq7FeblLURsDw4dOORfQzN/IoM8/cCRTR5fvH+hSBm3 wgwLsrh9l9lRCZKBOMcZAHWxJODwCHxmA58gPIruO4YdPXcYt79Y0aSFjOEZkU8BYYwr UECz+aDz9+7ToijMK0CWrihmLF5dkSXjOWNC3kzQinmWqVp1sE83Q9SHBUNuoe2cWhAA DqpA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to; bh=VZaf/MeKryF+BTlBqQ5utQRz4EsZx6ns2d5kX8BFXPo=; b=eXeDgOldXNYgE+6w2J16dUmIe6h6JM2i4AO3BvXR0ac/694Td1zz+0DXmrp3agApLk xG8S6vVo6/63tnRGQvYiniM++ccvH4PqIOGd5LCbZhkJAieWzKLnHNPKl9zbXWHP1EnS YJ6LXrcrQMFzgvmhJhUgwKROg3vhD/RRmPs8nOk2L1lcBoFG7z6eMCBLltuTjOF+cK7i t+Lt8uPxmefoNXYuoIicC+VjGKSW0ny+syFOColMCSA8r91YmWFYiSSJt++VUrYuqKaz o9luX0cEe8t4ZEwTsZ7W3sFroB6TCtEtqk7Ha4lmmrMA8A/LW6mHnk1BUsfHGbjLADdN Kt/g== X-Gm-Message-State: AOAM533PoDkbPx2fabaOpCqje2Buc36eXPghZ8foWJqmthbwUDBkU/Ny w4dPBLXbqwp8XvQxXDyp7nc2a5QVitVTJ1PaJ1U= X-Google-Smtp-Source: ABdhPJxaktK7n8Mm2flmeWJeF8TioMBXFaIpk3PmcBuVcYlZL0wfktInOyUyXj8+P4z9XF2b327Ocn8YneyzWHHmL6A= X-Received: by 2002:a05:6214:14ea:b0:435:128c:61c8 with SMTP id k10-20020a05621414ea00b00435128c61c8mr15631468qvw.10.1646811673156; Tue, 08 Mar 2022 23:41:13 -0800 (PST) MIME-Version: 1.0 References: <1645174105-31224-1-git-send-email-huangzhaoyang@gmail.com> In-Reply-To: <1645174105-31224-1-git-send-email-huangzhaoyang@gmail.com> From: Zhaoyang Huang Date: Wed, 9 Mar 2022 15:40:45 +0800 Message-ID: Subject: [RFC PATCH] block: set bdi congested when no tag available To: Jens Axboe , "Martin K. Petersen" , Ming Lei , Hannes Reinecke , Bart Van Assche , Zhaoyang Huang , LKML , Andrew Morton , "open list:MEMORY MANAGEMENT" X-Rspamd-Server: rspam05 X-Rspamd-Queue-Id: D9686A0002 X-Rspam-User: Authentication-Results: imf15.hostedemail.com; dkim=pass header.d=gmail.com header.s=20210112 header.b=U2M2W3bI; spf=pass (imf15.hostedemail.com: domain of huangzhaoyang@gmail.com designates 209.85.219.41 as permitted sender) smtp.mailfrom=huangzhaoyang@gmail.com; dmarc=pass (policy=none) header.from=gmail.com X-Stat-Signature: p7nxbka7e8a5j3bnw135bznck44gxcw6 X-HE-Tag: 1646811673-666672 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: From: Zhaoyang Huang In previous version, block layer will set bdi to be congested when get_request fail, which may throttle direct_reclaim. Move them back under current blk-mq design. Signed-off-by: Zhaoyang Huang --- block/blk-mq-tag.c | 18 +++++++++++++++++- include/linux/sbitmap.h | 1 + lib/sbitmap.c | 17 +++++++++++++++++ 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/block/blk-mq-tag.c b/block/blk-mq-tag.c index 995336a..bd1e520 100644 --- a/block/blk-mq-tag.c +++ b/block/blk-mq-tag.c @@ -11,6 +11,7 @@ #include #include +#include #include "blk.h" #include "blk-mq.h" #include "blk-mq-sched.h" @@ -126,8 +127,11 @@ unsigned int blk_mq_get_tag(struct blk_mq_alloc_data *data) if (tag != BLK_MQ_NO_TAG) goto found_tag; - if (data->flags & BLK_MQ_REQ_NOWAIT) + if (data->flags & BLK_MQ_REQ_NOWAIT) { + set_bdi_congested(data->q->disk->bdi,BLK_RW_SYNC); + set_bdi_congested(data->q->disk->bdi,BLK_RW_ASYNC); return BLK_MQ_NO_TAG; + } ws = bt_wait_ptr(bt, data->hctx); do { @@ -193,9 +197,21 @@ unsigned int blk_mq_get_tag(struct blk_mq_alloc_data *data) return tag + tag_offset; } +static bool blk_mq_has_free_tags(struct blk_mq_tags *tags) +{ + if (!tags) + return true; + + return sbitmap_any_bit_clear(&tags->bitmap_tags.sb); +} + void blk_mq_put_tag(struct blk_mq_tags *tags, struct blk_mq_ctx *ctx, unsigned int tag) { + if (!blk_mq_has_free_tags(tags)) { + clear_bdi_congested(ctx->queue->disk->bdi, BLK_RW_SYNC); + clear_bdi_congested(ctx->queue->disk->bdi, BLK_RW_ASYNC); + } if (!blk_mq_tag_is_reserved(tags, tag)) { const int real_tag = tag - tags->nr_reserved_tags; diff --git a/include/linux/sbitmap.h b/include/linux/sbitmap.h index 4a6ff27..30a5553 100644 --- a/include/linux/sbitmap.h +++ b/include/linux/sbitmap.h @@ -210,6 +210,7 @@ static inline void sbitmap_free(struct sbitmap *sb) * Return: true if any bit in the bitmap is set, false otherwise. */ bool sbitmap_any_bit_set(const struct sbitmap *sb); +bool sbitmap_any_bit_clear(const struct sbitmap *sb); #define SB_NR_TO_INDEX(sb, bitnr) ((bitnr) >> (sb)->shift) #define SB_NR_TO_BIT(sb, bitnr) ((bitnr) & ((1U << (sb)->shift) - 1U)) diff --git a/lib/sbitmap.c b/lib/sbitmap.c index 2709ab8..baa30d8 100644 --- a/lib/sbitmap.c +++ b/lib/sbitmap.c @@ -309,6 +309,23 @@ bool sbitmap_any_bit_set(const struct sbitmap *sb) } EXPORT_SYMBOL_GPL(sbitmap_any_bit_set); +bool sbitmap_any_bit_clear(const struct sbitmap *sb) +{ + unsigned int i; + + for (i = 0; i < sb->map_nr; i++) { + const struct sbitmap_word *word = &sb->map[i]; + unsigned long mask = word->word & ~word->cleared; + unsigned long ret; + + ret = find_first_zero_bit(&mask, word->depth); + if (ret < word->depth) + return true; + } + return false; +} +EXPORT_SYMBOL_GPL(sbitmap_any_bit_clear); + static unsigned int __sbitmap_weight(const struct sbitmap *sb, bool set) { unsigned int i, weight = 0;