Received: by 2002:a89:48b:0:b0:1f5:f2ab:c469 with SMTP id a11csp222672lqd; Tue, 23 Apr 2024 23:19:35 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCWNg5ayvNQ1Xb72uri2+WrGF0gmaWHjXlgiseVtAitC9Ihei7DJhkzwzBsKyEPhd6dK9anIAbL2hp3tEvovUD0HRr3JaFHQMz0RgUNCsw== X-Google-Smtp-Source: AGHT+IGGgsDkmQKh/t2cjMF2xcy5LeYHkyO+5X0KI7OoGTbGGc8dg1anL75lDx7GFuNxD6sQgbBu X-Received: by 2002:a05:6a00:2d8e:b0:6ed:e1c:1038 with SMTP id fb14-20020a056a002d8e00b006ed0e1c1038mr1975968pfb.7.1713939575342; Tue, 23 Apr 2024 23:19:35 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1713939575; cv=pass; d=google.com; s=arc-20160816; b=OagbQrn9SxzWnVS7MzajzEyNPjyiGSFSnqWAne3gb8W0dRK6CIvQZalrMDuos70aQf g70MKvRZJJWi60mxHtAhUKQ2baPX5xLFjg4/HvAlufyqin2zIgLI8hCZ32K0990V6EQ/ Xycs+ryFsKef1/m642l5T23pivZCez0sPPiuCTd3HKAbNVDmIaUN6uOH+sRWLqNFVzEj MMI2h9UTQ6foGCF3Tt46R3fd4eZMo2crMo8E7B0RzTCJfNonnhWxHq8RujpL06kUdzVx ooeK8hGilqCVjY2mCPUwLWbpjeVH/C+halNSBlCncBfnPNt5Ki0QAvTbLuU5t7sTxG3W 9FcA== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from; bh=ec1G3EdHc3ss8k4dfAhxFYfbqoJzZQ0eSB2ZRChIQ64=; fh=Z5G3M5yVQcn3WRPSRelxkCIr3KV23nE+kWZvwcIQ304=; b=ul9dBzpg175iOKkJ/6pPCp/OFCIZVj2SSW2b1JorLE+3z4z4WPE+ycJetef535/YBP ZS+VgoINlwTQ71BeyApIcEg1jgB0AG8/HJQv+xVHytDThq8lEEgilfH+9Dl1hEVP+w9u 6AfJLEWhKS0LykhKN5+l0CuZbYnaxWc3LFr/GmKNf5VeDn4aKA0080bncCAusJLyl1Kg MfjMxn7Y+TNjMixOwTIl1v17nyNfTDqXYKp7JYp8I4eu2tKMMOfL6nS45rF3Vo5MkHcK UfVVjkC29XiYbPaAGksahlUZ+si/GgVcAaKBGGdTYEw6klVGyxc9+wl6GPJ9bdE5gcTk KePA==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; arc=pass (i=1 spf=pass spfdomain=huaweicloud.com); spf=pass (google.com: domain of linux-ext4+bounces-2167-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="linux-ext4+bounces-2167-linux.lists.archive=gmail.com@vger.kernel.org" Return-Path: Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [2604:1380:45e3:2400::1]) by mx.google.com with ESMTPS id c17-20020a056a000ad100b006eabaeda14asi11188487pfl.387.2024.04.23.23.19.35 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 23 Apr 2024 23:19:35 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-ext4+bounces-2167-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) client-ip=2604:1380:45e3:2400::1; Authentication-Results: mx.google.com; arc=pass (i=1 spf=pass spfdomain=huaweicloud.com); spf=pass (google.com: domain of linux-ext4+bounces-2167-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="linux-ext4+bounces-2167-linux.lists.archive=gmail.com@vger.kernel.org" Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sv.mirrors.kernel.org (Postfix) with ESMTPS id EF4DA283541 for ; Wed, 24 Apr 2024 06:19:34 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id D58E4156F40; Wed, 24 Apr 2024 06:19:13 +0000 (UTC) X-Original-To: linux-ext4@vger.kernel.org Received: from dggsgout11.his.huawei.com (dggsgout11.his.huawei.com [45.249.212.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7BC4E156C5F; Wed, 24 Apr 2024 06:19:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.51 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713939553; cv=none; b=AJuAG0OsPD3LbAqRLeJ6A9GAOWseVlPQ3zWCTgccWMkybwWaGf6DJli9C8Q9Yjtp735WaSxwrVMTRLLyrNN5nwaBJ1ShxA8opNcoSzbE82rBNdbLce5hO6cdCalVHeQs2X82HmN+mQy3fgPcOksI3FD10d62RsvoXjbESXDMlg4= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713939553; c=relaxed/simple; bh=xrcKKyueyRmWYlrLSjxKDPS0MeWA/AvpTFX4TJN6LYU=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=LALr25LtyaKchOU74LbtgtJ4Ygv97rUA5mqFkX7PuPJjajfnh82TnkZKAa88SqNJGroIwXHa1eJps7JSt8FUXFIo52GyvPAm0fEUGC3hRiUmu/9djSfReEH0QjjFYxK243R5f5HO7Xmta1uVCbQ+xvZWxHjNayCvmhzINV6A6og= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=huaweicloud.com; spf=pass smtp.mailfrom=huaweicloud.com; arc=none smtp.client-ip=45.249.212.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=huaweicloud.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=huaweicloud.com Received: from mail.maildlp.com (unknown [172.19.163.235]) by dggsgout11.his.huawei.com (SkyGuard) with ESMTP id 4VPTMl0n15z4f3n6M; Wed, 24 Apr 2024 14:18:59 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.112]) by mail.maildlp.com (Postfix) with ESMTP id 4D3CF1A0572; Wed, 24 Apr 2024 14:19:08 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.124.27]) by APP1 (Coremail) with SMTP id cCh0CgBHGRJZpChmpfZBKw--.32510S5; Wed, 24 Apr 2024 14:19:08 +0800 (CST) From: Kemeng Shi To: tytso@mit.edu, adilger.kernel@dilger.ca, linux-ext4@vger.kernel.org, linux-kernel@vger.kernel.org Cc: jack@suse.cz, ojaswin@linux.ibm.com, ritesh.list@gmail.com Subject: [PATCH v3 3/5] ext4: call ext4_mb_mark_free_simple to free continuous bits in found chunk Date: Wed, 24 Apr 2024 14:19:02 +0800 Message-Id: <20240424061904.987525-4-shikemeng@huaweicloud.com> X-Mailer: git-send-email 2.30.0 In-Reply-To: <20240424061904.987525-1-shikemeng@huaweicloud.com> References: <20240424061904.987525-1-shikemeng@huaweicloud.com> Precedence: bulk X-Mailing-List: linux-ext4@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-CM-TRANSID:cCh0CgBHGRJZpChmpfZBKw--.32510S5 X-Coremail-Antispam: 1UD129KBjvJXoWxAFy8Jr4rtr15tr17Cr1UAwb_yoW5Zr48pF 43GrW3Gr4rJr929FsrCr1qg34rKw4vyFy5GayfWw1rKFnxAr9Yvr95GrnxZ34kJrWfJ3W0 ya1UurW5Gw47Ka7anT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUvGb4IE77IF4wAFF20E14v26rWj6s0DM7CY07I20VC2zVCF04k2 6cxKx2IYs7xG6rWj6s0DM7CIcVAFz4kK6r1j6r18M28IrcIa0xkI8VA2jI8067AKxVWUWw A2048vs2IY020Ec7CjxVAFwI0_Xr0E3s1l8cAvFVAK0II2c7xJM28CjxkF64kEwVA0rcxS w2x7M28EF7xvwVC0I7IYx2IY67AKxVWDJVCq3wA2z4x0Y4vE2Ix0cI8IcVCY1x0267AKxV W8Jr0_Cr1UM28EF7xvwVC2z280aVAFwI0_GcCE3s1l84ACjcxK6I8E87Iv6xkF7I0E14v2 6rxl6s0DM2AIxVAIcxkEcVAq07x20xvEncxIr21l5I8CrVACY4xI64kE6c02F40Ex7xfMc Ij6xIIjxv20xvE14v26r1j6r18McIj6I8E87Iv67AKxVWUJVW8JwAm72CE4IkC6x0Yz7v_ Jr0_Gr1lF7xvr2IYc2Ij64vIr41l42xK82IYc2Ij64vIr41l4I8I3I0E4IkC6x0Yz7v_Jr 0_Gr1lx2IqxVAqx4xG67AKxVWUJVWUGwC20s026x8GjcxK67AKxVWUGVWUWwC2zVAF1VAY 17CE14v26r126r1DMIIYrxkI7VAKI48JMIIF0xvE2Ix0cI8IcVAFwI0_Jr0_JF4lIxAIcV C0I7IYx2IY6xkF7I0E14v26r4j6F4UMIIF0xvE42xK8VAvwI8IcIk0rVWUJVWUCwCI42IY 6I8E87Iv67AKxVWUJVW8JwCI42IY6I8E87Iv6xkF7I0E14v26r4j6r4UJbIYCTnIWIevJa 73UjIFyTuYvjxUFYFCUUUUU X-CM-SenderInfo: 5vklyvpphqwq5kxd4v5lfo033gof0z/ In mb_mark_used, we will find free chunk and mark it inuse. For chunk in mid of passed range, we could simply mark whole chunk inuse. For chunk at end of range, we may need to mark a continuous bits at end of part of chunk inuse and keep rest part of chunk free. To only mark a part of chunk inuse, we firstly mark whole chunk inuse and then mark a continuous range at end of chunk free. Function mb_mark_used does several times of "mb_find_buddy; mb_clear_bit; ..." to mark a continuous range free which can be done by simply calling ext4_mb_mark_free_simple which free continuous bits in a more effective way. Just call ext4_mb_mark_free_simple in mb_mark_used to use existing and effective code to free continuous blocks in chunk at end of passed range. Signed-off-by: Kemeng Shi --- fs/ext4/mballoc.c | 38 +++++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c index a61fc52956b2..5acf413808a2 100644 --- a/fs/ext4/mballoc.c +++ b/fs/ext4/mballoc.c @@ -2040,13 +2040,12 @@ static int mb_mark_used(struct ext4_buddy *e4b, struct ext4_free_extent *ex) int ord; int mlen = 0; int max = 0; - int cur; int start = ex->fe_start; int len = ex->fe_len; unsigned ret = 0; int len0 = len; void *buddy; - bool split = false; + int ord_start, ord_end; BUG_ON(start + len > (e4b->bd_sb->s_blocksize << 3)); BUG_ON(e4b->bd_group != ex->fe_group); @@ -2071,16 +2070,12 @@ static int mb_mark_used(struct ext4_buddy *e4b, struct ext4_free_extent *ex) /* let's maintain buddy itself */ while (len) { - if (!split) - ord = mb_find_order_for_block(e4b, start); + ord = mb_find_order_for_block(e4b, start); if (((start >> ord) << ord) == start && len >= (1 << ord)) { /* the whole chunk may be allocated at once! */ mlen = 1 << ord; - if (!split) - buddy = mb_find_buddy(e4b, ord, &max); - else - split = false; + buddy = mb_find_buddy(e4b, ord, &max); BUG_ON((start >> ord) >= max); mb_set_bit(start >> ord, buddy); e4b->bd_info->bb_counters[ord]--; @@ -2094,20 +2089,29 @@ static int mb_mark_used(struct ext4_buddy *e4b, struct ext4_free_extent *ex) if (ret == 0) ret = len | (ord << 16); - /* we have to split large buddy */ BUG_ON(ord <= 0); buddy = mb_find_buddy(e4b, ord, &max); mb_set_bit(start >> ord, buddy); e4b->bd_info->bb_counters[ord]--; - ord--; - cur = (start >> ord) & ~1U; - buddy = mb_find_buddy(e4b, ord, &max); - mb_clear_bit(cur, buddy); - mb_clear_bit(cur + 1, buddy); - e4b->bd_info->bb_counters[ord]++; - e4b->bd_info->bb_counters[ord]++; - split = true; + ord_start = (start >> ord) << ord; + ord_end = ord_start + (1 << ord); + /* first chunk */ + if (start > ord_start) + ext4_mb_mark_free_simple(e4b->bd_sb, e4b->bd_buddy, + ord_start, start - ord_start, + e4b->bd_info); + + /* last chunk */ + if (start + len < ord_end) { + ext4_mb_mark_free_simple(e4b->bd_sb, e4b->bd_buddy, + start + len, + ord_end - (start + len), + e4b->bd_info); + break; + } + len = start + len - ord_end; + start = ord_end; } mb_set_largest_free_order(e4b->bd_sb, e4b->bd_info); -- 2.30.0