From nobody Fri Dec 19 16:08:17 2025 Received: from dggsgout12.his.huawei.com (dggsgout12.his.huawei.com [45.249.212.56]) (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 C9B5119AD89; Sat, 24 May 2025 06:18:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748067499; cv=none; b=Ks6mMWq7A/4CIjO5oIc24GWg6v7Nq8RDuekfIXA1C4UVYfP0Tgkf9EjED67LagYWkNq/WFPwHZd4zyX6+SqD9VmGpq2lo6B+qHxBykiyRtbwfWieIYjfu/L2tlU4DovY7hzqvIzBbcamANEoQ+cDwqR5bHpAbR/aq+yPN/nIOCw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748067499; c=relaxed/simple; bh=LSPYQFonDbezcCTBN2zNPcIZyZmI8b/19oJroc7tKbE=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=aIQCkDIQLiAnkQosXMzG7o9eN2r0N3BdBCFJzISaUI1HdCQgrujPbBcbNfz9g6JcathtNahcopPQxfpvYk0OLVLIteMaZz6Tsr1gkX3veI0sOdClsUo6sVjdrZ4B+1Z01OXf+yHTspImT0Vh+AaE0yc0tkGIt0NdCLbCs7N6hw8= 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.56 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.216]) by dggsgout12.his.huawei.com (SkyGuard) with ESMTP id 4b4Bf25wQdz4f3jXL; Sat, 24 May 2025 14:17:46 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.128]) by mail.maildlp.com (Postfix) with ESMTP id EF7751A140F; Sat, 24 May 2025 14:18:11 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP4 (Coremail) with SMTP id gCh0CgCnCl+dZDFo3etkNQ--.42979S5; Sat, 24 May 2025 14:18:11 +0800 (CST) From: Yu Kuai To: hch@lst.de, xni@redhat.com, colyli@kernel.org, song@kernel.org, yukuai3@huawei.com Cc: linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-raid@vger.kernel.org, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com, johnny.chenyi@huawei.com Subject: [PATCH 01/23] md: add a new parameter 'offset' to md_super_write() Date: Sat, 24 May 2025 14:12:58 +0800 Message-Id: <20250524061320.370630-2-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20250524061320.370630-1-yukuai1@huaweicloud.com> References: <20250524061320.370630-1-yukuai1@huaweicloud.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: gCh0CgCnCl+dZDFo3etkNQ--.42979S5 X-Coremail-Antispam: 1UD129KBjvJXoWxXF1UtFW3Xr45tr4ruw1xZrb_yoWrur1rpa yIvFyfJrWakrWjqw1UJFyDua4Fq34DKrZ7try3u34xu3W7KrykKF45JFy8Ar98uF9xCrs0 qw4UCFW7uw1xWr7anT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUm014x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_Jr4l82xGYIkIc2 x26xkF7I0E14v26r4j6ryUM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2z4x0 Y4vE2Ix0cI8IcVAFwI0_Ar0_tr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F4UJw A2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq3wAS 0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0I7IYx2 IY67AKxVWUJVWUGwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r1j6r4UM4x0 Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwACI402YVCY1x02628vn2kIc2 xKxwCY1x0262kKe7AKxVWUtVW8ZwCF04k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7xkEbVWU JVW8JwC20s026c02F40E14v26r1j6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E67AF67 kF1VAFwI0_Jw0_GFylIxkGc2Ij64vIr41lIxAIcVC0I7IYx2IY67AKxVWUJVWUCwCI42IY 6xIIjxv20xvEc7CjxVAFwI0_Gr0_Cr1lIxAIcVCF04k26cxKx2IYs7xG6r1j6r1xMIIF0x vEx4A2jsIE14v26r1j6r4UMIIF0xvEx4A2jsIEc7CjxVAFwI0_Gr0_Gr1UYxBIdaVFxhVj vjDU0xZFpf9x0JU4OJ5UUUUU= X-CM-SenderInfo: 51xn3trlr6x35dzhxuhorxvhhfrp/ Content-Type: text/plain; charset="utf-8" From: Yu Kuai The parameter is always set to 0 for now, following patches will use this helper to write llbitmap to underlying disks, allow writing dirty sectors instead of the whole page. Also rename md_super_write to md_write_metadata since there is nothing super-block specific. Signed-off-by: Yu Kuai Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke Reviewed-by: Xiao Ni --- drivers/md/md-bitmap.c | 3 ++- drivers/md/md.c | 28 ++++++++++++++-------------- drivers/md/md.h | 5 +++-- 3 files changed, 19 insertions(+), 17 deletions(-) diff --git a/drivers/md/md-bitmap.c b/drivers/md/md-bitmap.c index 431a3ab2e449..168eea6595b3 100644 --- a/drivers/md/md-bitmap.c +++ b/drivers/md/md-bitmap.c @@ -470,7 +470,8 @@ static int __write_sb_page(struct md_rdev *rdev, struct= bitmap *bitmap, return -EINVAL; } =20 - md_super_write(mddev, rdev, sboff + ps, (int)min(size, bitmap_limit), pag= e); + md_write_metadata(mddev, rdev, sboff + ps, (int)min(size, bitmap_limit), + page, 0); return 0; } =20 diff --git a/drivers/md/md.c b/drivers/md/md.c index 32b997dfe6f4..18e03f651f6b 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -1021,8 +1021,9 @@ static void super_written(struct bio *bio) wake_up(&mddev->sb_wait); } =20 -void md_super_write(struct mddev *mddev, struct md_rdev *rdev, - sector_t sector, int size, struct page *page) +void md_write_metadata(struct mddev *mddev, struct md_rdev *rdev, + sector_t sector, int size, struct page *page, + unsigned int offset) { /* write first size bytes of page to sector of rdev * Increment mddev->pending_writes before returning @@ -1047,7 +1048,7 @@ void md_super_write(struct mddev *mddev, struct md_rd= ev *rdev, atomic_inc(&rdev->nr_pending); =20 bio->bi_iter.bi_sector =3D sector; - __bio_add_page(bio, page, size, 0); + __bio_add_page(bio, page, size, offset); bio->bi_private =3D rdev; bio->bi_end_io =3D super_written; =20 @@ -1657,8 +1658,8 @@ super_90_rdev_size_change(struct md_rdev *rdev, secto= r_t num_sectors) if ((u64)num_sectors >=3D (2ULL << 32) && rdev->mddev->level >=3D 1) num_sectors =3D (sector_t)(2ULL << 32) - 2; do { - md_super_write(rdev->mddev, rdev, rdev->sb_start, rdev->sb_size, - rdev->sb_page); + md_write_metadata(rdev->mddev, rdev, rdev->sb_start, + rdev->sb_size, rdev->sb_page, 0); } while (md_super_wait(rdev->mddev) < 0); return num_sectors; } @@ -2306,8 +2307,8 @@ super_1_rdev_size_change(struct md_rdev *rdev, sector= _t num_sectors) sb->super_offset =3D cpu_to_le64(rdev->sb_start); sb->sb_csum =3D calc_sb_1_csum(sb); do { - md_super_write(rdev->mddev, rdev, rdev->sb_start, rdev->sb_size, - rdev->sb_page); + md_write_metadata(rdev->mddev, rdev, rdev->sb_start, + rdev->sb_size, rdev->sb_page, 0); } while (md_super_wait(rdev->mddev) < 0); return num_sectors; =20 @@ -2816,18 +2817,17 @@ void md_update_sb(struct mddev *mddev, int force_ch= ange) continue; /* no noise on spare devices */ =20 if (!test_bit(Faulty, &rdev->flags)) { - md_super_write(mddev,rdev, - rdev->sb_start, rdev->sb_size, - rdev->sb_page); + md_write_metadata(mddev, rdev, rdev->sb_start, + rdev->sb_size, rdev->sb_page, 0); pr_debug("md: (write) %pg's sb offset: %llu\n", rdev->bdev, (unsigned long long)rdev->sb_start); rdev->sb_events =3D mddev->events; if (rdev->badblocks.size) { - md_super_write(mddev, rdev, - rdev->badblocks.sector, - rdev->badblocks.size << 9, - rdev->bb_page); + md_write_metadata(mddev, rdev, + rdev->badblocks.sector, + rdev->badblocks.size << 9, + rdev->bb_page, 0); rdev->badblocks.size =3D 0; } =20 diff --git a/drivers/md/md.h b/drivers/md/md.h index 6eb5dfdf2f55..5ba4a9093a92 100644 --- a/drivers/md/md.h +++ b/drivers/md/md.h @@ -886,8 +886,9 @@ void md_account_bio(struct mddev *mddev, struct bio **b= io); void md_free_cloned_bio(struct bio *bio); =20 extern bool __must_check md_flush_request(struct mddev *mddev, struct bio = *bio); -extern void md_super_write(struct mddev *mddev, struct md_rdev *rdev, - sector_t sector, int size, struct page *page); +extern void md_write_metadata(struct mddev *mddev, struct md_rdev *rdev, + sector_t sector, int size, struct page *page, + unsigned int offset); extern int md_super_wait(struct mddev *mddev); extern int sync_page_io(struct md_rdev *rdev, sector_t sector, int size, struct page *page, blk_opf_t opf, bool metadata_op); --=20 2.39.2 From nobody Fri Dec 19 16:08:17 2025 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 C5720225D7; Sat, 24 May 2025 06:18:14 +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=1748067498; cv=none; b=Tm5CpkEsoZhkwLDF57jJOwMoc/opRnn0hOhp1kRM2enrgnEX8/jQto1pDI+gHU3xmY6pSsl2xhEh9iGhegllRgUOl9d7lh/0FC5RJrvj/teEy8Y+8qwYMXlOqanX0lTWwWc8Cjt+p3/ko+zT71wdFUj9/q3lHZVjbWlxNJjiOMA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748067498; c=relaxed/simple; bh=6+ppI451X7aexKeFug6HrwsE1h5+ujY5PnqHzKrKlKc=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=O6bqnjZzGmkbo/D6n/ZNPMwCfVEEC17lwuj/Q2ESDpnGiscnfLm09JLWGF2/skiqDW5XjZpfYaK/FIXNR+lReLPuMGShsFwj3z0m9umNpidP1mV9J5PBzFIDz1BjBGcHZShlopUCefqJkSFnyfiUWgdxZVO1Z5N91bHZm5FbMDg= 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 ESMTPS id 4b4BfY22QlzYQtvn; Sat, 24 May 2025 14:18:13 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.128]) by mail.maildlp.com (Postfix) with ESMTP id 725ED1A0A65; Sat, 24 May 2025 14:18:12 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP4 (Coremail) with SMTP id gCh0CgCnCl+dZDFo3etkNQ--.42979S6; Sat, 24 May 2025 14:18:12 +0800 (CST) From: Yu Kuai To: hch@lst.de, xni@redhat.com, colyli@kernel.org, song@kernel.org, yukuai3@huawei.com Cc: linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-raid@vger.kernel.org, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com, johnny.chenyi@huawei.com Subject: [PATCH 02/23] md: factor out a helper raid_is_456() Date: Sat, 24 May 2025 14:12:59 +0800 Message-Id: <20250524061320.370630-3-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20250524061320.370630-1-yukuai1@huaweicloud.com> References: <20250524061320.370630-1-yukuai1@huaweicloud.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: gCh0CgCnCl+dZDFo3etkNQ--.42979S6 X-Coremail-Antispam: 1UD129KBjvJXoW7Kr47Kr4xtrWxWFy7GF1fXrb_yoW8XFyxpa yxXFyfArWUZFW3tw4DJrykua4Fgw13tryqyrWxu3yrXF15Xr1DGFyFqFZrZFyDWayfZrsI q3WUtr4Du3W09w7anT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUm014x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_Jryl82xGYIkIc2 x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2z4x0 Y4vE2Ix0cI8IcVAFwI0_Ar0_tr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F4UJw A2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq3wAS 0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0I7IYx2 IY67AKxVWUJVWUGwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r1j6r4UM4x0 Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwACI402YVCY1x02628vn2kIc2 xKxwCY1x0262kKe7AKxVWUtVW8ZwCF04k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7xkEbVWU JVW8JwC20s026c02F40E14v26r1j6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E67AF67 kF1VAFwI0_Jw0_GFylIxkGc2Ij64vIr41lIxAIcVC0I7IYx2IY67AKxVWUJVWUCwCI42IY 6xIIjxv20xvEc7CjxVAFwI0_Gr0_Cr1lIxAIcVCF04k26cxKx2IYs7xG6r1j6r1xMIIF0x vEx4A2jsIE14v26r1j6r4UMIIF0xvEx4A2jsIEc7CjxVAFwI0_Gr0_Gr1UYxBIdaVFxhVj vjDU0xZFpf9x0JUQXo7UUUUU= X-CM-SenderInfo: 51xn3trlr6x35dzhxuhorxvhhfrp/ Content-Type: text/plain; charset="utf-8" From: Yu Kuai There are no functional changes, the helper will be used by llbitmap in following patches. Signed-off-by: Yu Kuai Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke Reviewed-by: Xiao Ni --- drivers/md/md.c | 9 +-------- drivers/md/md.h | 6 ++++++ 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/drivers/md/md.c b/drivers/md/md.c index 18e03f651f6b..b0468e795d94 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -9037,19 +9037,12 @@ static sector_t md_sync_position(struct mddev *mdde= v, enum sync_action action) =20 static bool sync_io_within_limit(struct mddev *mddev) { - int io_sectors; - /* * For raid456, sync IO is stripe(4k) per IO, for other levels, it's * RESYNC_PAGES(64k) per IO. */ - if (mddev->level =3D=3D 4 || mddev->level =3D=3D 5 || mddev->level =3D=3D= 6) - io_sectors =3D 8; - else - io_sectors =3D 128; - return atomic_read(&mddev->recovery_active) < - io_sectors * sync_io_depth(mddev); + (raid_is_456(mddev) ? 8 : 128) * sync_io_depth(mddev); } =20 #define SYNC_MARKS 10 diff --git a/drivers/md/md.h b/drivers/md/md.h index 5ba4a9093a92..c241119e6ef3 100644 --- a/drivers/md/md.h +++ b/drivers/md/md.h @@ -1011,6 +1011,12 @@ static inline bool mddev_is_dm(struct mddev *mddev) return !mddev->gendisk; } =20 +static inline bool raid_is_456(struct mddev *mddev) +{ + return mddev->level =3D=3D ID_RAID4 || mddev->level =3D=3D ID_RAID5 || + mddev->level =3D=3D ID_RAID6; +} + static inline void mddev_trace_remap(struct mddev *mddev, struct bio *bio, sector_t sector) { --=20 2.39.2 From nobody Fri Dec 19 16:08:17 2025 Received: from dggsgout12.his.huawei.com (dggsgout12.his.huawei.com [45.249.212.56]) (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 C9BA119C54E; Sat, 24 May 2025 06:18:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748067498; cv=none; b=h1uO4QS1wNFqIEc6L0hgjvXuOafQQSUbtNZ4kQtyaVmqOt9fx/uhDew9apusqSUXTq34sUTukNDVQ3oWrfvXn8kYolJid5yOuGQwxyGSAHxKSIRKUTV39uFuUoc0Zo4FW3Ebm2IJo/rkbM/y9tlFg389nVm6Z29hyQuqBzJLbS8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748067498; c=relaxed/simple; bh=IYg1L8SmETaoKCRGtjEfDiuelhBB8SOtR83HGJ+BK8E=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=ABnvit33z81yGJ3TTrENNfQlhlCV/PjxstW9/5uanoNvKMP4EK3RaYCfU12x5RI7uw6PHgnGAT2iMdvw6CcNGhoN+C4sOA6+SJDZXyDoGeflxNqmiOye6xb51cHadkFArUny07h3kFQDiI/GzMo2ajxDvNbONJiK0s1Ihe3tERM= 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.56 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.216]) by dggsgout12.his.huawei.com (SkyGuard) with ESMTP id 4b4Bf35n61z4f3jJ8; Sat, 24 May 2025 14:17:47 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.128]) by mail.maildlp.com (Postfix) with ESMTP id EB3C71A174B; Sat, 24 May 2025 14:18:12 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP4 (Coremail) with SMTP id gCh0CgCnCl+dZDFo3etkNQ--.42979S7; Sat, 24 May 2025 14:18:12 +0800 (CST) From: Yu Kuai To: hch@lst.de, xni@redhat.com, colyli@kernel.org, song@kernel.org, yukuai3@huawei.com Cc: linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-raid@vger.kernel.org, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com, johnny.chenyi@huawei.com Subject: [PATCH 03/23] md/md-bitmap: cleanup bitmap_ops->startwrite() Date: Sat, 24 May 2025 14:13:00 +0800 Message-Id: <20250524061320.370630-4-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20250524061320.370630-1-yukuai1@huaweicloud.com> References: <20250524061320.370630-1-yukuai1@huaweicloud.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: gCh0CgCnCl+dZDFo3etkNQ--.42979S7 X-Coremail-Antispam: 1UD129KBjvJXoWxur43Zw13Gr4UXFyxCF4rKrg_yoWrXr15pF ZFqFy3KrWaqFW5X3yUAFykuFyrtrn7tr9rtryxW3s5WFy0krn8GF4Fga40qw1UCFy3AFs8 Zw4YyryUCr42qrJanT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUm014x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JrWl82xGYIkIc2 x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2z4x0 Y4vE2Ix0cI8IcVAFwI0_Ar0_tr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F4UJw A2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq3wAS 0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0I7IYx2 IY67AKxVWUJVWUGwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r1j6r4UM4x0 Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwACI402YVCY1x02628vn2kIc2 xKxwCY1x0262kKe7AKxVWUtVW8ZwCF04k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7xkEbVWU JVW8JwC20s026c02F40E14v26r1j6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E67AF67 kF1VAFwI0_Jw0_GFylIxkGc2Ij64vIr41lIxAIcVC0I7IYx2IY67AKxVWUJVWUCwCI42IY 6xIIjxv20xvEc7CjxVAFwI0_Gr0_Cr1lIxAIcVCF04k26cxKx2IYs7xG6r1j6r1xMIIF0x vEx4A2jsIE14v26r1j6r4UMIIF0xvEx4A2jsIEc7CjxVAFwI0_Gr0_Gr1UYxBIdaVFxhVj vjDU0xZFpf9x0JUHWlkUUUUU= X-CM-SenderInfo: 51xn3trlr6x35dzhxuhorxvhhfrp/ Content-Type: text/plain; charset="utf-8" From: Yu Kuai bitmap_startwrite() always return 0, and the caller doesn't check return value as well, hence change the method to void. Also rename startwrite/endwrite to start_write/end_write, which is more in line with the usual naming convention. Signed-off-by: Yu Kuai Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke Reviewed-by: Xiao Ni --- drivers/md/md-bitmap.c | 17 ++++++++--------- drivers/md/md-bitmap.h | 6 +++--- drivers/md/md.c | 8 ++++---- 3 files changed, 15 insertions(+), 16 deletions(-) diff --git a/drivers/md/md-bitmap.c b/drivers/md/md-bitmap.c index 168eea6595b3..2997e09d463d 100644 --- a/drivers/md/md-bitmap.c +++ b/drivers/md/md-bitmap.c @@ -1669,13 +1669,13 @@ __acquires(bitmap->lock) &(bitmap->bp[page].map[pageoff]); } =20 -static int bitmap_startwrite(struct mddev *mddev, sector_t offset, - unsigned long sectors) +static void bitmap_start_write(struct mddev *mddev, sector_t offset, + unsigned long sectors) { struct bitmap *bitmap =3D mddev->bitmap; =20 if (!bitmap) - return 0; + return; =20 while (sectors) { sector_t blocks; @@ -1685,7 +1685,7 @@ static int bitmap_startwrite(struct mddev *mddev, sec= tor_t offset, bmc =3D md_bitmap_get_counter(&bitmap->counts, offset, &blocks, 1); if (!bmc) { spin_unlock_irq(&bitmap->counts.lock); - return 0; + return; } =20 if (unlikely(COUNTER(*bmc) =3D=3D COUNTER_MAX)) { @@ -1721,11 +1721,10 @@ static int bitmap_startwrite(struct mddev *mddev, s= ector_t offset, else sectors =3D 0; } - return 0; } =20 -static void bitmap_endwrite(struct mddev *mddev, sector_t offset, - unsigned long sectors) +static void bitmap_end_write(struct mddev *mddev, sector_t offset, + unsigned long sectors) { struct bitmap *bitmap =3D mddev->bitmap; =20 @@ -2990,8 +2989,8 @@ static struct bitmap_operations bitmap_ops =3D { .end_behind_write =3D bitmap_end_behind_write, .wait_behind_writes =3D bitmap_wait_behind_writes, =20 - .startwrite =3D bitmap_startwrite, - .endwrite =3D bitmap_endwrite, + .start_write =3D bitmap_start_write, + .end_write =3D bitmap_end_write, .start_sync =3D bitmap_start_sync, .end_sync =3D bitmap_end_sync, .cond_end_sync =3D bitmap_cond_end_sync, diff --git a/drivers/md/md-bitmap.h b/drivers/md/md-bitmap.h index d3d50629af91..9474e0d86fc6 100644 --- a/drivers/md/md-bitmap.h +++ b/drivers/md/md-bitmap.h @@ -90,10 +90,10 @@ struct bitmap_operations { void (*end_behind_write)(struct mddev *mddev); void (*wait_behind_writes)(struct mddev *mddev); =20 - int (*startwrite)(struct mddev *mddev, sector_t offset, + void (*start_write)(struct mddev *mddev, sector_t offset, + unsigned long sectors); + void (*end_write)(struct mddev *mddev, sector_t offset, unsigned long sectors); - void (*endwrite)(struct mddev *mddev, sector_t offset, - unsigned long sectors); bool (*start_sync)(struct mddev *mddev, sector_t offset, sector_t *blocks, bool degraded); void (*end_sync)(struct mddev *mddev, sector_t offset, sector_t *blocks); diff --git a/drivers/md/md.c b/drivers/md/md.c index b0468e795d94..04a659f40cd6 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -8849,14 +8849,14 @@ static void md_bitmap_start(struct mddev *mddev, mddev->pers->bitmap_sector(mddev, &md_io_clone->offset, &md_io_clone->sectors); =20 - mddev->bitmap_ops->startwrite(mddev, md_io_clone->offset, - md_io_clone->sectors); + mddev->bitmap_ops->start_write(mddev, md_io_clone->offset, + md_io_clone->sectors); } =20 static void md_bitmap_end(struct mddev *mddev, struct md_io_clone *md_io_c= lone) { - mddev->bitmap_ops->endwrite(mddev, md_io_clone->offset, - md_io_clone->sectors); + mddev->bitmap_ops->end_write(mddev, md_io_clone->offset, + md_io_clone->sectors); } =20 static void md_end_clone_io(struct bio *bio) --=20 2.39.2 From nobody Fri Dec 19 16:08:17 2025 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 C577519924E; Sat, 24 May 2025 06:18:15 +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=1748067498; cv=none; b=mT9kBbSWN3dQ14NkUhYuKOAFYzfNJTkmwkjCll3bQkTsuaO+tPOey+luQcJUfSWmyPE9h5f3lIsPzLxUM3FVTb5k3xo/f+c9DEaJBuPNQCQ7MWz8Go2NMqgKcpWct0Mjz0SO+tTD+SXdm0MjwUCNwtB0LzKUT+vsQcUY/VrLUs0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748067498; c=relaxed/simple; bh=/wQrV/SlON4PEX2mOq+kSRCZRZMffzNxCwfovOnMJpM=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=heuuGDbxi4QDv7tFlBgJp6fJ6d7k0cgJW6/lRltlcPZm4sMlGeKCbJRt4XfkJgWV4WrEcZmuAcNzCF8GQlMy1YZK5Ky2gtGiLouoIsig8q4XpRw8O97RonbRnq9s1+793JiwqjnQsdeUJQmoZ3cnisz3tD4knbKUvVyBMxTvnOo= 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 ESMTPS id 4b4BfZ2GNGzYQtvv; Sat, 24 May 2025 14:18:14 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.128]) by mail.maildlp.com (Postfix) with ESMTP id 734591A0879; Sat, 24 May 2025 14:18:13 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP4 (Coremail) with SMTP id gCh0CgCnCl+dZDFo3etkNQ--.42979S8; Sat, 24 May 2025 14:18:13 +0800 (CST) From: Yu Kuai To: hch@lst.de, xni@redhat.com, colyli@kernel.org, song@kernel.org, yukuai3@huawei.com Cc: linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-raid@vger.kernel.org, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com, johnny.chenyi@huawei.com Subject: [PATCH 04/23] md/md-bitmap: support discard for bitmap ops Date: Sat, 24 May 2025 14:13:01 +0800 Message-Id: <20250524061320.370630-5-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20250524061320.370630-1-yukuai1@huaweicloud.com> References: <20250524061320.370630-1-yukuai1@huaweicloud.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: gCh0CgCnCl+dZDFo3etkNQ--.42979S8 X-Coremail-Antispam: 1UD129KBjvJXoWxXFyUCFWkCr1rXF47XrWDurg_yoWrGF1xpF ZFqFy3Gr43Xr4Yqa47Aa4DuFyrtw1ktrZrKFW7W345WFyxCFnxCF4Fga4qyw1DGFy3CFsx Zw4Fkr15Cr18XrJanT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUmI14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_Ar0_tr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F 4UJwA2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq 3wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0I7 IYx2IY67AKxVWUJVWUGwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r1j6r4U M4x0Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwACI402YVCY1x02628vn2 kIc2xKxwCY1x0262kKe7AKxVWUtVW8ZwCF04k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7xkE bVWUJVW8JwC20s026c02F40E14v26r1j6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E67 AF67kF1VAFwI0_Jw0_GFylIxkGc2Ij64vIr41lIxAIcVC0I7IYx2IY67AKxVWUJVWUCwCI 42IY6xIIjxv20xvEc7CjxVAFwI0_Cr0_Gr1UMIIF0xvE42xK8VAvwI8IcIk0rVWUJVWUCw CI42IY6I8E87Iv67AKxVWUJVW8JwCI42IY6I8E87Iv6xkF7I0E14v26r4j6r4UJbIYCTnI WIevJa73UjIFyTuYvjfUOyIUUUUUU X-CM-SenderInfo: 51xn3trlr6x35dzhxuhorxvhhfrp/ Content-Type: text/plain; charset="utf-8" From: Yu Kuai Use two new methods {start, end}_discard to handle discard IO, prepare to support new md bitmap. Signed-off-by: Yu Kuai Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke Reviewed-by: Xiao Ni --- drivers/md/md-bitmap.c | 3 +++ drivers/md/md-bitmap.h | 12 ++++++++---- drivers/md/md.c | 15 +++++++++++---- drivers/md/md.h | 1 + 4 files changed, 23 insertions(+), 8 deletions(-) diff --git a/drivers/md/md-bitmap.c b/drivers/md/md-bitmap.c index 2997e09d463d..848626049dea 100644 --- a/drivers/md/md-bitmap.c +++ b/drivers/md/md-bitmap.c @@ -2991,6 +2991,9 @@ static struct bitmap_operations bitmap_ops =3D { =20 .start_write =3D bitmap_start_write, .end_write =3D bitmap_end_write, + .start_discard =3D bitmap_start_write, + .end_discard =3D bitmap_end_write, + .start_sync =3D bitmap_start_sync, .end_sync =3D bitmap_end_sync, .cond_end_sync =3D bitmap_cond_end_sync, diff --git a/drivers/md/md-bitmap.h b/drivers/md/md-bitmap.h index 9474e0d86fc6..4d804c07dbdd 100644 --- a/drivers/md/md-bitmap.h +++ b/drivers/md/md-bitmap.h @@ -70,6 +70,9 @@ struct md_bitmap_stats { struct file *file; }; =20 +typedef void (md_bitmap_fn)(struct mddev *mddev, sector_t offset, + unsigned long sectors); + struct bitmap_operations { struct md_submodule_head head; =20 @@ -90,10 +93,11 @@ struct bitmap_operations { void (*end_behind_write)(struct mddev *mddev); void (*wait_behind_writes)(struct mddev *mddev); =20 - void (*start_write)(struct mddev *mddev, sector_t offset, - unsigned long sectors); - void (*end_write)(struct mddev *mddev, sector_t offset, - unsigned long sectors); + md_bitmap_fn *start_write; + md_bitmap_fn *end_write; + md_bitmap_fn *start_discard; + md_bitmap_fn *end_discard; + bool (*start_sync)(struct mddev *mddev, sector_t offset, sector_t *blocks, bool degraded); void (*end_sync)(struct mddev *mddev, sector_t offset, sector_t *blocks); diff --git a/drivers/md/md.c b/drivers/md/md.c index 04a659f40cd6..466087cef4f9 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -8845,18 +8845,24 @@ EXPORT_SYMBOL_GPL(md_submit_discard_bio); static void md_bitmap_start(struct mddev *mddev, struct md_io_clone *md_io_clone) { + md_bitmap_fn *fn =3D unlikely(md_io_clone->rw =3D=3D STAT_DISCARD) ? + mddev->bitmap_ops->start_discard : + mddev->bitmap_ops->start_write; + if (mddev->pers->bitmap_sector) mddev->pers->bitmap_sector(mddev, &md_io_clone->offset, &md_io_clone->sectors); =20 - mddev->bitmap_ops->start_write(mddev, md_io_clone->offset, - md_io_clone->sectors); + fn(mddev, md_io_clone->offset, md_io_clone->sectors); } =20 static void md_bitmap_end(struct mddev *mddev, struct md_io_clone *md_io_c= lone) { - mddev->bitmap_ops->end_write(mddev, md_io_clone->offset, - md_io_clone->sectors); + md_bitmap_fn *fn =3D unlikely(md_io_clone->rw =3D=3D STAT_DISCARD) ? + mddev->bitmap_ops->end_discard : + mddev->bitmap_ops->end_write; + + fn(mddev, md_io_clone->offset, md_io_clone->sectors); } =20 static void md_end_clone_io(struct bio *bio) @@ -8895,6 +8901,7 @@ static void md_clone_bio(struct mddev *mddev, struct = bio **bio) if (bio_data_dir(*bio) =3D=3D WRITE && md_bitmap_enabled(mddev)) { md_io_clone->offset =3D (*bio)->bi_iter.bi_sector; md_io_clone->sectors =3D bio_sectors(*bio); + md_io_clone->rw =3D op_stat_group(bio_op(*bio)); md_bitmap_start(mddev, md_io_clone); } =20 diff --git a/drivers/md/md.h b/drivers/md/md.h index c241119e6ef3..13e3f9ce1b79 100644 --- a/drivers/md/md.h +++ b/drivers/md/md.h @@ -850,6 +850,7 @@ struct md_io_clone { unsigned long start_time; sector_t offset; unsigned long sectors; + enum stat_group rw; struct bio bio_clone; }; =20 --=20 2.39.2 From nobody Fri Dec 19 16:08:17 2025 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 D82C61C6FEA; Sat, 24 May 2025 06:18:16 +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=1748067499; cv=none; b=kfE8sZa3oKXacKomaCrXCjda6LRzUYEOW2WCsPsK/fEGY9Bd8xNd7MRjMQnMnYXIRUcQkWzucqre4GDbOysfKZf9fGyvOoQH7/WEeHGKwsbCMEsWpWeP+TWhO/a7Amz2IBof2Z36zuSctx9llABDd0mip1pdcrImjaC00XHPruQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748067499; c=relaxed/simple; bh=Iq0ppBxeY6Azp6vaPYheESTL6fREGbM4x5RZjXBNpeY=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=HtZnC/ShxbiVKSdEGo+2Kz5UsOKCAMahBlgXsn/7oelr1D8TgqLaf93CPMlssJTQIqgWbIjMbYUBRls4ZLvu59FYnGcdQBDFsrsMDfe272zcnApc7KAVMve3NLBWzYh2WT5Z+uB58DFKnKtKYYGuMJ/iMnucFOi4t25NrUAsb5g= 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 4b4Bf329R5z4f3jMQ; Sat, 24 May 2025 14:17:47 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.128]) by mail.maildlp.com (Postfix) with ESMTP id EAC5A1A0879; Sat, 24 May 2025 14:18:13 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP4 (Coremail) with SMTP id gCh0CgCnCl+dZDFo3etkNQ--.42979S9; Sat, 24 May 2025 14:18:13 +0800 (CST) From: Yu Kuai To: hch@lst.de, xni@redhat.com, colyli@kernel.org, song@kernel.org, yukuai3@huawei.com Cc: linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-raid@vger.kernel.org, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com, johnny.chenyi@huawei.com Subject: [PATCH 05/23] md/md-bitmap: remove parameter slot from bitmap_create() Date: Sat, 24 May 2025 14:13:02 +0800 Message-Id: <20250524061320.370630-6-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20250524061320.370630-1-yukuai1@huaweicloud.com> References: <20250524061320.370630-1-yukuai1@huaweicloud.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: gCh0CgCnCl+dZDFo3etkNQ--.42979S9 X-Coremail-Antispam: 1UD129KBjvJXoWxJFyrWFW8XF47KFW7XrW3GFg_yoW5Xw48p3 97tas3CrW3JrW3Xa1UXFyv9a45Xwn7KrZrtryxCw1rWFn8ZrnxCF4FgF1jywn8Ka4rAFs8 Xw15Gw18GF1Igr7anT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUmI14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_Ar0_tr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F 4UJwA2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq 3wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0I7 IYx2IY67AKxVWUJVWUGwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r1j6r4U M4x0Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwACI402YVCY1x02628vn2 kIc2xKxwCY1x0262kKe7AKxVWUtVW8ZwCF04k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7xkE bVWUJVW8JwC20s026c02F40E14v26r1j6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E67 AF67kF1VAFwI0_Jw0_GFylIxkGc2Ij64vIr41lIxAIcVC0I7IYx2IY67AKxVWUCVW8JwCI 42IY6xIIjxv20xvEc7CjxVAFwI0_Cr0_Gr1UMIIF0xvE42xK8VAvwI8IcIk0rVWUJVWUCw CI42IY6I8E87Iv67AKxVWUJVW8JwCI42IY6I8E87Iv6xkF7I0E14v26r4j6r4UJbIYCTnI WIevJa73UjIFyTuYvjfUOyIUUUUUU X-CM-SenderInfo: 51xn3trlr6x35dzhxuhorxvhhfrp/ Content-Type: text/plain; charset="utf-8" From: Yu Kuai All callers pass in '-1' for 'slot', hence it can be removed. Signed-off-by: Yu Kuai Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke Reviewed-by: Xiao Ni --- drivers/md/md-bitmap.c | 6 +++--- drivers/md/md-bitmap.h | 2 +- drivers/md/md.c | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/drivers/md/md-bitmap.c b/drivers/md/md-bitmap.c index 848626049dea..17d41a7b30ce 100644 --- a/drivers/md/md-bitmap.c +++ b/drivers/md/md-bitmap.c @@ -2185,9 +2185,9 @@ static struct bitmap *__bitmap_create(struct mddev *m= ddev, int slot) return ERR_PTR(err); } =20 -static int bitmap_create(struct mddev *mddev, int slot) +static int bitmap_create(struct mddev *mddev) { - struct bitmap *bitmap =3D __bitmap_create(mddev, slot); + struct bitmap *bitmap =3D __bitmap_create(mddev, -1); =20 if (IS_ERR(bitmap)) return PTR_ERR(bitmap); @@ -2649,7 +2649,7 @@ location_store(struct mddev *mddev, const char *buf, = size_t len) } =20 mddev->bitmap_info.offset =3D offset; - rv =3D bitmap_create(mddev, -1); + rv =3D bitmap_create(mddev); if (rv) goto out; =20 diff --git a/drivers/md/md-bitmap.h b/drivers/md/md-bitmap.h index 4d804c07dbdd..2b99ddef7a41 100644 --- a/drivers/md/md-bitmap.h +++ b/drivers/md/md-bitmap.h @@ -77,7 +77,7 @@ struct bitmap_operations { struct md_submodule_head head; =20 bool (*enabled)(void *data); - int (*create)(struct mddev *mddev, int slot); + int (*create)(struct mddev *mddev); int (*resize)(struct mddev *mddev, sector_t blocks, int chunksize); =20 int (*load)(struct mddev *mddev); diff --git a/drivers/md/md.c b/drivers/md/md.c index 466087cef4f9..311e52d5173d 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -6255,7 +6255,7 @@ int md_run(struct mddev *mddev) } if (err =3D=3D 0 && pers->sync_request && md_bitmap_registered(mddev) && (mddev->bitmap_info.file || mddev->bitmap_info.offset)) { - err =3D mddev->bitmap_ops->create(mddev, -1); + err =3D mddev->bitmap_ops->create(mddev); if (err) pr_warn("%s: failed to create bitmap (%d)\n", mdname(mddev), err); @@ -7324,7 +7324,7 @@ static int set_bitmap_file(struct mddev *mddev, int f= d) err =3D 0; if (mddev->pers) { if (fd >=3D 0) { - err =3D mddev->bitmap_ops->create(mddev, -1); + err =3D mddev->bitmap_ops->create(mddev); if (!err) err =3D mddev->bitmap_ops->load(mddev); =20 @@ -7648,7 +7648,7 @@ static int update_array_info(struct mddev *mddev, mdu= _array_info_t *info) mddev->bitmap_info.default_offset; mddev->bitmap_info.space =3D mddev->bitmap_info.default_space; - rv =3D mddev->bitmap_ops->create(mddev, -1); + rv =3D mddev->bitmap_ops->create(mddev); if (!rv) rv =3D mddev->bitmap_ops->load(mddev); =20 --=20 2.39.2 From nobody Fri Dec 19 16:08:17 2025 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 A0F8219E7D0; Sat, 24 May 2025 06:18:16 +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=1748067499; cv=none; b=n6OY22368OkgYqheaNfznArFy6a8lYOir+xXf2KGiZLSrhprPJcpSPeXck4Vh3jZjYkup69T34CvrfkyvMUqeReHr2XMn42A64gMLQoPnZIbb2LxSoF8V16ODffzGE82QooJVoiBigeNTItnmYvG2goQH+19aasBnmMqFGd1Ts8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748067499; c=relaxed/simple; bh=ZiWFEOYZFpVvgNRZex2vijFl/l9+Bv2ok8oLbd8tYfw=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=jD9W26RUDhl+pRB8uDTzkCO0YgKhPTsEshMghHgMo40Dl7UF/GwbpOa5su+fEkZ6p4kqm1gavjRuMCvkYMcWpMeBgsjVlwNoXf2iJZHXhuHIsagqdAtwhWdyKa4S8F85YdF19Xb/86iXwiMEXvlVsBD+CwQ8cjxCVvddjbLleGs= 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.93.142]) by dggsgout11.his.huawei.com (SkyGuard) with ESMTPS id 4b4Bfb24zxzYQtxb; Sat, 24 May 2025 14:18:15 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.128]) by mail.maildlp.com (Postfix) with ESMTP id 712D11A018D; Sat, 24 May 2025 14:18:14 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP4 (Coremail) with SMTP id gCh0CgCnCl+dZDFo3etkNQ--.42979S10; Sat, 24 May 2025 14:18:14 +0800 (CST) From: Yu Kuai To: hch@lst.de, xni@redhat.com, colyli@kernel.org, song@kernel.org, yukuai3@huawei.com Cc: linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-raid@vger.kernel.org, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com, johnny.chenyi@huawei.com Subject: [PATCH 06/23] md/md-bitmap: add a new sysfs api bitmap_type Date: Sat, 24 May 2025 14:13:03 +0800 Message-Id: <20250524061320.370630-7-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20250524061320.370630-1-yukuai1@huaweicloud.com> References: <20250524061320.370630-1-yukuai1@huaweicloud.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: gCh0CgCnCl+dZDFo3etkNQ--.42979S10 X-Coremail-Antispam: 1UD129KBjvJXoWxKryDtFy5ZF1DJw48Xw1kZrb_yoW3Jryfpa y8tryayrZ5XrZaqr4xJa4q9F1Fqr1vya9Fq34Sg3s5Crn8WrsxGFWfK3WUtw1DCa4ruFnr Zr45tFWUWryjvF7anT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUmI14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_Ar0_tr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F 4UJwA2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq 3wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0I7 IYx2IY67AKxVWUJVWUGwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r1j6r4U M4x0Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwACI402YVCY1x02628vn2 kIc2xKxwCY1x0262kKe7AKxVWUtVW8ZwCF04k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7xkE bVWUJVW8JwC20s026c02F40E14v26r1j6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E67 AF67kF1VAFwI0_Jw0_GFylIxkGc2Ij64vIr41lIxAIcVC0I7IYx2IY67AKxVWUCVW8JwCI 42IY6xIIjxv20xvEc7CjxVAFwI0_Cr0_Gr1UMIIF0xvE42xK8VAvwI8IcIk0rVWUJVWUCw CI42IY6I8E87Iv67AKxVWUJVW8JwCI42IY6I8E87Iv6xkF7I0E14v26r4j6r4UJbIYCTnI WIevJa73UjIFyTuYvjfUOyIUUUUUU X-CM-SenderInfo: 51xn3trlr6x35dzhxuhorxvhhfrp/ Content-Type: text/plain; charset="utf-8" From: Yu Kuai The api will be used by mdadm to set bitmap_ops while creating new array or assemble array, prepare to add a new bitmap. Currently available options are: cat /sys/block/md0/md/bitmap_type none [bitmap] Signed-off-by: Yu Kuai --- Documentation/admin-guide/md.rst | 73 ++++++++++++++---------- drivers/md/md.c | 96 ++++++++++++++++++++++++++++++-- drivers/md/md.h | 2 + 3 files changed, 135 insertions(+), 36 deletions(-) diff --git a/Documentation/admin-guide/md.rst b/Documentation/admin-guide/m= d.rst index 4ff2cc291d18..356d2a344f08 100644 --- a/Documentation/admin-guide/md.rst +++ b/Documentation/admin-guide/md.rst @@ -347,6 +347,49 @@ All md devices contain: active-idle like active, but no writes have been seen for a while (safe_mode_= delay). =20 + consistency_policy + This indicates how the array maintains consistency in case of unexpec= ted + shutdown. It can be: + + none + Array has no redundancy information, e.g. raid0, linear. + + resync + Full resync is performed and all redundancy is regenerated when the + array is started after unclean shutdown. + + bitmap + Resync assisted by a write-intent bitmap. + + journal + For raid4/5/6, journal device is used to log transactions and replay + after unclean shutdown. + + ppl + For raid5 only, Partial Parity Log is used to close the write hole = and + eliminate resync. + + The accepted values when writing to this file are ``ppl`` and ``resyn= c``, + used to enable and disable PPL. + + uuid + This indicates the UUID of the array in the following format: + xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx + + bitmap_type + [RW] When read, this file will display the current and available + bitmap for this array. The currently active bitmap will be enclosed + in [] brackets. Writing an bitmap name or ID to this file will switch + control of this array to that new bitmap. Note that writing a new + bitmap for created array is forbidden. + + none + No bitmap + bitmap + The default internal bitmap + +If bitmap_type is bitmap, then the md device will also contain: + bitmap/location This indicates where the write-intent bitmap for the array is stored. @@ -401,36 +444,6 @@ All md devices contain: once the array becomes non-degraded, and this fact has been recorded in the metadata. =20 - consistency_policy - This indicates how the array maintains consistency in case of unexpec= ted - shutdown. It can be: - - none - Array has no redundancy information, e.g. raid0, linear. - - resync - Full resync is performed and all redundancy is regenerated when the - array is started after unclean shutdown. - - bitmap - Resync assisted by a write-intent bitmap. - - journal - For raid4/5/6, journal device is used to log transactions and replay - after unclean shutdown. - - ppl - For raid5 only, Partial Parity Log is used to close the write hole = and - eliminate resync. - - The accepted values when writing to this file are ``ppl`` and ``resyn= c``, - used to enable and disable PPL. - - uuid - This indicates the UUID of the array in the following format: - xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx - - As component devices are added to an md array, they appear in the ``md`` directory as new directories named:: =20 diff --git a/drivers/md/md.c b/drivers/md/md.c index 311e52d5173d..4eb0c6effd5b 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -672,13 +672,18 @@ static void active_io_release(struct percpu_ref *ref) =20 static void no_op(struct percpu_ref *r) {} =20 -static void mddev_set_bitmap_ops(struct mddev *mddev, enum md_submodule_id= id) +static bool mddev_set_bitmap_ops(struct mddev *mddev) { xa_lock(&md_submodule); - mddev->bitmap_ops =3D xa_load(&md_submodule, id); + mddev->bitmap_ops =3D xa_load(&md_submodule, mddev->bitmap_id); xa_unlock(&md_submodule); - if (!mddev->bitmap_ops) - pr_warn_once("md: can't find bitmap id %d\n", id); + + if (!mddev->bitmap_ops) { + pr_warn_once("md: can't find bitmap id %d\n", mddev->bitmap_id); + return false; + } + + return true; } =20 static void mddev_clear_bitmap_ops(struct mddev *mddev) @@ -688,8 +693,10 @@ static void mddev_clear_bitmap_ops(struct mddev *mddev) =20 int mddev_init(struct mddev *mddev) { - /* TODO: support more versions */ - mddev_set_bitmap_ops(mddev, ID_BITMAP); + mddev->bitmap_id =3D ID_BITMAP; + + if (!mddev_set_bitmap_ops(mddev)) + return -EINVAL; =20 if (percpu_ref_init(&mddev->active_io, active_io_release, PERCPU_REF_ALLOW_REINIT, GFP_KERNEL)) { @@ -4155,6 +4162,82 @@ new_level_store(struct mddev *mddev, const char *buf= , size_t len) static struct md_sysfs_entry md_new_level =3D __ATTR(new_level, 0664, new_level_show, new_level_store); =20 +static ssize_t +bitmap_type_show(struct mddev *mddev, char *page) +{ + struct md_submodule_head *head; + unsigned long i; + ssize_t len =3D 0; + + if (mddev->bitmap_id =3D=3D ID_BITMAP_NONE) + len +=3D sprintf(page + len, "[none] "); + else + len +=3D sprintf(page + len, "none "); + + xa_lock(&md_submodule); + xa_for_each(&md_submodule, i, head) { + if (head->type !=3D MD_BITMAP) + continue; + + if (mddev->bitmap_id =3D=3D head->id) + len +=3D sprintf(page + len, "[%s] ", head->name); + else + len +=3D sprintf(page + len, "%s ", head->name); + } + xa_unlock(&md_submodule); + + len +=3D sprintf(page + len, "\n"); + return len; +} + +static ssize_t +bitmap_type_store(struct mddev *mddev, const char *buf, size_t len) +{ + struct md_submodule_head *head; + enum md_submodule_id id; + unsigned long i; + int err; + + if (mddev->bitmap_ops) + return -EBUSY; + + err =3D kstrtoint(buf, 10, &id); + if (!err) { + if (id =3D=3D ID_BITMAP_NONE) { + mddev->bitmap_id =3D id; + return len; + } + + xa_lock(&md_submodule); + head =3D xa_load(&md_submodule, id); + xa_unlock(&md_submodule); + + if (head && head->type =3D=3D MD_BITMAP) { + mddev->bitmap_id =3D id; + return len; + } + } + + if (cmd_match(buf, "none")) { + mddev->bitmap_id =3D ID_BITMAP_NONE; + return len; + } + + xa_lock(&md_submodule); + xa_for_each(&md_submodule, i, head) { + if (head->type =3D=3D MD_BITMAP && cmd_match(buf, head->name)) { + mddev->bitmap_id =3D head->id; + xa_unlock(&md_submodule); + return len; + } + } + xa_unlock(&md_submodule); + return -ENOENT; +} + +static struct md_sysfs_entry md_bitmap_type =3D +__ATTR(bitmap_type, 0664, bitmap_type_show, bitmap_type_store); + static ssize_t layout_show(struct mddev *mddev, char *page) { @@ -5719,6 +5802,7 @@ __ATTR(serialize_policy, S_IRUGO | S_IWUSR, serialize= _policy_show, static struct attribute *md_default_attrs[] =3D { &md_level.attr, &md_new_level.attr, + &md_bitmap_type.attr, &md_layout.attr, &md_raid_disks.attr, &md_uuid.attr, diff --git a/drivers/md/md.h b/drivers/md/md.h index 13e3f9ce1b79..bf34c0a36551 100644 --- a/drivers/md/md.h +++ b/drivers/md/md.h @@ -40,6 +40,7 @@ enum md_submodule_id { ID_CLUSTER, ID_BITMAP, ID_LLBITMAP, /* TODO */ + ID_BITMAP_NONE, }; =20 struct md_submodule_head { @@ -565,6 +566,7 @@ struct mddev { struct percpu_ref writes_pending; int sync_checkers; /* # of threads checking writes_pending */ =20 + enum md_submodule_id bitmap_id; void *bitmap; /* the bitmap for the device */ struct bitmap_operations *bitmap_ops; struct { --=20 2.39.2 From nobody Fri Dec 19 16:08:17 2025 Received: from dggsgout12.his.huawei.com (dggsgout12.his.huawei.com [45.249.212.56]) (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 E96FA1BEF9B; Sat, 24 May 2025 06:18:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748067501; cv=none; b=HXnXZ057GboltiyCjgQvpQOyrZzOl5CEf7mILQbF9GUgJeOs3sbtq7ACvUKVZRMOEnARYrkjNnhvxD7Fg2LXlcU55TRYg6RBD+Hz7W9HbzO6KB8/aoZyJVK8ZB9dODcQW07Y0fs2fxlKbSQ1XiZn/50DRGmv5kUboh/e49o7P8o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748067501; c=relaxed/simple; bh=Th/CEyM4KEyKE/6ZBKIUh23R76RNEYT9+OxSiv1M754=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=EbOekGnP18jXwz437y9ym0dcByP3Wn2hTvWk7/nwExgVbQ9SY7fJgpMKxaJC+9UgzAwfy6eapjcXU+fRgoIRdTFK7SP8ZY9LerlIB8grK5S5hXO1VN8bJyvghuwUsyDbHDMn3xS1jU3zz2LIjnqB14YB+T8/aK/NolOmsDgbr/o= 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.56 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.93.142]) by dggsgout12.his.huawei.com (SkyGuard) with ESMTP id 4b4Bf55tCLz4f3jXK; Sat, 24 May 2025 14:17:49 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.128]) by mail.maildlp.com (Postfix) with ESMTP id ED6B11A0359; Sat, 24 May 2025 14:18:14 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP4 (Coremail) with SMTP id gCh0CgCnCl+dZDFo3etkNQ--.42979S11; Sat, 24 May 2025 14:18:14 +0800 (CST) From: Yu Kuai To: hch@lst.de, xni@redhat.com, colyli@kernel.org, song@kernel.org, yukuai3@huawei.com Cc: linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-raid@vger.kernel.org, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com, johnny.chenyi@huawei.com Subject: [PATCH 07/23] md/md-bitmap: delay registration of bitmap_ops until creating bitmap Date: Sat, 24 May 2025 14:13:04 +0800 Message-Id: <20250524061320.370630-8-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20250524061320.370630-1-yukuai1@huaweicloud.com> References: <20250524061320.370630-1-yukuai1@huaweicloud.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: gCh0CgCnCl+dZDFo3etkNQ--.42979S11 X-Coremail-Antispam: 1UD129KBjvJXoW3Jr4DGr47tr48KF4ftF45GFg_yoWxCr4rp3 yft3Z5Kr4rXrZIqw47JFyq9F1rXrn7tr9xtryxXw15Grn3JrnxJF4rWF1Dtr18J348ZFs8 Zw45Jr48Gr13uF7anT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUmI14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_Ar0_tr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F 4UJwA2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq 3wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0I7 IYx2IY67AKxVWUJVWUGwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r1j6r4U M4x0Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwACI402YVCY1x02628vn2 kIc2xKxwCY1x0262kKe7AKxVWUtVW8ZwCF04k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7xkE bVWUJVW8JwC20s026c02F40E14v26r1j6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E67 AF67kF1VAFwI0_Jw0_GFylIxkGc2Ij64vIr41lIxAIcVC0I7IYx2IY67AKxVWUCVW8JwCI 42IY6xIIjxv20xvEc7CjxVAFwI0_Cr0_Gr1UMIIF0xvE42xK8VAvwI8IcIk0rVWUJVWUCw CI42IY6I8E87Iv67AKxVWUJVW8JwCI42IY6I8E87Iv6xkF7I0E14v26r4j6r4UJbIYCTnI WIevJa73UjIFyTuYvjfUOyIUUUUUU X-CM-SenderInfo: 51xn3trlr6x35dzhxuhorxvhhfrp/ Content-Type: text/plain; charset="utf-8" From: Yu Kuai Currently bitmap_ops is registered while allocating mddev, this is fine when there is only one bitmap_ops, however, after introduing a new bitmap_ops, user space need a time window to choose which bitmap_ops to use while creating new array. Signed-off-by: Yu Kuai Reviewed-by: Christoph Hellwig --- drivers/md/md.c | 86 +++++++++++++++++++++++++++++++------------------ 1 file changed, 55 insertions(+), 31 deletions(-) diff --git a/drivers/md/md.c b/drivers/md/md.c index 4eb0c6effd5b..dc4b85f30e13 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -674,39 +674,50 @@ static void no_op(struct percpu_ref *r) {} =20 static bool mddev_set_bitmap_ops(struct mddev *mddev) { + struct bitmap_operations *old =3D mddev->bitmap_ops; + struct md_submodule_head *head; + + if (mddev->bitmap_id =3D=3D ID_BITMAP_NONE || + (old && old->head.id =3D=3D mddev->bitmap_id)) + return true; + xa_lock(&md_submodule); - mddev->bitmap_ops =3D xa_load(&md_submodule, mddev->bitmap_id); + head =3D xa_load(&md_submodule, mddev->bitmap_id); xa_unlock(&md_submodule); =20 - if (!mddev->bitmap_ops) { - pr_warn_once("md: can't find bitmap id %d\n", mddev->bitmap_id); + if (WARN_ON_ONCE(!head || head->type !=3D MD_BITMAP)) { + pr_err("md: can't find bitmap id %d\n", mddev->bitmap_id); return false; } =20 + if (old && old->group) + sysfs_remove_group(&mddev->kobj, old->group); + + mddev->bitmap_ops =3D (void *)head; + if (mddev->bitmap_ops && mddev->bitmap_ops->group && + sysfs_create_group(&mddev->kobj, mddev->bitmap_ops->group)) + pr_warn("md: cannot register extra bitmap attributes for %s\n", + mdname(mddev)); + return true; } =20 static void mddev_clear_bitmap_ops(struct mddev *mddev) { + if (mddev->bitmap_ops && mddev->bitmap_ops->group) + sysfs_remove_group(&mddev->kobj, mddev->bitmap_ops->group); + mddev->bitmap_ops =3D NULL; } =20 int mddev_init(struct mddev *mddev) { - mddev->bitmap_id =3D ID_BITMAP; - - if (!mddev_set_bitmap_ops(mddev)) - return -EINVAL; - if (percpu_ref_init(&mddev->active_io, active_io_release, - PERCPU_REF_ALLOW_REINIT, GFP_KERNEL)) { - mddev_clear_bitmap_ops(mddev); + PERCPU_REF_ALLOW_REINIT, GFP_KERNEL)) return -ENOMEM; - } =20 if (percpu_ref_init(&mddev->writes_pending, no_op, PERCPU_REF_ALLOW_REINIT, GFP_KERNEL)) { - mddev_clear_bitmap_ops(mddev); percpu_ref_exit(&mddev->active_io); return -ENOMEM; } @@ -734,6 +745,7 @@ int mddev_init(struct mddev *mddev) mddev->resync_min =3D 0; mddev->resync_max =3D MaxSector; mddev->level =3D LEVEL_NONE; + mddev->bitmap_id =3D ID_BITMAP; =20 INIT_WORK(&mddev->sync_work, md_start_sync); INIT_WORK(&mddev->del_work, mddev_delayed_delete); @@ -744,7 +756,6 @@ EXPORT_SYMBOL_GPL(mddev_init); =20 void mddev_destroy(struct mddev *mddev) { - mddev_clear_bitmap_ops(mddev); percpu_ref_exit(&mddev->active_io); percpu_ref_exit(&mddev->writes_pending); } @@ -6093,11 +6104,6 @@ struct mddev *md_alloc(dev_t dev, char *name) return ERR_PTR(error); } =20 - if (md_bitmap_registered(mddev) && mddev->bitmap_ops->group) - if (sysfs_create_group(&mddev->kobj, mddev->bitmap_ops->group)) - pr_warn("md: cannot register extra bitmap attributes for %s\n", - mdname(mddev)); - kobject_uevent(&mddev->kobj, KOBJ_ADD); mddev->sysfs_state =3D sysfs_get_dirent_safe(mddev->kobj.sd, "array_state= "); mddev->sysfs_level =3D sysfs_get_dirent_safe(mddev->kobj.sd, "level"); @@ -6173,6 +6179,26 @@ static void md_safemode_timeout(struct timer_list *t) =20 static int start_dirty_degraded; =20 +static int md_bitmap_create(struct mddev *mddev) +{ + if (mddev->bitmap_id =3D=3D ID_BITMAP_NONE) + return -EINVAL; + + if (!mddev_set_bitmap_ops(mddev)) + return -ENOENT; + + return mddev->bitmap_ops->create(mddev); +} + +static void md_bitmap_destroy(struct mddev *mddev) +{ + if (!md_bitmap_registered(mddev)) + return; + + mddev->bitmap_ops->destroy(mddev); + mddev_clear_bitmap_ops(mddev); +} + int md_run(struct mddev *mddev) { int err; @@ -6337,9 +6363,9 @@ int md_run(struct mddev *mddev) (unsigned long long)pers->size(mddev, 0, 0) / 2); err =3D -EINVAL; } - if (err =3D=3D 0 && pers->sync_request && md_bitmap_registered(mddev) && + if (err =3D=3D 0 && pers->sync_request && (mddev->bitmap_info.file || mddev->bitmap_info.offset)) { - err =3D mddev->bitmap_ops->create(mddev); + err =3D md_bitmap_create(mddev); if (err) pr_warn("%s: failed to create bitmap (%d)\n", mdname(mddev), err); @@ -6412,8 +6438,7 @@ int md_run(struct mddev *mddev) pers->free(mddev, mddev->private); mddev->private =3D NULL; put_pers(pers); - if (md_bitmap_registered(mddev)) - mddev->bitmap_ops->destroy(mddev); + md_bitmap_destroy(mddev); abort: bioset_exit(&mddev->io_clone_set); exit_sync_set: @@ -6436,7 +6461,7 @@ int do_md_run(struct mddev *mddev) if (md_bitmap_registered(mddev)) { err =3D mddev->bitmap_ops->load(mddev); if (err) { - mddev->bitmap_ops->destroy(mddev); + md_bitmap_destroy(mddev); goto out; } } @@ -6627,8 +6652,7 @@ static void __md_stop(struct mddev *mddev) { struct md_personality *pers =3D mddev->pers; =20 - if (md_bitmap_registered(mddev)) - mddev->bitmap_ops->destroy(mddev); + md_bitmap_destroy(mddev); mddev_detach(mddev); spin_lock(&mddev->lock); mddev->pers =3D NULL; @@ -7408,16 +7432,16 @@ static int set_bitmap_file(struct mddev *mddev, int= fd) err =3D 0; if (mddev->pers) { if (fd >=3D 0) { - err =3D mddev->bitmap_ops->create(mddev); + err =3D md_bitmap_create(mddev); if (!err) err =3D mddev->bitmap_ops->load(mddev); =20 if (err) { - mddev->bitmap_ops->destroy(mddev); + md_bitmap_destroy(mddev); fd =3D -1; } } else if (fd < 0) { - mddev->bitmap_ops->destroy(mddev); + md_bitmap_destroy(mddev); } } =20 @@ -7732,12 +7756,12 @@ static int update_array_info(struct mddev *mddev, m= du_array_info_t *info) mddev->bitmap_info.default_offset; mddev->bitmap_info.space =3D mddev->bitmap_info.default_space; - rv =3D mddev->bitmap_ops->create(mddev); + rv =3D md_bitmap_create(mddev); if (!rv) rv =3D mddev->bitmap_ops->load(mddev); =20 if (rv) - mddev->bitmap_ops->destroy(mddev); + md_bitmap_destroy(mddev); } else { struct md_bitmap_stats stats; =20 @@ -7763,7 +7787,7 @@ static int update_array_info(struct mddev *mddev, mdu= _array_info_t *info) put_cluster_ops(mddev); mddev->safemode_delay =3D DEFAULT_SAFEMODE_DELAY; } - mddev->bitmap_ops->destroy(mddev); + md_bitmap_destroy(mddev); mddev->bitmap_info.offset =3D 0; } } --=20 2.39.2 From nobody Fri Dec 19 16:08:17 2025 Received: from dggsgout12.his.huawei.com (dggsgout12.his.huawei.com [45.249.212.56]) (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 665721A265E; Sat, 24 May 2025 06:18:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748067499; cv=none; b=HQrX7A/iNaQPlTv219vXe7bhseUv5fltMXmR3ZhOIUDdUxXCHacsrcMoe4edsfVoVQ0O8iF9wP7boZRSPEqf/1FQFoWmql4nm7u/0yKh2VA3wLllneKYnEkFBIulo/U8FM/nP1LrZjwhg+ENCm6glmt5E+W5yDbeHiutBTNk/OU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748067499; c=relaxed/simple; bh=5yuC0RFALU4ynBSU7b5EZi4+oIyvCAXeBvL/+24D3Hk=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=HuQSdL9qMjhP0F8A/Zb+N3DsAWxUFEt0udQr1vExZDUlcDRJulogQ1zTPUUc89v5x6taOEEsv/yXzGl8ghsTblGfaa3V1vJs08dyzrJRvcbNZeiZfJBaexkvS+JRvH7kRiDA02wLqY3BM2AYNztnrYAeZewpWg0et0Na/Ob4qII= 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.56 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.93.142]) by dggsgout12.his.huawei.com (SkyGuard) with ESMTPS id 4b4Bfc6qP8zKHMZw; Sat, 24 May 2025 14:18:16 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.128]) by mail.maildlp.com (Postfix) with ESMTP id 6DBC81A018D; Sat, 24 May 2025 14:18:15 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP4 (Coremail) with SMTP id gCh0CgCnCl+dZDFo3etkNQ--.42979S12; Sat, 24 May 2025 14:18:15 +0800 (CST) From: Yu Kuai To: hch@lst.de, xni@redhat.com, colyli@kernel.org, song@kernel.org, yukuai3@huawei.com Cc: linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-raid@vger.kernel.org, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com, johnny.chenyi@huawei.com Subject: [PATCH 08/23] md/md-bitmap: add a new method skip_sync_blocks() in bitmap_operations Date: Sat, 24 May 2025 14:13:05 +0800 Message-Id: <20250524061320.370630-9-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20250524061320.370630-1-yukuai1@huaweicloud.com> References: <20250524061320.370630-1-yukuai1@huaweicloud.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: gCh0CgCnCl+dZDFo3etkNQ--.42979S12 X-Coremail-Antispam: 1UD129KBjvJXoW7Cw4rZw15uw4rWr4rXrWrKrg_yoW8Aw1xpa 97JFy3C3y5Xr4Yq3W7XFyDuFyFv34ktFy7tFy7u34rWr97JrnrGF45Wa4qqa4DGF13AFZx Z3W5JrWrZF1Iqr7anT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUmS14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_Ar0_tr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F 4UJwA2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq 3wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0I7 IYx2IY67AKxVWUJVWUGwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r1j6r4U M4x0Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwACI402YVCY1x02628vn2 kIc2xKxwCY1x0262kKe7AKxVWUtVW8ZwCF04k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7xkE bVWUJVW8JwC20s026c02F40E14v26r1j6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E67 AF67kF1VAFwI0_Jw0_GFylIxkGc2Ij64vIr41lIxAIcVC0I7IYx2IY67AKxVWUCVW8JwCI 42IY6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F4UJwCI42IY6xAIw20EY4v20xvaj40_Jr0_JF 4lIxAIcVC2z280aVAFwI0_Jr0_Gr1lIxAIcVC2z280aVCY1x0267AKxVW8Jr0_Cr1UYxBI daVFxhVjvjDU0xZFpf9x0JUQFxUUUUUU= X-CM-SenderInfo: 51xn3trlr6x35dzhxuhorxvhhfrp/ Content-Type: text/plain; charset="utf-8" From: Yu Kuai This method is used to check if blocks can be skipped before calling into pers->sync_request(), llbiltmap will use this method to skip resync for unwritten/clean data blocks, and recovery/check/repair for unwritten data blocks; Signed-off-by: Yu Kuai Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke Reviewed-by: Xiao Ni --- drivers/md/md-bitmap.h | 1 + drivers/md/md.c | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/drivers/md/md-bitmap.h b/drivers/md/md-bitmap.h index 2b99ddef7a41..0de14d475ad3 100644 --- a/drivers/md/md-bitmap.h +++ b/drivers/md/md-bitmap.h @@ -98,6 +98,7 @@ struct bitmap_operations { md_bitmap_fn *start_discard; md_bitmap_fn *end_discard; =20 + sector_t (*skip_sync_blocks)(struct mddev *mddev, sector_t offset); bool (*start_sync)(struct mddev *mddev, sector_t offset, sector_t *blocks, bool degraded); void (*end_sync)(struct mddev *mddev, sector_t offset, sector_t *blocks); diff --git a/drivers/md/md.c b/drivers/md/md.c index dc4b85f30e13..890c8da43b3b 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -9362,6 +9362,12 @@ void md_do_sync(struct md_thread *thread) if (test_bit(MD_RECOVERY_INTR, &mddev->recovery)) break; =20 + if (mddev->bitmap_ops && mddev->bitmap_ops->skip_sync_blocks) { + sectors =3D mddev->bitmap_ops->skip_sync_blocks(mddev, j); + if (sectors) + goto update; + } + sectors =3D mddev->pers->sync_request(mddev, j, max_sectors, &skipped); if (sectors =3D=3D 0) { @@ -9377,6 +9383,7 @@ void md_do_sync(struct md_thread *thread) if (test_bit(MD_RECOVERY_INTR, &mddev->recovery)) break; =20 +update: j +=3D sectors; if (j > max_sectors) /* when skipping, extra large numbers can be returned. */ --=20 2.39.2 From nobody Fri Dec 19 16:08:17 2025 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 D82721C4A20; Sat, 24 May 2025 06:18:17 +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=1748067500; cv=none; b=mSKek07tlXPsgRsxjwZJSbgAlR5Ccwkn6aQzxIET8zJuGOq+0GdOvKC8XAqi9I7pUAUfZ6K5C+iim3Vtls0k0SfStF2UGKBLU3J8ixgF41I8j8Ur6s/79C1MxuF1v9+AbkY/0Z04tGQLtj0EY6Rp6DDRkRwHaLeHfEoaQ9Us2wg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748067500; c=relaxed/simple; bh=D5penB9NL6II0rUhrkoP9KLZSWO8Ht7yrkfliTqgWRA=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=XBWxe9UhrBX/l+A0HxFxTpv8m47LCD22kQZjUU1B6HkatpYC0eHEyZ0ka4/gFT6tCmo7qzLySG7aX26nfYWEsYc99o/peKixJgCxHkVNVKsvT/TCVS4Un0fyyzzo66Wx/JOwIcFx+AtxZ3TrNK6mlgiPzQnf9zZIv7BcKMiWPFc= 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 ESMTPS id 4b4Bfc5cvkzYQv2N; Sat, 24 May 2025 14:18:16 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.128]) by mail.maildlp.com (Postfix) with ESMTP id E938E1A0ACF; Sat, 24 May 2025 14:18:15 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP4 (Coremail) with SMTP id gCh0CgCnCl+dZDFo3etkNQ--.42979S13; Sat, 24 May 2025 14:18:15 +0800 (CST) From: Yu Kuai To: hch@lst.de, xni@redhat.com, colyli@kernel.org, song@kernel.org, yukuai3@huawei.com Cc: linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-raid@vger.kernel.org, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com, johnny.chenyi@huawei.com Subject: [PATCH 09/23] md/md-bitmap: add a new method blocks_synced() in bitmap_operations Date: Sat, 24 May 2025 14:13:06 +0800 Message-Id: <20250524061320.370630-10-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20250524061320.370630-1-yukuai1@huaweicloud.com> References: <20250524061320.370630-1-yukuai1@huaweicloud.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: gCh0CgCnCl+dZDFo3etkNQ--.42979S13 X-Coremail-Antispam: 1UD129KBjvJXoW7ZrWDWFW8XFy7WF4UXryrWFg_yoW8Kr47pa 9xXasxu3yjgr4jqF1UJayDuFyFq3s7JrWxKFyfu3yfuF95Kr9rWFWrKayUtF1UKF1aqasx Z3Z8trWUCr1FqrJanT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUmS14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_Ar0_tr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F 4UJwA2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq 3wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0I7 IYx2IY67AKxVWUJVWUGwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r1j6r4U M4x0Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwACI402YVCY1x02628vn2 kIc2xKxwCY1x0262kKe7AKxVWUtVW8ZwCF04k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7xkE bVWUJVW8JwC20s026c02F40E14v26r1j6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E67 AF67kF1VAFwI0_Jw0_GFylIxkGc2Ij64vIr41lIxAIcVC0I7IYx2IY67AKxVWUCVW8JwCI 42IY6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F4UJwCI42IY6xAIw20EY4v20xvaj40_Jr0_JF 4lIxAIcVC2z280aVAFwI0_Jr0_Gr1lIxAIcVC2z280aVCY1x0267AKxVW8Jr0_Cr1UYxBI daVFxhVjvjDU0xZFpf9x0JUQFxUUUUUU= X-CM-SenderInfo: 51xn3trlr6x35dzhxuhorxvhhfrp/ Content-Type: text/plain; charset="utf-8" From: Yu Kuai Currently, raid456 must perform a whole array initial recovery to build initail xor data, then IO to the array won't have to read all the blocks in underlying disks. This behavior will affect IO performance a lot, and nowadays there are huge disks and the initial recovery can take a long time. Hence llbitmap will support lazy initial recovery in following patches. This method is used to check if data blocks is synced or not, if not then IO will still have to read all blocks for raid456. Signed-off-by: Yu Kuai Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- drivers/md/md-bitmap.h | 1 + drivers/md/raid5.c | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/drivers/md/md-bitmap.h b/drivers/md/md-bitmap.h index 0de14d475ad3..f2d79c8a23b7 100644 --- a/drivers/md/md-bitmap.h +++ b/drivers/md/md-bitmap.h @@ -99,6 +99,7 @@ struct bitmap_operations { md_bitmap_fn *end_discard; =20 sector_t (*skip_sync_blocks)(struct mddev *mddev, sector_t offset); + bool (*blocks_synced)(struct mddev *mddev, sector_t offset); bool (*start_sync)(struct mddev *mddev, sector_t offset, sector_t *blocks, bool degraded); void (*end_sync)(struct mddev *mddev, sector_t offset, sector_t *blocks); diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index 7e66a99f29af..e5d3d8facb4b 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c @@ -3748,6 +3748,7 @@ static int want_replace(struct stripe_head *sh, int d= isk_idx) static int need_this_block(struct stripe_head *sh, struct stripe_head_stat= e *s, int disk_idx, int disks) { + struct mddev *mddev =3D sh->raid_conf->mddev; struct r5dev *dev =3D &sh->dev[disk_idx]; struct r5dev *fdev[2] =3D { &sh->dev[s->failed_num[0]], &sh->dev[s->failed_num[1]] }; @@ -3762,6 +3763,11 @@ static int need_this_block(struct stripe_head *sh, s= truct stripe_head_state *s, */ return 0; =20 + /* The initial recover is not done, must read everything */ + if (mddev->bitmap_ops && mddev->bitmap_ops->blocks_synced && + !mddev->bitmap_ops->blocks_synced(mddev, sh->sector)) + return 1; + if (dev->toread || (dev->towrite && !test_bit(R5_OVERWRITE, &dev->flags))) /* We need this block to directly satisfy a request */ --=20 2.39.2 From nobody Fri Dec 19 16:08:17 2025 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 7E11D1DB13E; Sat, 24 May 2025 06:18:17 +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=1748067500; cv=none; b=actb7xzyln7cb5QRzrRfmqD+M9qWXjUJw3ExKKr0e6WWBwBy656LyvtDEPG2jXgNItYnvAUGMt1smKaHoaxaiAvQXyg+vVS00sxsBbIWFaTnTmtPYilFRLwuEOq5B+u4XSyZbqFOmQUmxPL0PXNrPQ3/lUQRlz9YdcpLuhK6yMM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748067500; c=relaxed/simple; bh=vB5GKnNKvhYR76lqy/eH42/66y+lmP0geF9HoNogll8=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=V56xtXOcNmWbZXp9tCCcJybGzsr4QjNEAu6gGlvjeTBBvD0nub4/AhcbMOHUP64J5beWy6Oa+2EFvLgEls70KL+gueAXM9fWLkMZq9Hyrgn4JyRzzEarI/lhNDroU/ElDQOaYmEtI1iAWLtgPZJndCKWIuWNCZoquICCy9uEUGE= 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.216]) by dggsgout11.his.huawei.com (SkyGuard) with ESMTPS id 4b4Bfd1x3TzYQv2Z; Sat, 24 May 2025 14:18:17 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.128]) by mail.maildlp.com (Postfix) with ESMTP id 6CC781A018C; Sat, 24 May 2025 14:18:16 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP4 (Coremail) with SMTP id gCh0CgCnCl+dZDFo3etkNQ--.42979S14; Sat, 24 May 2025 14:18:16 +0800 (CST) From: Yu Kuai To: hch@lst.de, xni@redhat.com, colyli@kernel.org, song@kernel.org, yukuai3@huawei.com Cc: linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-raid@vger.kernel.org, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com, johnny.chenyi@huawei.com Subject: [PATCH 10/23] md: add a new recovery_flag MD_RECOVERY_LAZY_RECOVER Date: Sat, 24 May 2025 14:13:07 +0800 Message-Id: <20250524061320.370630-11-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20250524061320.370630-1-yukuai1@huaweicloud.com> References: <20250524061320.370630-1-yukuai1@huaweicloud.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: gCh0CgCnCl+dZDFo3etkNQ--.42979S14 X-Coremail-Antispam: 1UD129KBjvJXoWxGryUuFWDtFW5Jw1DtF15XFb_yoW5GF1kpF WxAF98CrW5AFW3ZayUt3WDWFW5Zw10qryqyFy3uas8JF90yrnavF1UWa47JrWDJa9aqa12 q3WDAFsrZF1F9w7anT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUmS14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_Ar0_tr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F 4UJwA2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq 3wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0I7 IYx2IY67AKxVWUJVWUGwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r1j6r4U M4x0Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwACI402YVCY1x02628vn2 kIc2xKxwCY1x0262kKe7AKxVWUtVW8ZwCF04k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7xkE bVWUJVW8JwC20s026c02F40E14v26r1j6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E67 AF67kF1VAFwI0_Jw0_GFylIxkGc2Ij64vIr41lIxAIcVC0I7IYx2IY67AKxVW8JVW5JwCI 42IY6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F4UJwCI42IY6xAIw20EY4v20xvaj40_Jr0_JF 4lIxAIcVC2z280aVAFwI0_Gr0_Cr1lIxAIcVC2z280aVCY1x0267AKxVW8Jr0_Cr1UYxBI daVFxhVjvjDU0xZFpf9x0JUQFxUUUUUU= X-CM-SenderInfo: 51xn3trlr6x35dzhxuhorxvhhfrp/ Content-Type: text/plain; charset="utf-8" From: Yu Kuai This flag is used by llbitmap in later patches to skip raid456 initial recover and delay building initial xor data to first write. Signed-off-by: Yu Kuai Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- drivers/md/md.c | 12 +++++++++++- drivers/md/md.h | 2 ++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/drivers/md/md.c b/drivers/md/md.c index 890c8da43b3b..737fdb6474bd 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -9132,6 +9132,14 @@ static sector_t md_sync_position(struct mddev *mddev= , enum sync_action action) start =3D rdev->recovery_offset; rcu_read_unlock(); =20 + /* + * If there are no spares, and raid456 lazy initial recover is + * requested. + */ + if (test_bit(MD_RECOVERY_LAZY_RECOVER, &mddev->recovery) && + start =3D=3D MaxSector) + start =3D 0; + /* If there is a bitmap, we need to make sure all * writes that started before we added a spare * complete before we start doing a recovery. @@ -9689,6 +9697,7 @@ static bool md_choose_sync_action(struct mddev *mddev= , int *spares) if (mddev->recovery_cp < MaxSector) { set_bit(MD_RECOVERY_SYNC, &mddev->recovery); clear_bit(MD_RECOVERY_RECOVER, &mddev->recovery); + clear_bit(MD_RECOVERY_LAZY_RECOVER, &mddev->recovery); return true; } =20 @@ -9698,7 +9707,7 @@ static bool md_choose_sync_action(struct mddev *mddev= , int *spares) * re-add. */ *spares =3D remove_and_add_spares(mddev, NULL); - if (*spares) { + if (*spares || test_bit(MD_RECOVERY_LAZY_RECOVER, &mddev->recovery)) { clear_bit(MD_RECOVERY_SYNC, &mddev->recovery); clear_bit(MD_RECOVERY_CHECK, &mddev->recovery); clear_bit(MD_RECOVERY_REQUESTED, &mddev->recovery); @@ -10021,6 +10030,7 @@ void md_reap_sync_thread(struct mddev *mddev) clear_bit(MD_RECOVERY_RESHAPE, &mddev->recovery); clear_bit(MD_RECOVERY_REQUESTED, &mddev->recovery); clear_bit(MD_RECOVERY_CHECK, &mddev->recovery); + clear_bit(MD_RECOVERY_LAZY_RECOVER, &mddev->recovery); /* * We call mddev->cluster_ops->update_size here because sync_size could * be changed by md_update_sb, and MD_RECOVERY_RESHAPE is cleared, diff --git a/drivers/md/md.h b/drivers/md/md.h index bf34c0a36551..3adb1660c7ed 100644 --- a/drivers/md/md.h +++ b/drivers/md/md.h @@ -667,6 +667,8 @@ enum recovery_flags { MD_RECOVERY_RESHAPE, /* remote node is running resync thread */ MD_RESYNCING_REMOTE, + /* raid456 lazy initial recover */ + MD_RECOVERY_LAZY_RECOVER, }; =20 enum md_ro_state { --=20 2.39.2 From nobody Fri Dec 19 16:08:17 2025 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 451481E0E0B; Sat, 24 May 2025 06:18:19 +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=1748067502; cv=none; b=mlZqcOasdTcunvxkmT/63wjT+g21dZ9HihGMoa06FBMN0MsHCEk96PYgsL09k14/BZM1vCz2pLni3e/xxU059PKfuUgoG5IDl7cdECF1p7NoVfTFazB2Kz2pOPWMhjOKunqljfwJ7YbkhWbjBpWZgbAUZK9YaMzF7DTOQO8botg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748067502; c=relaxed/simple; bh=wbaok4K0QP0HOyle++cwm5Uvsn9pwvwwXOV07Nt9TZs=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=G+DuPiS/Ey19vV2cMCoo8o30sbgbLDOKY+ck0fMQ48KXkEGXeyli3w9pTxI+6VcF5dHsYGxf839SyNJjNtr+6wp8GJ3hQYLf9lB74LlPDr+pHSCNv/AV4dGRZ5ZppRKvoLX/6makF5LsMYhK2OCVpYmpFRDvf6cdUs6aosUBEnk= 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 4b4Bf622Yrz4f3jMF; Sat, 24 May 2025 14:17:50 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.128]) by mail.maildlp.com (Postfix) with ESMTP id E68B91A0BB2; Sat, 24 May 2025 14:18:16 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP4 (Coremail) with SMTP id gCh0CgCnCl+dZDFo3etkNQ--.42979S15; Sat, 24 May 2025 14:18:16 +0800 (CST) From: Yu Kuai To: hch@lst.de, xni@redhat.com, colyli@kernel.org, song@kernel.org, yukuai3@huawei.com Cc: linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-raid@vger.kernel.org, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com, johnny.chenyi@huawei.com Subject: [PATCH 11/23] md/md-bitmap: make method bitmap_ops->daemon_work optional Date: Sat, 24 May 2025 14:13:08 +0800 Message-Id: <20250524061320.370630-12-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20250524061320.370630-1-yukuai1@huaweicloud.com> References: <20250524061320.370630-1-yukuai1@huaweicloud.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: gCh0CgCnCl+dZDFo3etkNQ--.42979S15 X-Coremail-Antispam: 1UD129KBjvdXoWrtFyUGryxCry7KF47Zw4xZwb_yoWkJrXE9F yrJrWxWry29F9ayw13Zw4fZr9rXw4kuwnrXF4IqFyjq3yrJ340gFZ7ZwnrX3yxJFZIy347 ArZ8Xry0yr4kujkaLaAFLSUrUUUUjb8apTn2vfkv8UJUUUU8Yxn0WfASr-VFAUDa7-sFnT 9fnUUIcSsGvfJTRUUUbvAFF20E14v26rWj6s0DM7CY07I20VC2zVCF04k26cxKx2IYs7xG 6rWj6s0DM7CIcVAFz4kK6r1j6r18M28IrcIa0xkI8VA2jI8067AKxVWUAVCq3wA2048vs2 IY020Ec7CjxVAFwI0_Xr0E3s1l8cAvFVAK0II2c7xJM28CjxkF64kEwVA0rcxSw2x7M28E F7xvwVC0I7IYx2IY67AKxVW7JVWDJwA2z4x0Y4vE2Ix0cI8IcVCY1x0267AKxVW8Jr0_Cr 1UM28EF7xvwVC2z280aVAFwI0_GcCE3s1l84ACjcxK6I8E87Iv6xkF7I0E14v26rxl6s0D M2AIxVAIcxkEcVAq07x20xvEncxIr21l5I8CrVACY4xI64kE6c02F40Ex7xfMcIj6xIIjx v20xvE14v26r1j6r18McIj6I8E87Iv67AKxVWUJVW8JwAm72CE4IkC6x0Yz7v_Jr0_Gr1l F7xvr2IYc2Ij64vIr41lF7I21c0EjII2zVCS5cI20VAGYxC7M4IIrI8v6xkF7I0E8cxan2 IY04v7MxkF7I0En4kS14v26r1q6r43MxAIw28IcxkI7VAKI48JMxC20s026xCaFVCjc4AY 6r1j6r4UMI8I3I0E5I8CrVAFwI0_Jr0_Jr4lx2IqxVCjr7xvwVAFwI0_JrI_JrWlx4CE17 CEb7AF67AKxVWUtVW8ZwCIc40Y0x0EwIxGrwCI42IY6xIIjxv20xvE14v26r4j6ryUMIIF 0xvE2Ix0cI8IcVCY1x0267AKxVW8Jr0_Cr1UMIIF0xvE42xK8VAvwI8IcIk0rVWUJVWUCw CI42IY6I8E87Iv67AKxVW8JVWxJwCI42IY6I8E87Iv6xkF7I0E14v26r4UJVWxJrUvcSsG vfC2KfnxnUUI43ZEXa7VUbPC7UUUUUU== X-CM-SenderInfo: 51xn3trlr6x35dzhxuhorxvhhfrp/ Content-Type: text/plain; charset="utf-8" From: Yu Kuai daemon_work() will be called by daemon thread, on the one hand, daemon thread doesn't have strict wake-up time; on the other hand, too much work are put to daemon thread, like handle sync IO, handle failed or specail normal IO, handle recovery, and so on. Hence daemon thread may be too busy to clear dirty bits in time. Make bitmap_ops->daemon_work() optional and following patches will use separate async work to clear dirty bits for the new bitmap. Signed-off-by: Yu Kuai Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- drivers/md/md.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/md/md.c b/drivers/md/md.c index 737fdb6474bd..c7f7914b7452 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -9853,7 +9853,7 @@ static void unregister_sync_thread(struct mddev *mdde= v) */ void md_check_recovery(struct mddev *mddev) { - if (md_bitmap_enabled(mddev)) + if (md_bitmap_enabled(mddev) && mddev->bitmap_ops->daemon_work) mddev->bitmap_ops->daemon_work(mddev); =20 if (signal_pending(current)) { --=20 2.39.2 From nobody Fri Dec 19 16:08:17 2025 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 9FDDA1E5711; Sat, 24 May 2025 06:18:20 +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=1748067504; cv=none; b=MOLjeJWTTvuIll8LcNgDLxwhEYcCZrXqI1ZRTT5P9TdVnGXc9zB9qEHMWDHSomlbzAHvtdfrdVhUVDT8WJSEG/b44gxeOzgv57cGVsS0Mk/1bTMKWLnZo3gAxjPZ9zTAMCQFgsb7jCLhmgsKpjZChzxNUs1f4kjXFE92KRB5a+M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748067504; c=relaxed/simple; bh=o8zqeosfdRUrjMknHUDsgW0jqq1gEF4Dv7+TYluWojk=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=K4PJnmmGNi56jBWZC9z0YbVpXAMEff4odFu9pj0+TYacIV/aHB5g/bjA6DHp7FTxGH9r2sDCrdxOKsaGOEZkRs9AcaFokJUB7lhzYCUy5cOTRjAS8LYnIueunX/3pqhT+n3ltrfySdYo/zhGxrQYoFRtoEhM1jh+ul0PIB+Y/Bg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=huaweicloud.com; spf=none 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=none smtp.mailfrom=huaweicloud.com Received: from mail.maildlp.com (unknown [172.19.163.216]) by dggsgout11.his.huawei.com (SkyGuard) with ESMTP id 4b4Bf65SgJz4f3jMQ; Sat, 24 May 2025 14:17:50 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.128]) by mail.maildlp.com (Postfix) with ESMTP id 690C71A140E; Sat, 24 May 2025 14:18:17 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP4 (Coremail) with SMTP id gCh0CgCnCl+dZDFo3etkNQ--.42979S16; Sat, 24 May 2025 14:18:17 +0800 (CST) From: Yu Kuai To: hch@lst.de, xni@redhat.com, colyli@kernel.org, song@kernel.org, yukuai3@huawei.com Cc: linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-raid@vger.kernel.org, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com, johnny.chenyi@huawei.com Subject: [PATCH 12/23] md/md-bitmap: add macros for lockless bitmap Date: Sat, 24 May 2025 14:13:09 +0800 Message-Id: <20250524061320.370630-13-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20250524061320.370630-1-yukuai1@huaweicloud.com> References: <20250524061320.370630-1-yukuai1@huaweicloud.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: gCh0CgCnCl+dZDFo3etkNQ--.42979S16 X-Coremail-Antispam: 1UD129KBjvJXoW7ZF13JFy8trW5AFyftw1DZFb_yoW8uFyDpF 92qr9akr13JFsrXr18Ja47ua45J3s2yrZxKryku3yrCFyYvrW3Ary8W3W7J34kWF1fJFZI gF15K3s5W3srurJanT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUmS14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_Ar0_tr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F 4UJwA2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq 3wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0I7 IYx2IY67AKxVWUJVWUGwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r1j6r4U M4x0Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwACI402YVCY1x02628vn2 kIc2xKxwCY1x0262kKe7AKxVWUtVW8ZwCF04k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7xkE bVWUJVW8JwC20s026c02F40E14v26r1j6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E67 AF67kF1VAFwI0_Jw0_GFylIxkGc2Ij64vIr41lIxAIcVC0I7IYx2IY67AKxVW8JVW5JwCI 42IY6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F4UJwCI42IY6xAIw20EY4v20xvaj40_Jr0_JF 4lIxAIcVC2z280aVAFwI0_Gr0_Cr1lIxAIcVC2z280aVCY1x0267AKxVW8Jr0_Cr1UYxBI daVFxhVjvjDU0xZFpf9x0JUQFxUUUUUU= X-CM-SenderInfo: 51xn3trlr6x35dzhxuhorxvhhfrp/ Content-Type: text/plain; charset="utf-8" From: Yu Kuai Also move other values to md-bitmap.h and update comments. Signed-off-by: Yu Kuai Reviewed-by: Hannes Reinecke --- drivers/md/md-bitmap.c | 9 --------- drivers/md/md-bitmap.h | 17 +++++++++++++++++ 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/drivers/md/md-bitmap.c b/drivers/md/md-bitmap.c index 17d41a7b30ce..689d5dba9328 100644 --- a/drivers/md/md-bitmap.c +++ b/drivers/md/md-bitmap.c @@ -36,15 +36,6 @@ #include "md-bitmap.h" #include "md-cluster.h" =20 -#define BITMAP_MAJOR_LO 3 -/* version 4 insists the bitmap is in little-endian order - * with version 3, it is host-endian which is non-portable - * Version 5 is currently set only for clustered devices - */ -#define BITMAP_MAJOR_HI 4 -#define BITMAP_MAJOR_CLUSTERED 5 -#define BITMAP_MAJOR_HOSTENDIAN 3 - /* * in-memory bitmap: * diff --git a/drivers/md/md-bitmap.h b/drivers/md/md-bitmap.h index f2d79c8a23b7..d2cdf831ef1a 100644 --- a/drivers/md/md-bitmap.h +++ b/drivers/md/md-bitmap.h @@ -18,10 +18,27 @@ typedef __u16 bitmap_counter_t; #define RESYNC_MASK ((bitmap_counter_t) (1 << (COUNTER_BITS - 2))) #define COUNTER_MAX ((bitmap_counter_t) RESYNC_MASK - 1) =20 +/* + * version 3 is host-endian order, this is deprecated and not used for new + * array + */ +#define BITMAP_MAJOR_LO 3 +#define BITMAP_MAJOR_HOSTENDIAN 3 +/* version 4 is little-endian order, the default value */ +#define BITMAP_MAJOR_HI 4 +/* version 5 is only used for cluster */ +#define BITMAP_MAJOR_CLUSTERED 5 +/* version 6 is only used for lockless bitmap */ +#define BITMAP_MAJOR_LOCKLESS 6 + +#define BITMAP_SB_SIZE 1024 /* use these for bitmap->flags and bitmap->sb->state bit-fields */ enum bitmap_state { BITMAP_STALE =3D 1, /* the bitmap file is out of date or had -EIO */ BITMAP_WRITE_ERROR =3D 2, /* A write error has occurred */ + BITMAP_FIRST_USE =3D 3, /* llbitmap is just created */ + BITMAP_CLEAN =3D 4, /* llbitmap is created with assume_clean */ + BITMAP_DAEMON_BUSY =3D 5, /* llbitmap daemon is not finished after daemon= _sleep */ BITMAP_HOSTENDIAN =3D15, }; =20 --=20 2.39.2 From nobody Fri Dec 19 16:08:17 2025 Received: from dggsgout12.his.huawei.com (dggsgout12.his.huawei.com [45.249.212.56]) (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 002791DFDA5; Sat, 24 May 2025 06:18:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748067501; cv=none; b=rwcsDvn5GXABpoDsId2mJ1DyMq0pXO/vVU1Yt3kyVVuSqZC9TIPum6imvCRz5jP5wEYAWJtTuhuBIuq6Ye7rPRXPr4mZza/eyqZzLHVgYFzr9ETDWdm9VE5EDfcMyMNbSfdpSmcSJjkDOEpY5EC3IC/0a3CaNxLZuUM2BcCC7oY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748067501; c=relaxed/simple; bh=gF4q1MnynjtKoY4K5z56lCg8NbxZd1ZEpE+ukJebSYM=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=HpJ93JugS3O39USb6NJPc1G0p/FVEla4M8V4OkHRxe8sfV45gHxTV9kDQ2X41/8xrNHJTQ1/ypzDZIbNZ5Db8i18z6Q8ecuhfphLIJVbMQj9DxQauPEs5BXfBZ4WeLZgEwvVGYm/Rida8OdQF0N7ooDHFv196qWxsaNwpDrIXkY= 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.56 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.93.142]) by dggsgout12.his.huawei.com (SkyGuard) with ESMTPS id 4b4Bfg3R7rzKHMbS; Sat, 24 May 2025 14:18:19 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.128]) by mail.maildlp.com (Postfix) with ESMTP id EDDE71A018D; Sat, 24 May 2025 14:18:17 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP4 (Coremail) with SMTP id gCh0CgCnCl+dZDFo3etkNQ--.42979S17; Sat, 24 May 2025 14:18:17 +0800 (CST) From: Yu Kuai To: hch@lst.de, xni@redhat.com, colyli@kernel.org, song@kernel.org, yukuai3@huawei.com Cc: linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-raid@vger.kernel.org, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com, johnny.chenyi@huawei.com Subject: [PATCH 13/23] md/md-bitmap: fix dm-raid max_write_behind setting Date: Sat, 24 May 2025 14:13:10 +0800 Message-Id: <20250524061320.370630-14-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20250524061320.370630-1-yukuai1@huaweicloud.com> References: <20250524061320.370630-1-yukuai1@huaweicloud.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: gCh0CgCnCl+dZDFo3etkNQ--.42979S17 X-Coremail-Antispam: 1UD129KBjvdXoWrKry5trW3Xw1DWrW8Kr4kWFg_yoWfJrc_u3 WrWrZaqFyDGr1rJw13Zw13ZrZ0q3Z8X3WDurWxKrZ3Zrn8Za4rurs5u3yxta1fuFWDC3y5 Wry7Xr4rXrs5CjkaLaAFLSUrUUUUjb8apTn2vfkv8UJUUUU8Yxn0WfASr-VFAUDa7-sFnT 9fnUUIcSsGvfJTRUUUbvAFF20E14v26rWj6s0DM7CY07I20VC2zVCF04k26cxKx2IYs7xG 6rWj6s0DM7CIcVAFz4kK6r1j6r18M28IrcIa0xkI8VA2jI8067AKxVWUAVCq3wA2048vs2 IY020Ec7CjxVAFwI0_Xr0E3s1l8cAvFVAK0II2c7xJM28CjxkF64kEwVA0rcxSw2x7M28E F7xvwVC0I7IYx2IY67AKxVW7JVWDJwA2z4x0Y4vE2Ix0cI8IcVCY1x0267AKxVW8Jr0_Cr 1UM28EF7xvwVC2z280aVAFwI0_GcCE3s1l84ACjcxK6I8E87Iv6xkF7I0E14v26rxl6s0D M2AIxVAIcxkEcVAq07x20xvEncxIr21l5I8CrVACY4xI64kE6c02F40Ex7xfMcIj6xIIjx v20xvE14v26r1j6r18McIj6I8E87Iv67AKxVWUJVW8JwAm72CE4IkC6x0Yz7v_Jr0_Gr1l F7xvr2IYc2Ij64vIr41lF7I21c0EjII2zVCS5cI20VAGYxC7M4IIrI8v6xkF7I0E8cxan2 IY04v7MxkF7I0En4kS14v26r1q6r43MxAIw28IcxkI7VAKI48JMxC20s026xCaFVCjc4AY 6r1j6r4UMI8I3I0E5I8CrVAFwI0_Jr0_Jr4lx2IqxVCjr7xvwVAFwI0_JrI_JrWlx4CE17 CEb7AF67AKxVWUtVW8ZwCIc40Y0x0EwIxGrwCI42IY6xIIjxv20xvE14v26r4j6ryUMIIF 0xvE2Ix0cI8IcVCY1x0267AKxVW8Jr0_Cr1UMIIF0xvE42xK8VAvwI8IcIk0rVWUJVWUCw CI42IY6I8E87Iv67AKxVW8JVWxJwCI42IY6I8E87Iv6xkF7I0E14v26r4UJVWxJrUvcSsG vfC2KfnxnUUI43ZEXa7VUbPC7UUUUUU== X-CM-SenderInfo: 51xn3trlr6x35dzhxuhorxvhhfrp/ Content-Type: text/plain; charset="utf-8" From: Yu Kuai It's supposed to be COUNTER_MAX / 2, not COUNTER_MAX. Signed-off-by: Yu Kuai Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- drivers/md/md-bitmap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/md/md-bitmap.c b/drivers/md/md-bitmap.c index 689d5dba9328..535bc1888e8c 100644 --- a/drivers/md/md-bitmap.c +++ b/drivers/md/md-bitmap.c @@ -777,7 +777,7 @@ static int md_bitmap_new_disk_sb(struct bitmap *bitmap) * is a good choice? We choose COUNTER_MAX / 2 arbitrarily. */ write_behind =3D bitmap->mddev->bitmap_info.max_write_behind; - if (write_behind > COUNTER_MAX) + if (write_behind > COUNTER_MAX / 2) write_behind =3D COUNTER_MAX / 2; sb->write_behind =3D cpu_to_le32(write_behind); bitmap->mddev->bitmap_info.max_write_behind =3D write_behind; --=20 2.39.2 From nobody Fri Dec 19 16:08:17 2025 Received: from dggsgout12.his.huawei.com (dggsgout12.his.huawei.com [45.249.212.56]) (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 18DDB1E47C7; Sat, 24 May 2025 06:18:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748067503; cv=none; b=jrCw4p4mlNsQCnqqZxHvXye3F7DIBycEtULYOf0LJ0QJdj9mKWSb4tre26oR70EgvTbmHGVIO9p7B+xSEp8ONvDaVNy1vQ1yoLlnlkhBDLFjtTdhZe8tB5i1xB3lSXPEWzcJDL2Fu4jY/edX3o4uRmaZi7UAIioWlupB9AsfR2E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748067503; c=relaxed/simple; bh=k7JnBaIBLvh65ae499oAtO5YwWOn3daSEnUXUMRBkXI=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=I8Np4yahNc789VK/CTZAHPo1sB1I8tN1uvXZxQ3l/h5Jq3uyimn1sWFWpq3HL8M03o5iIudmMmak/AYFfAEhkePPx9uegB9L36301CWn+ajfpjilb/XHeNjI4F4vEQnDkI4AsS6iaa0WRoYNVFpdyYnQfOP24g3+JBRFqIjQv5M= 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.56 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.93.142]) by dggsgout12.his.huawei.com (SkyGuard) with ESMTP id 4b4Bf92PsZz4f3jJG; Sat, 24 May 2025 14:17:53 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.128]) by mail.maildlp.com (Postfix) with ESMTP id 77A831A018D; Sat, 24 May 2025 14:18:18 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP4 (Coremail) with SMTP id gCh0CgCnCl+dZDFo3etkNQ--.42979S18; Sat, 24 May 2025 14:18:18 +0800 (CST) From: Yu Kuai To: hch@lst.de, xni@redhat.com, colyli@kernel.org, song@kernel.org, yukuai3@huawei.com Cc: linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-raid@vger.kernel.org, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com, johnny.chenyi@huawei.com Subject: [PATCH 14/23] md/dm-raid: remove max_write_behind setting limit Date: Sat, 24 May 2025 14:13:11 +0800 Message-Id: <20250524061320.370630-15-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20250524061320.370630-1-yukuai1@huaweicloud.com> References: <20250524061320.370630-1-yukuai1@huaweicloud.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: gCh0CgCnCl+dZDFo3etkNQ--.42979S18 X-Coremail-Antispam: 1UD129KBjvJXoWxWFW5Cr48KF4UZF4xXrWkZwb_yoW5Gr17pr W7GrWSkF13JF47Wr15Xw18Za4Yq3srtr9xKFWfu34ruFyUXrn3Xr48ua1Yvr10gFWrJF90 qF15K34kWFy7GaDanT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUmS14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_Ar0_tr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F 4UJwA2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq 3wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0I7 IYx2IY67AKxVWUJVWUGwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r1j6r4U M4x0Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwACI402YVCY1x02628vn2 kIc2xKxwCY1x0262kKe7AKxVWUtVW8ZwCF04k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7xkE bVWUJVW8JwC20s026c02F40E14v26r1j6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E67 AF67kF1VAFwI0_Jw0_GFylIxkGc2Ij64vIr41lIxAIcVC0I7IYx2IY67AKxVW8JVW5JwCI 42IY6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F4UJwCI42IY6xAIw20EY4v20xvaj40_Jr0_JF 4lIxAIcVC2z280aVAFwI0_Gr0_Cr1lIxAIcVC2z280aVCY1x0267AKxVW8Jr0_Cr1UYxBI daVFxhVjvjDU0xZFpf9x0JUQFxUUUUUU= X-CM-SenderInfo: 51xn3trlr6x35dzhxuhorxvhhfrp/ Content-Type: text/plain; charset="utf-8" From: Yu Kuai The comments said 'vaule in kB', while the value actually means the number of write_behind IOs. And since md-bitmap will automatically adjust the value to max COUNTER_MAX / 2, there is no need to fail early. Also move some macros that is only used md-bitmap.c. Signed-off-by: Yu Kuai Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke Reviewed-by: Xiao Ni --- drivers/md/dm-raid.c | 6 +----- drivers/md/md-bitmap.c | 10 ++++++++++ drivers/md/md-bitmap.h | 9 --------- 3 files changed, 11 insertions(+), 14 deletions(-) diff --git a/drivers/md/dm-raid.c b/drivers/md/dm-raid.c index 088cfe6e0f98..9757c32ea1f5 100644 --- a/drivers/md/dm-raid.c +++ b/drivers/md/dm-raid.c @@ -1356,11 +1356,7 @@ static int parse_raid_params(struct raid_set *rs, st= ruct dm_arg_set *as, return -EINVAL; } =20 - /* - * In device-mapper, we specify things in sectors, but - * MD records this value in kB - */ - if (value < 0 || value / 2 > COUNTER_MAX) { + if (value < 0) { rs->ti->error =3D "Max write-behind limit out of range"; return -EINVAL; } diff --git a/drivers/md/md-bitmap.c b/drivers/md/md-bitmap.c index 535bc1888e8c..098e7b6cd187 100644 --- a/drivers/md/md-bitmap.c +++ b/drivers/md/md-bitmap.c @@ -98,9 +98,19 @@ * */ =20 +typedef __u16 bitmap_counter_t; + #define PAGE_BITS (PAGE_SIZE << 3) #define PAGE_BIT_SHIFT (PAGE_SHIFT + 3) =20 +#define COUNTER_BITS 16 +#define COUNTER_BIT_SHIFT 4 +#define COUNTER_BYTE_SHIFT (COUNTER_BIT_SHIFT - 3) + +#define NEEDED_MASK ((bitmap_counter_t) (1 << (COUNTER_BITS - 1))) +#define RESYNC_MASK ((bitmap_counter_t) (1 << (COUNTER_BITS - 2))) +#define COUNTER_MAX ((bitmap_counter_t) RESYNC_MASK - 1) + #define NEEDED(x) (((bitmap_counter_t) x) & NEEDED_MASK) #define RESYNC(x) (((bitmap_counter_t) x) & RESYNC_MASK) #define COUNTER(x) (((bitmap_counter_t) x) & COUNTER_MAX) diff --git a/drivers/md/md-bitmap.h b/drivers/md/md-bitmap.h index d2cdf831ef1a..a9a0f6a8d96d 100644 --- a/drivers/md/md-bitmap.h +++ b/drivers/md/md-bitmap.h @@ -9,15 +9,6 @@ =20 #define BITMAP_MAGIC 0x6d746962 =20 -typedef __u16 bitmap_counter_t; -#define COUNTER_BITS 16 -#define COUNTER_BIT_SHIFT 4 -#define COUNTER_BYTE_SHIFT (COUNTER_BIT_SHIFT - 3) - -#define NEEDED_MASK ((bitmap_counter_t) (1 << (COUNTER_BITS - 1))) -#define RESYNC_MASK ((bitmap_counter_t) (1 << (COUNTER_BITS - 2))) -#define COUNTER_MAX ((bitmap_counter_t) RESYNC_MASK - 1) - /* * version 3 is host-endian order, this is deprecated and not used for new * array --=20 2.39.2 From nobody Fri Dec 19 16:08:17 2025 Received: from dggsgout12.his.huawei.com (dggsgout12.his.huawei.com [45.249.212.56]) (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 F020B1E3DF2; Sat, 24 May 2025 06:18:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748067503; cv=none; b=VUy3VLwdWfNV70lDEFp/yEls/u5YCQ/nnrrSPlAs81rX3Sp9h7ECeiBvYDKLAzj/Y0Szuo73NLn7e7urJW9vJHanzjb3Aj9kffntmzTJFA9mkJJVk5rCPiibQASK/W3DYWLX5c2axC8vs3CFpEbe+qKpJ2bRLZAu03CyFsu5ecI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748067503; c=relaxed/simple; bh=6TJF9rnu6+7/4ix2JF6tqVvNjXpAyxePx0adE/oI/ow=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=XYzeA/mzE6YzaJx40F76KMP+m8/XyF9Mu+CHzzRYRiifLd+zDhxxMMeIf7A6j7+sXIuxHMe6jRiKt3tw7qwbuGS1WPHDR1ONZWAZNXRZot+acJIO1SKTQPYFKXWLBsgzNSLiN5QkHFmXkGgkTjMs8vqf7Gr3nCi7ZckYFA/yYoU= 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.56 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 dggsgout12.his.huawei.com (SkyGuard) with ESMTPS id 4b4Bfh3kKgzKHMcg; Sat, 24 May 2025 14:18:20 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.128]) by mail.maildlp.com (Postfix) with ESMTP id 022DD1A0E12; Sat, 24 May 2025 14:18:19 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP4 (Coremail) with SMTP id gCh0CgCnCl+dZDFo3etkNQ--.42979S19; Sat, 24 May 2025 14:18:18 +0800 (CST) From: Yu Kuai To: hch@lst.de, xni@redhat.com, colyli@kernel.org, song@kernel.org, yukuai3@huawei.com Cc: linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-raid@vger.kernel.org, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com, johnny.chenyi@huawei.com Subject: [PATCH 15/23] md/md-llbitmap: implement llbitmap IO Date: Sat, 24 May 2025 14:13:12 +0800 Message-Id: <20250524061320.370630-16-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20250524061320.370630-1-yukuai1@huaweicloud.com> References: <20250524061320.370630-1-yukuai1@huaweicloud.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: gCh0CgCnCl+dZDFo3etkNQ--.42979S19 X-Coremail-Antispam: 1UD129KBjvAXoWfGF43CrWUAFW8Jw48GrWrAFb_yoW8AFykWo WxZFyUAr4vqrn8WaykAr1rA3W7uw10gr1q9r1YkFn8WF4DX3Wjga47K3yfGrn0qrZ5Ar47 tF9aqr45urs7JF4rn29KB7ZKAUJUUUU8529EdanIXcx71UUUUU7v73VFW2AGmfu7bjvjm3 AaLaJ3UjIYCTnIWjp_UUUOV7AC8VAFwI0_Wr0E3s1l1xkIjI8I6I8E6xAIw20EY4v20xva j40_Wr0E3s1l1IIY67AEw4v_Jr0_Jr4l82xGYIkIc2x26280x7IE14v26r126s0DM28Irc Ia0xkI8VCY1x0267AKxVW5JVCq3wA2ocxC64kIII0Yj41l84x0c7CEw4AK67xGY2AK021l 84ACjcxK6xIIjxv20xvE14v26F1j6w1UM28EF7xvwVC0I7IYx2IY6xkF7I0E14v26r4UJV WxJr1l84ACjcxK6I8E87Iv67AKxVW0oVCq3wA2z4x0Y4vEx4A2jsIEc7CjxVAFwI0_GcCE 3s1le2I262IYc4CY6c8Ij28IcVAaY2xG8wAqx4xG64xvF2IEw4CE5I8CrVC2j2WlYx0E2I x0cI8IcVAFwI0_Jr0_Jr4lYx0Ex4A2jsIE14v26r1j6r4UMcvjeVCFs4IE7xkEbVWUJVW8 JwACjcxG0xvY0x0EwIxGrwACjI8F5VA0II8E6IAqYI8I648v4I1lFIxGxcIEc7CjxVA2Y2 ka0xkIwI1lc7CjxVAaw2AFwI0_Jw0_GFyl42xK82IYc2Ij64vIr41l4I8I3I0E4IkC6x0Y z7v_Jr0_Gr1lx2IqxVAqx4xG67AKxVWUJVWUGwC20s026x8GjcxK67AKxVWUGVWUWwC2zV AF1VAY17CE14v26r1q6r43MIIYrxkI7VAKI48JMIIF0xvE2Ix0cI8IcVAFwI0_Gr0_Xr1l IxAIcVC0I7IYx2IY6xkF7I0E14v26r4UJVWxJr1lIxAIcVCF04k26cxKx2IYs7xG6r1j6r 1xMIIF0xvEx4A2jsIE14v26r4j6F4UMIIF0xvEx4A2jsIEc7CjxVAFwI0_Gr1j6F4UJbIY CTnIWIevJa73UjIFyTuYvjfUOyIUUUUUU X-CM-SenderInfo: 51xn3trlr6x35dzhxuhorxvhhfrp/ Content-Type: text/plain; charset="utf-8" From: Yu Kuai READ While creating bitmap, all pages will be allocated and read for llbitmap, there won't be read afterwards WRITE WRITE IO is divided into logical_block_size of the page, the dirty state of each block is tracked independently, for example: each page is 4k, contain 8 blocks; each block is 512 bytes contain 512 bit; | page0 | page1 | ... | page 31 | | | | \-----------------------\ | | | block0 | block1 | ... | block 8| | | | \-----------------\ | | | bit0 | bit1 | ... | bit511 | From IO path, if one bit is changed to Dirty or NeedSync, the corresponding subpage will be marked dirty, such block must write first before the IO is issued. This behaviour will affect IO performance, to reduce the impact, if multiple bits are changed in the same block in a short time, all bits in this block will be changed to Dirty/NeedSync, so that there won't be any overhead until daemon clears dirty bits. Also add data structure definition and comments. Signed-off-by: Yu Kuai --- drivers/md/md-llbitmap.c | 571 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 571 insertions(+) create mode 100644 drivers/md/md-llbitmap.c diff --git a/drivers/md/md-llbitmap.c b/drivers/md/md-llbitmap.c new file mode 100644 index 000000000000..1a01b6777527 --- /dev/null +++ b/drivers/md/md-llbitmap.c @@ -0,0 +1,571 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +#ifdef CONFIG_MD_LLBITMAP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "md.h" +#include "md-bitmap.h" + +/* + * #### Background + * + * Redundant data is used to enhance data fault tolerance, and the storage + * method for redundant data vary depending on the RAID levels. And it's + * important to maintain the consistency of redundant data. + * + * Bitmap is used to record which data blocks have been synchronized and w= hich + * ones need to be resynchronized or recovered. Each bit in the bitmap + * represents a segment of data in the array. When a bit is set, it indica= tes + * that the multiple redundant copies of that data segment may not be + * consistent. Data synchronization can be performed based on the bitmap a= fter + * power failure or readding a disk. If there is no bitmap, a full disk + * synchronization is required. + * + * #### Key Features + * + * - IO fastpath is lockless, if user issues lots of write IO to the same + * bitmap bit in a short time, only the first write have additional overh= ead + * to update bitmap bit, no additional overhead for the following writes; + * - support only resync or recover written data, means in the case creat= ing + * new array or replacing with a new disk, there is no need to do a full = disk + * resync/recovery; + * + * #### Key Concept + * + * ##### State Machine + * + * Each bit is one byte, contain 6 difference state, see llbitmap_state. A= nd + * there are total 8 differenct actions, see llbitmap_action, can change s= tate: + * + * llbitmap state machine: transitions between states + * + * | | Startwrite | Startsync | Endsync | Abortsync| + * | --------- | ---------- | --------- | ------- | ------- | + * | Unwritten | Dirty | x | x | x | + * | Clean | Dirty | x | x | x | + * | Dirty | x | x | x | x | + * | NeedSync | x | Syncing | x | x | + * | Syncing | x | Syncing | Dirty | NeedSync | + * + * | | Reload | Daemon | Discard | Stale | + * | --------- | -------- | ------ | --------- | --------- | + * | Unwritten | x | x | x | x | + * | Clean | x | x | Unwritten | NeedSync | + * | Dirty | NeedSync | Clean | Unwritten | NeedSync | + * | NeedSync | x | x | Unwritten | x | + * | Syncing | NeedSync | x | Unwritten | NeedSync | + * + * Typical scenarios: + * + * 1) Create new array + * All bits will be set to Unwritten by default, if --assume-clean is set, + * all bits will be set to Clean instead. + * + * 2) write data, raid1/raid10 have full copy of data, while raid456 doesn= 't and + * rely on xor data + * + * 2.1) write new data to raid1/raid10: + * Unwritten --StartWrite--> Dirty + * + * 2.2) write new data to raid456: + * Unwritten --StartWrite--> NeedSync + * + * Because the initial recover for raid456 is skipped, the xor data is not= build + * yet, the bit must set to NeedSync first and after lazy initial recover = is + * finished, the bit will finially set to Dirty(see 5.1 and 5.4); + * + * 2.3) cover write + * Clean --StartWrite--> Dirty + * + * 3) daemon, if the array is not degraded: + * Dirty --Daemon--> Clean + * + * For degraded array, the Dirty bit will never be cleared, prevent full d= isk + * recovery while readding a removed disk. + * + * 4) discard + * {Clean, Dirty, NeedSync, Syncing} --Discard--> Unwritten + * + * 5) resync and recover + * + * 5.1) common process + * NeedSync --Startsync--> Syncing --Endsync--> Dirty --Daemon--> Clean + * + * 5.2) resync after power failure + * Dirty --Reload--> NeedSync + * + * 5.3) recover while replacing with a new disk + * By default, the old bitmap framework will recover all data, and llbitmap + * implement this by a new helper, see llbitmap_skip_sync_blocks: + * + * skip recover for bits other than dirty or clean; + * + * 5.4) lazy initial recover for raid5: + * By default, the old bitmap framework will only allow new recover when t= here + * are spares(new disk), a new recovery flag MD_RECOVERY_LAZY_RECOVER is a= dd + * to perform raid456 lazy recover for set bits(from 2.2). + * + * ##### Bitmap IO + * + * ##### Chunksize + * + * The default bitmap size is 128k, incluing 1k bitmap super block, and + * the default size of segment of data in the array each bit(chunksize) is= 64k, + * and chunksize will adjust to twice the old size each time if the total = number + * bits is not less than 127k.(see llbitmap_init) + * + * ##### READ + * + * While creating bitmap, all pages will be allocated and read for llbitma= p, + * there won't be read afterwards + * + * ##### WRITE + * + * WRITE IO is divided into logical_block_size of the array, the dirty sta= te + * of each block is tracked independently, for example: + * + * each page is 4k, contain 8 blocks; each block is 512 bytes contain 512 = bit; + * + * | page0 | page1 | ... | page 31 | + * | | + * | \-----------------------\ + * | | + * | block0 | block1 | ... | block 8| + * | | + * | \-----------------\ + * | | + * | bit0 | bit1 | ... | bit511 | + * + * From IO path, if one bit is changed to Dirty or NeedSync, the correspon= ding + * subpage will be marked dirty, such block must write first before the IO= is + * issued. This behaviour will affect IO performance, to reduce the impact= , if + * multiple bits are changed in the same block in a short time, all bits i= n this + * block will be changed to Dirty/NeedSync, so that there won't be any ove= rhead + * until daemon clears dirty bits. + * + * ##### Dirty Bits syncronization + * + * IO fast path will set bits to dirty, and those dirty bits will be clear= ed + * by daemon after IO is done. llbitmap_page_ctl is used to synchronize be= tween + * IO path and daemon; + * + * IO path: + * 1) try to grab a reference, if succeed, set expire time after 5s and r= eturn; + * 2) if failed to grab a reference, wait for daemon to finish clearing d= irty + * bits; + * + * Daemon(Daemon will be waken up every daemon_sleep seconds): + * For each page: + * 1) check if page expired, if not skip this page; for expired page: + * 2) suspend the page and wait for inflight write IO to be done; + * 3) change dirty page to clean; + * 4) resume the page; + */ + +#define BITMAP_SB_SIZE 1024 + +/* 64k is the max IO size of sync IO for raid1/raid10 */ +#define MIN_CHUNK_SIZE (64 * 2) + +/* By default, daemon will be waken up every 30s */ +#define DEFAULT_DAEMON_SLEEP 30 + +/* + * Dirtied bits that have not been accessed for more than 5s will be clear= ed + * by daemon. + */ +#define BARRIER_IDLE 5 + +enum llbitmap_state { + /* No valid data, init state after assemble the array */ + BitUnwritten =3D 0, + /* data is consistent */ + BitClean, + /* data will be consistent after IO is done, set directly for writes */ + BitDirty, + /* + * data need to be resynchronized: + * 1) set directly for writes if array is degraded, prevent full disk + * synchronization after readding a disk; + * 2) reassemble the array after power failure, and dirty bits are + * found after reloading the bitmap; + * 3) set for first write for raid5, to build initial xor data lazily + */ + BitNeedSync, + /* data is synchronizing */ + BitSyncing, + nr_llbitmap_state, + BitNone =3D 0xff, +}; + +enum llbitmap_action { + /* User write new data, this is the only action from IO fast path */ + BitmapActionStartwrite =3D 0, + /* Start recovery */ + BitmapActionStartsync, + /* Finish recovery */ + BitmapActionEndsync, + /* Failed recovery */ + BitmapActionAbortsync, + /* Reassemble the array */ + BitmapActionReload, + /* Daemon thread is trying to clear dirty bits */ + BitmapActionDaemon, + /* Data is deleted */ + BitmapActionDiscard, + /* + * Bitmap is stale, mark all bits in addition to BitUnwritten to + * BitNeedSync. + */ + BitmapActionStale, + nr_llbitmap_action, + /* Init state is BitUnwritten */ + BitmapActionInit, +}; + +enum llbitmap_page_state { + LLPageFlush =3D 0, + LLPageDirty, +}; + +struct llbitmap_page_ctl { + char *state; + struct page *page; + unsigned long expire; + unsigned long flags; + wait_queue_head_t wait; + struct percpu_ref active; + /* Per block size dirty state, maximum 64k page / 1 sector =3D 128 */ + unsigned long dirty[]; +}; + +struct llbitmap { + struct mddev *mddev; + struct llbitmap_page_ctl **pctl; + + unsigned int nr_pages; + unsigned int io_size; + unsigned int bits_per_page; + + /* shift of one chunk */ + unsigned long chunkshift; + /* size of one chunk in sector */ + unsigned long chunksize; + /* total number of chunks */ + unsigned long chunks; + unsigned long last_end_sync; + /* fires on first BitDirty state */ + struct timer_list pending_timer; + struct work_struct daemon_work; + + unsigned long flags; + __u64 events_cleared; + + /* for slow disks */ + atomic_t behind_writes; + wait_queue_head_t behind_wait; +}; + +struct llbitmap_unplug_work { + struct work_struct work; + struct llbitmap *llbitmap; + struct completion *done; +}; + +static struct workqueue_struct *md_llbitmap_io_wq; +static struct workqueue_struct *md_llbitmap_unplug_wq; + +static char state_machine[nr_llbitmap_state][nr_llbitmap_action] =3D { + [BitUnwritten] =3D { + [BitmapActionStartwrite] =3D BitDirty, + [BitmapActionStartsync] =3D BitNone, + [BitmapActionEndsync] =3D BitNone, + [BitmapActionAbortsync] =3D BitNone, + [BitmapActionReload] =3D BitNone, + [BitmapActionDaemon] =3D BitNone, + [BitmapActionDiscard] =3D BitNone, + [BitmapActionStale] =3D BitNone, + }, + [BitClean] =3D { + [BitmapActionStartwrite] =3D BitDirty, + [BitmapActionStartsync] =3D BitNone, + [BitmapActionEndsync] =3D BitNone, + [BitmapActionAbortsync] =3D BitNone, + [BitmapActionReload] =3D BitNone, + [BitmapActionDaemon] =3D BitNone, + [BitmapActionDiscard] =3D BitUnwritten, + [BitmapActionStale] =3D BitNeedSync, + }, + [BitDirty] =3D { + [BitmapActionStartwrite] =3D BitNone, + [BitmapActionStartsync] =3D BitNone, + [BitmapActionEndsync] =3D BitNone, + [BitmapActionAbortsync] =3D BitNone, + [BitmapActionReload] =3D BitNeedSync, + [BitmapActionDaemon] =3D BitClean, + [BitmapActionDiscard] =3D BitUnwritten, + [BitmapActionStale] =3D BitNeedSync, + }, + [BitNeedSync] =3D { + [BitmapActionStartwrite] =3D BitNone, + [BitmapActionStartsync] =3D BitSyncing, + [BitmapActionEndsync] =3D BitNone, + [BitmapActionAbortsync] =3D BitNone, + [BitmapActionReload] =3D BitNone, + [BitmapActionDaemon] =3D BitNone, + [BitmapActionDiscard] =3D BitUnwritten, + [BitmapActionStale] =3D BitNone, + }, + [BitSyncing] =3D { + [BitmapActionStartwrite] =3D BitNone, + [BitmapActionStartsync] =3D BitSyncing, + [BitmapActionEndsync] =3D BitDirty, + [BitmapActionAbortsync] =3D BitNeedSync, + [BitmapActionReload] =3D BitNeedSync, + [BitmapActionDaemon] =3D BitNone, + [BitmapActionDiscard] =3D BitUnwritten, + [BitmapActionStale] =3D BitNeedSync, + }, +}; + +static enum llbitmap_state llbitmap_read(struct llbitmap *llbitmap, loff_t= pos) +{ + unsigned int idx; + unsigned int offset; + + pos +=3D BITMAP_SB_SIZE; + idx =3D pos >> PAGE_SHIFT; + offset =3D offset_in_page(pos); + + return llbitmap->pctl[idx]->state[offset]; +} + +/* set all the bits in the subpage as dirty */ +static void llbitmap_infect_dirty_bits(struct llbitmap *llbitmap, + struct llbitmap_page_ctl *pctl, + unsigned int bit, unsigned int offset) +{ + bool level_456 =3D raid_is_456(llbitmap->mddev); + unsigned int io_size =3D llbitmap->io_size; + int pos; + + for (pos =3D bit * io_size; pos < (bit + 1) * io_size; pos++) { + if (pos =3D=3D offset) + continue; + + switch (pctl->state[pos]) { + case BitUnwritten: + pctl->state[pos] =3D level_456 ? BitNeedSync : BitDirty; + break; + case BitClean: + pctl->state[pos] =3D BitDirty; + break; + }; + } + +} + +static void llbitmap_set_page_dirty(struct llbitmap *llbitmap, int idx, + int offset) +{ + struct llbitmap_page_ctl *pctl =3D llbitmap->pctl[idx]; + unsigned int io_size =3D llbitmap->io_size; + int bit =3D offset / io_size; + int pos; + + if (!test_bit(LLPageDirty, &pctl->flags)) + set_bit(LLPageDirty, &pctl->flags); + + /* + * The subpage usually contains a total of 512 bits. If any single bit + * within the subpage is marked as dirty, the entire sector will be + * written. To avoid impacting write performance, when multiple bits + * within the same sector are modified within a short time frame, all + * bits in the sector will be collectively marked as dirty at once. + */ + if (test_and_set_bit(bit, pctl->dirty)) { + llbitmap_infect_dirty_bits(llbitmap, pctl, bit, offset); + return; + } + + for (pos =3D bit * io_size; pos < (bit + 1) * io_size; pos++) { + if (pos =3D=3D offset) + continue; + if (pctl->state[pos] =3D=3D BitDirty || + pctl->state[pos] =3D=3D BitNeedSync) { + llbitmap_infect_dirty_bits(llbitmap, pctl, bit, offset); + return; + } + } +} + +static void llbitmap_write(struct llbitmap *llbitmap, enum llbitmap_state = state, + loff_t pos) +{ + unsigned int idx; + unsigned int offset; + + pos +=3D BITMAP_SB_SIZE; + idx =3D pos >> PAGE_SHIFT; + offset =3D offset_in_page(pos); + + llbitmap->pctl[idx]->state[offset] =3D state; + if (state =3D=3D BitDirty || state =3D=3D BitNeedSync) + llbitmap_set_page_dirty(llbitmap, idx, offset); +} + +static struct page *llbitmap_read_page(struct llbitmap *llbitmap, int idx) +{ + struct mddev *mddev =3D llbitmap->mddev; + struct page *page =3D NULL; + struct md_rdev *rdev; + + if (llbitmap->pctl && llbitmap->pctl[idx]) + page =3D llbitmap->pctl[idx]->page; + if (page) + return page; + + page =3D alloc_page(GFP_KERNEL | __GFP_ZERO); + if (!page) + return ERR_PTR(-ENOMEM); + + rdev_for_each(rdev, mddev) { + sector_t sector; + + if (rdev->raid_disk < 0 || test_bit(Faulty, &rdev->flags)) + continue; + + sector =3D mddev->bitmap_info.offset + + (idx << PAGE_SECTORS_SHIFT); + + if (sync_page_io(rdev, sector, PAGE_SIZE, page, REQ_OP_READ, + true)) + return page; + + md_error(mddev, rdev); + } + + __free_page(page); + return ERR_PTR(-EIO); +} + +static void llbitmap_write_page(struct llbitmap *llbitmap, int idx) +{ + struct page *page =3D llbitmap->pctl[idx]->page; + struct mddev *mddev =3D llbitmap->mddev; + struct md_rdev *rdev; + int bit; + + for (bit =3D 0; bit < llbitmap->bits_per_page; bit++) { + struct llbitmap_page_ctl *pctl =3D llbitmap->pctl[idx]; + + if (!test_and_clear_bit(bit, pctl->dirty)) + continue; + + rdev_for_each(rdev, mddev) { + sector_t sector; + sector_t bit_sector =3D llbitmap->io_size >> SECTOR_SHIFT; + + if (rdev->raid_disk < 0 || test_bit(Faulty, &rdev->flags)) + continue; + + sector =3D mddev->bitmap_info.offset + rdev->sb_start + + (idx << PAGE_SECTORS_SHIFT) + + bit * bit_sector; + md_write_metadata(mddev, rdev, sector, + llbitmap->io_size, page, + bit * llbitmap->io_size); + } + } +} + +static void active_release(struct percpu_ref *ref) +{ + struct llbitmap_page_ctl *pctl =3D + container_of(ref, struct llbitmap_page_ctl, active); + + wake_up(&pctl->wait); +} + +static void llbitmap_free_pages(struct llbitmap *llbitmap) +{ + int i; + + if (!llbitmap->pctl) + return; + + for (i =3D 0; i < llbitmap->nr_pages; i++) { + struct llbitmap_page_ctl *pctl =3D llbitmap->pctl[i]; + + if (!pctl || !pctl->page) + break; + + __free_page(pctl->page); + percpu_ref_exit(&pctl->active); + } + + kfree(llbitmap->pctl[0]); + kfree(llbitmap->pctl); + llbitmap->pctl =3D NULL; +} + +static int llbitmap_cache_pages(struct llbitmap *llbitmap) +{ + struct llbitmap_page_ctl *pctl; + unsigned int nr_pages =3D DIV_ROUND_UP(llbitmap->chunks + BITMAP_SB_SIZE, + PAGE_SIZE); + unsigned int size =3D struct_size(pctl, dirty, + BITS_TO_LONGS(llbitmap->bits_per_page)); + int i; + + llbitmap->pctl =3D kmalloc_array(nr_pages, sizeof(void *), + GFP_KERNEL | __GFP_ZERO); + if (!llbitmap->pctl) + return -ENOMEM; + + size =3D round_up(size, cache_line_size()); + pctl =3D kmalloc_array(nr_pages, size, GFP_KERNEL | __GFP_ZERO); + if (!pctl) { + kfree(llbitmap->pctl); + return -ENOMEM; + } + + llbitmap->nr_pages =3D nr_pages; + + for (i =3D 0; i < nr_pages; i++, pctl =3D (void *)pctl + size) { + struct page *page =3D llbitmap_read_page(llbitmap, i); + + llbitmap->pctl[i] =3D pctl; + + if (IS_ERR(page)) { + llbitmap_free_pages(llbitmap); + return PTR_ERR(page); + } + + if (percpu_ref_init(&pctl->active, active_release, + PERCPU_REF_ALLOW_REINIT, GFP_KERNEL)) { + __free_page(page); + llbitmap_free_pages(llbitmap); + return -ENOMEM; + } + + pctl->page =3D page; + pctl->state =3D page_address(page); + init_waitqueue_head(&pctl->wait); + } + + return 0; +} + +#endif /* CONFIG_MD_LLBITMAP */ --=20 2.39.2 From nobody Fri Dec 19 16:08:17 2025 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 6D83A1E8855; Sat, 24 May 2025 06:18:22 +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=1748067504; cv=none; b=MEYUtbwGWHaMYD+Rv97X8x5eyjKfNsc1+/N7Z2O37OaYBP1eZO4w1M0z+MewxDj51paLDQuq5zOw2LJImeyW9T2E4F8/HXhhO3Co7/SNdjTZJU+s/+JuGlwt/AZxQQjcmQVByYiOP9i9Ut1xCwkHJO+xm2mJDU6WLv68rELDTks= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748067504; c=relaxed/simple; bh=cxtzLhTF/bOh23v8p+80tl3W0m+lHooI/GPXGrzVuqI=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=jvJPpHz/ks/twHUS3Cp5kzUAu05tq6nQ3Cf23PmVLA27EETcYrfl7z8TZqCgNqZPNlP0jG7bfnBlsS+OH4QJrM7S9CPLWil4LLOrnoQQ42p0tQ7MU7+PQM3uiIYZlicwz+6CrzG3V/kZhzQjYNvCJg+ch/TiF0Q6U8ibnEOzQsU= 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.216]) by dggsgout11.his.huawei.com (SkyGuard) with ESMTP id 4b4BfH3kZ0z4f3jqb; Sat, 24 May 2025 14:17:59 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.128]) by mail.maildlp.com (Postfix) with ESMTP id 7DA0F1A194E; Sat, 24 May 2025 14:18:19 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP4 (Coremail) with SMTP id gCh0CgCnCl+dZDFo3etkNQ--.42979S20; Sat, 24 May 2025 14:18:19 +0800 (CST) From: Yu Kuai To: hch@lst.de, xni@redhat.com, colyli@kernel.org, song@kernel.org, yukuai3@huawei.com Cc: linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-raid@vger.kernel.org, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com, johnny.chenyi@huawei.com Subject: [PATCH 16/23] md/md-llbitmap: implement bit state machine Date: Sat, 24 May 2025 14:13:13 +0800 Message-Id: <20250524061320.370630-17-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20250524061320.370630-1-yukuai1@huaweicloud.com> References: <20250524061320.370630-1-yukuai1@huaweicloud.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: gCh0CgCnCl+dZDFo3etkNQ--.42979S20 X-Coremail-Antispam: 1UD129KBjvJXoWxWw1fArWDKw4DWFyUKry3urg_yoW7JFW5pw sxZrnxGrs8JF4xX3y7ta4xtF95Kr4kt3sIqF9xA3s5Ww1YyFZIvr1kWFy8J3yUWryFq3WU Jan5Cr95GF4UurJanT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUmS14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_Ar0_tr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F 4UJwA2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq 3wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0I7 IYx2IY67AKxVWUJVWUGwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r1j6r4U M4x0Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwACI402YVCY1x02628vn2 kIc2xKxwCY1x0262kKe7AKxVWUtVW8ZwCF04k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7xkE bVWUJVW8JwC20s026c02F40E14v26r1j6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E67 AF67kF1VAFwI0_Jw0_GFylIxkGc2Ij64vIr41lIxAIcVC0I7IYx2IY67AKxVW8JVW5JwCI 42IY6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F4UJwCI42IY6xAIw20EY4v20xvaj40_Jr0_JF 4lIxAIcVC2z280aVAFwI0_Gr0_Cr1lIxAIcVC2z280aVCY1x0267AKxVW8Jr0_Cr1UYxBI daVFxhVjvjDU0xZFpf9x0JUQFxUUUUUU= X-CM-SenderInfo: 51xn3trlr6x35dzhxuhorxvhhfrp/ Content-Type: text/plain; charset="utf-8" From: Yu Kuai Each bit is one byte, contain 6 difference state, see llbitmap_state. And there are total 8 differenct actions, see llbitmap_action, can change state: llbitmap state machine: transitions between states | | Startwrite | Startsync | Endsync | Abortsync| Reload | Daem= on | Discard | Stale | | --------- | ---------- | --------- | ------- | ------- | -------- | ----= -- | --------- | --------- | | Unwritten | Dirty | x | x | x | x | x = | x | x | | Clean | Dirty | x | x | x | x | x = | Unwritten | NeedSync | | Dirty | x | x | x | x | NeedSync | Clea= n | Unwritten | NeedSync | | NeedSync | x | Syncing | x | x | x | x = | Unwritten | x | | Syncing | x | Syncing | Dirty | NeedSync | NeedSync | x = | Unwritten | NeedSync | Typical scenarios: 1) Create new array All bits will be set to Unwritten by default, if --assume-clean is set, All bits will be set to Clean instead. 2) write data, raid1/raid10 have full copy of data, while raid456 donen't a= nd rely on xor data 2.1) write new data to raid1/raid10: Unwritten --StartWrite--> Dirty 2.2) write new data to raid456: Unwritten --StartWrite--> NeedSync Because the initial recover for raid456 is skipped, the xor data is not bui= ld yet, the bit must set to NeedSync first and after lazy initial recover is finished, the bit will finially set to Dirty(see 5.1 and 5.4); 2.3) cover write Clean --StartWrite--> Dirty 3) daemon, if the array is not degraded: Dirty --Daemon--> Clean For degraded array, the Dirty bit will never be cleared, prevent full disk recovery while readding a removed disk. 4) discard {Clean, Dirty, NeedSync, Syncing} --Discard--> Unwritten 5) resync and recover 5.1) common process NeedSync --Startsync--> Syncing --Endsync--> Dirty --Daemon--> Clean 5.2) resync after power failure Dirty --Reload--> NeedSync 5.3) recover while replacing with a new disk By default, the old bitmap framework will recover all data, and llbitmap implement this by a new helper llbitmap_skip_sync_blocks: skip recover for bits other than dirty or clean; 5.4) lazy initial recover for raid5: By default, the old bitmap framework will only allow new recover when there are spares(new disk), a new recovery flag MD_RECOVERY_LAZY_RECOVER is add to perform raid456 lazy recover for set bits(from 2.2). Signed-off-by: Yu Kuai --- drivers/md/md-llbitmap.c | 83 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) diff --git a/drivers/md/md-llbitmap.c b/drivers/md/md-llbitmap.c index 1a01b6777527..f782f092ab5d 100644 --- a/drivers/md/md-llbitmap.c +++ b/drivers/md/md-llbitmap.c @@ -568,4 +568,87 @@ static int llbitmap_cache_pages(struct llbitmap *llbit= map) return 0; } =20 +static void llbitmap_init_state(struct llbitmap *llbitmap) +{ + enum llbitmap_state state =3D BitUnwritten; + unsigned long i; + + if (test_and_clear_bit(BITMAP_CLEAN, &llbitmap->flags)) + state =3D BitClean; + + for (i =3D 0; i < llbitmap->chunks; i++) + llbitmap_write(llbitmap, state, i); +} + +/* The return value is only used from resync, where @start =3D=3D @end. */ +static enum llbitmap_state llbitmap_state_machine(struct llbitmap *llbitma= p, + unsigned long start, + unsigned long end, + enum llbitmap_action action) +{ + struct mddev *mddev =3D llbitmap->mddev; + enum llbitmap_state state =3D BitNone; + bool need_resync =3D false; + bool need_recovery =3D false; + + if (test_bit(BITMAP_WRITE_ERROR, &llbitmap->flags)) + return BitNone; + + if (action =3D=3D BitmapActionInit) { + llbitmap_init_state(llbitmap); + return BitNone; + } + + while (start <=3D end) { + enum llbitmap_state c =3D llbitmap_read(llbitmap, start); + + if (c < 0 || c >=3D nr_llbitmap_state) { + pr_err("%s: invalid bit %lu state %d action %d, forcing resync\n", + __func__, start, c, action); + state =3D BitNeedSync; + goto write_bitmap; + } + + if (c =3D=3D BitNeedSync) + need_resync =3D true; + + state =3D state_machine[c][action]; + if (state =3D=3D BitNone) { + start++; + continue; + } + +write_bitmap: + /* Delay raid456 initial recovery to first write. */ + if (c =3D=3D BitUnwritten && state =3D=3D BitDirty && + action =3D=3D BitmapActionStartwrite && raid_is_456(mddev)) { + state =3D BitNeedSync; + need_recovery =3D true; + } + + llbitmap_write(llbitmap, state, start); + + if (state =3D=3D BitNeedSync) + need_resync =3D true; + else if (state =3D=3D BitDirty && + !timer_pending(&llbitmap->pending_timer)) + mod_timer(&llbitmap->pending_timer, + jiffies + mddev->bitmap_info.daemon_sleep * HZ); + + start++; + } + + if (need_recovery) { + set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); + set_bit(MD_RECOVERY_LAZY_RECOVER, &mddev->recovery); + md_wakeup_thread(mddev->thread); + } else if (need_resync) { + set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); + set_bit(MD_RECOVERY_SYNC, &mddev->recovery); + md_wakeup_thread(mddev->thread); + } + + return state; +} + #endif /* CONFIG_MD_LLBITMAP */ --=20 2.39.2 From nobody Fri Dec 19 16:08:17 2025 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 BB5D01E5B72; Sat, 24 May 2025 06:18:21 +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=1748067505; cv=none; b=FFPfqXvu1ApACgDX8+0vTkW87oqlbJ0SJPZNtiAcJcojjT662ZMavgBKuyz+BXqKxke3TM67GTg1vHzZ2yebKljNzRL++cKhoDExqf9nVlc/E2LuL6ZBy69qQdqMpiuCU1VdNztqYsZtxrzfFhwZvRrX93wQ29LhBYVGf13Ze+8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748067505; c=relaxed/simple; bh=ayTk7tIzwXV/1pFO2jSjlUgl4IJiy6jsxiiPlYaYlDY=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=Xd2bjK2pguZAxpqb4qFtxQlB/P8/So8Ylu/Y2H7Z/ydl6Pwoo2ryi1/+AZxbS84mLCLJJhmpkzjRMngFzX2X9n1ETPvPXa1MovsJO5eiD5h+7Rw2OsfMhNUHvOUIlt+Vzrpoa6+HbNGWjeZ9fFUsg/rFcayHc6lwBEBF/z3jarM= 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.93.142]) by dggsgout11.his.huawei.com (SkyGuard) with ESMTPS id 4b4Bfh5wg8zYQtxb; Sat, 24 May 2025 14:18:20 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.128]) by mail.maildlp.com (Postfix) with ESMTP id 00ADA1A0359; Sat, 24 May 2025 14:18:19 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP4 (Coremail) with SMTP id gCh0CgCnCl+dZDFo3etkNQ--.42979S21; Sat, 24 May 2025 14:18:19 +0800 (CST) From: Yu Kuai To: hch@lst.de, xni@redhat.com, colyli@kernel.org, song@kernel.org, yukuai3@huawei.com Cc: linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-raid@vger.kernel.org, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com, johnny.chenyi@huawei.com Subject: [PATCH 17/23] md/md-llbitmap: implement APIs for page level dirty bits synchronization Date: Sat, 24 May 2025 14:13:14 +0800 Message-Id: <20250524061320.370630-18-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20250524061320.370630-1-yukuai1@huaweicloud.com> References: <20250524061320.370630-1-yukuai1@huaweicloud.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: gCh0CgCnCl+dZDFo3etkNQ--.42979S21 X-Coremail-Antispam: 1UD129KBjvJXoW7trWrJFy5Wr45Cr1kCr17Jrb_yoW8tF1kpF 4fXr15Kw4rJFySgw13JrZrAF9Yya1ktrZ7XF97A34F93Wj9rZYg3WxuFyDZw4jgrn3GFn8 Aa15Gw1fGa1rZrUanT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUmS14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_Ar0_tr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F 4UJwA2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq 3wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0I7 IYx2IY67AKxVWUJVWUGwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r1j6r4U M4x0Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwACI402YVCY1x02628vn2 kIc2xKxwCY1x0262kKe7AKxVWUtVW8ZwCF04k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7xkE bVWUJVW8JwC20s026c02F40E14v26r1j6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E67 AF67kF1VAFwI0_Jw0_GFylIxkGc2Ij64vIr41lIxAIcVC0I7IYx2IY67AKxVW8JVW5JwCI 42IY6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F4UJwCI42IY6xAIw20EY4v20xvaj40_Jr0_JF 4lIxAIcVC2z280aVAFwI0_Gr0_Cr1lIxAIcVC2z280aVCY1x0267AKxVW8Jr0_Cr1UYxBI daVFxhVjvjDU0xZFpf9x0JUQFxUUUUUU= X-CM-SenderInfo: 51xn3trlr6x35dzhxuhorxvhhfrp/ Content-Type: text/plain; charset="utf-8" From: Yu Kuai IO fast path will set bits to dirty, and those dirty bits will be cleared by daemon after IO is done. llbitmap_barrier is used to synchronize between IO path and daemon; IO path: 1) try to grab a reference, if succeed, set expire time after 5s and return; 2) if failed to grab a reference, wait for daemon to finish clearing dirty bits; Daemon(Daemon will be waken up every daemon_sleep seconds): For each page: 1) check if page expired, if not skip this page; for expired page: 2) suspend the page and wait for inflight write IO to be done; 3) change dirty page to clean; 4) resume the page; Signed-off-by: Yu Kuai --- drivers/md/md-llbitmap.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/drivers/md/md-llbitmap.c b/drivers/md/md-llbitmap.c index f782f092ab5d..4d5f9a139a25 100644 --- a/drivers/md/md-llbitmap.c +++ b/drivers/md/md-llbitmap.c @@ -651,4 +651,42 @@ static enum llbitmap_state llbitmap_state_machine(stru= ct llbitmap *llbitmap, return state; } =20 +static void llbitmap_raise_barrier(struct llbitmap *llbitmap, int page_idx) +{ + struct llbitmap_page_ctl *pctl =3D llbitmap->pctl[page_idx]; + +retry: + if (likely(percpu_ref_tryget_live(&pctl->active))) { + WRITE_ONCE(pctl->expire, jiffies + BARRIER_IDLE * HZ); + return; + } + + wait_event(pctl->wait, !percpu_ref_is_dying(&pctl->active)); + goto retry; +} + +static void llbitmap_release_barrier(struct llbitmap *llbitmap, int page_i= dx) +{ + struct llbitmap_page_ctl *pctl =3D llbitmap->pctl[page_idx]; + + percpu_ref_put(&pctl->active); +} + +static void llbitmap_suspend(struct llbitmap *llbitmap, int page_idx) +{ + struct llbitmap_page_ctl *pctl =3D llbitmap->pctl[page_idx]; + + percpu_ref_kill(&pctl->active); + wait_event(pctl->wait, percpu_ref_is_zero(&pctl->active)); +} + +static void llbitmap_resume(struct llbitmap *llbitmap, int page_idx) +{ + struct llbitmap_page_ctl *pctl =3D llbitmap->pctl[page_idx]; + + pctl->expire =3D LONG_MAX; + percpu_ref_resurrect(&pctl->active); + wake_up(&pctl->wait); +} + #endif /* CONFIG_MD_LLBITMAP */ --=20 2.39.2 From nobody Fri Dec 19 16:08:17 2025 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 2C0071EA7EB; Sat, 24 May 2025 06:18:23 +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=1748067505; cv=none; b=Vyl+y84GndQzRTQo+yOUhwNx1Dulld4kKgxMHI+Fhn++U7DZRovzDvSV7HhpwK1P//Snd+wOPBk8oNmwcuTcjjHmct/3UDR4tIuGbYBtbI1G6qeNYetu2UNOTiDz8dBKNIrOBzaOY7nhF7LNTYcGC0V6ZyleXemftuwHaRcBx84= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748067505; c=relaxed/simple; bh=cKJAmRXbpsq58VM81DIM0wxGxYesDuU7nGfV+QmPaVM=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=JLMx8KA+HgZJKUiXgDk2CfI7h5VAAWavsseWvQRTyZ/5e7hu92A/hQ/zPZog6nICsb/XDc9aPj0e8edVVriaXss/z470t5tLhhHGCRzZSe3xkRZDYbmAqARPcEALkC+uRk7oVN+o9CEYIgNHQviiH+rTgyrdDBydpk19UWAMXac= 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 4b4Bf95zNyz4f3jMN; Sat, 24 May 2025 14:17:53 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.128]) by mail.maildlp.com (Postfix) with ESMTP id 7A6541A0BBE; Sat, 24 May 2025 14:18:20 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP4 (Coremail) with SMTP id gCh0CgCnCl+dZDFo3etkNQ--.42979S22; Sat, 24 May 2025 14:18:20 +0800 (CST) From: Yu Kuai To: hch@lst.de, xni@redhat.com, colyli@kernel.org, song@kernel.org, yukuai3@huawei.com Cc: linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-raid@vger.kernel.org, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com, johnny.chenyi@huawei.com Subject: [PATCH 18/23] md/md-llbitmap: implement APIs to mange bitmap lifetime Date: Sat, 24 May 2025 14:13:15 +0800 Message-Id: <20250524061320.370630-19-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20250524061320.370630-1-yukuai1@huaweicloud.com> References: <20250524061320.370630-1-yukuai1@huaweicloud.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: gCh0CgCnCl+dZDFo3etkNQ--.42979S22 X-Coremail-Antispam: 1UD129KBjvJXoWxtr17uF4kCF18AFy8GFW3Wrg_yoWfuFW5pF 4Sq345KrWrJr1rXr47Xr97ZFWFqr4kt3sFqF97AFyrCr1UArsxKryrGFyUJw1kXw1rGFs8 Ja15KF45CF1UWFDanT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUmS14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_Ar0_tr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F 4UJwA2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq 3wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0I7 IYx2IY67AKxVWUJVWUGwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r1j6r4U M4x0Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwACI402YVCY1x02628vn2 kIc2xKxwCY1x0262kKe7AKxVWUtVW8ZwCF04k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7xkE bVWUJVW8JwC20s026c02F40E14v26r1j6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E67 AF67kF1VAFwI0_Jw0_GFylIxkGc2Ij64vIr41lIxAIcVC0I7IYx2IY67AKxVW8JVW5JwCI 42IY6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F4UJwCI42IY6xAIw20EY4v20xvaj40_Jr0_JF 4lIxAIcVC2z280aVAFwI0_Gr0_Cr1lIxAIcVC2z280aVCY1x0267AKxVW8Jr0_Cr1UYxBI daVFxhVjvjDU0xZFpf9x0JUQFxUUUUUU= X-CM-SenderInfo: 51xn3trlr6x35dzhxuhorxvhhfrp/ Content-Type: text/plain; charset="utf-8" From: Yu Kuai Include following APIs: - llbitmap_create - llbitmap_resize - llbitmap_load - llbitmap_destroy Signed-off-by: Yu Kuai --- drivers/md/md-llbitmap.c | 322 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 322 insertions(+) diff --git a/drivers/md/md-llbitmap.c b/drivers/md/md-llbitmap.c index 4d5f9a139a25..23283c4f7263 100644 --- a/drivers/md/md-llbitmap.c +++ b/drivers/md/md-llbitmap.c @@ -689,4 +689,326 @@ static void llbitmap_resume(struct llbitmap *llbitmap= , int page_idx) wake_up(&pctl->wait); } =20 +static int llbitmap_check_support(struct mddev *mddev) +{ + if (test_bit(MD_HAS_JOURNAL, &mddev->flags)) { + pr_notice("md/llbitmap: %s: array with journal cannot have bitmap\n", + mdname(mddev)); + return -EBUSY; + } + + if (mddev->bitmap_info.space =3D=3D 0) { + if (mddev->bitmap_info.default_space =3D=3D 0) { + pr_notice("md/llbitmap: %s: no space for bitmap\n", + mdname(mddev)); + return -ENOSPC; + } + } + + if (!mddev->persistent) { + pr_notice("md/llbitmap: %s: array must be persistent\n", + mdname(mddev)); + return -EOPNOTSUPP; + } + + if (mddev->bitmap_info.file) { + pr_notice("md/llbitmap: %s: doesn't support bitmap file\n", + mdname(mddev)); + return -EOPNOTSUPP; + } + + if (mddev->bitmap_info.external) { + pr_notice("md/llbitmap: %s: doesn't support external metadata\n", + mdname(mddev)); + return -EOPNOTSUPP; + } + + if (mddev_is_dm(mddev)) { + pr_notice("md/llbitmap: %s: doesn't support dm-raid\n", + mdname(mddev)); + return -EOPNOTSUPP; + } + + return 0; +} + +static int llbitmap_init(struct llbitmap *llbitmap) +{ + struct mddev *mddev =3D llbitmap->mddev; + sector_t blocks =3D mddev->resync_max_sectors; + unsigned long chunksize =3D MIN_CHUNK_SIZE; + unsigned long chunks =3D DIV_ROUND_UP(blocks, chunksize); + unsigned long space =3D mddev->bitmap_info.space << SECTOR_SHIFT; + int ret; + + while (chunks > space) { + chunksize =3D chunksize << 1; + chunks =3D DIV_ROUND_UP(blocks, chunksize); + } + + llbitmap->chunkshift =3D ffz(~chunksize); + llbitmap->chunksize =3D chunksize; + llbitmap->chunks =3D chunks; + mddev->bitmap_info.daemon_sleep =3D DEFAULT_DAEMON_SLEEP; + + ret =3D llbitmap_cache_pages(llbitmap); + if (ret) + return ret; + + llbitmap_state_machine(llbitmap, 0, llbitmap->chunks - 1, BitmapActionIni= t); + return 0; +} + +static int llbitmap_read_sb(struct llbitmap *llbitmap) +{ + struct mddev *mddev =3D llbitmap->mddev; + unsigned long daemon_sleep; + unsigned long chunksize; + unsigned long events; + struct page *sb_page; + bitmap_super_t *sb; + int ret =3D -EINVAL; + + if (!mddev->bitmap_info.offset) { + pr_err("md/llbitmap: %s: no super block found", mdname(mddev)); + return -EINVAL; + } + + sb_page =3D llbitmap_read_page(llbitmap, 0); + if (IS_ERR(sb_page)) { + pr_err("md/llbitmap: %s: read super block failed", + mdname(mddev)); + ret =3D -EIO; + goto out; + } + + sb =3D kmap_local_page(sb_page); + if (sb->magic !=3D cpu_to_le32(BITMAP_MAGIC)) { + pr_err("md/llbitmap: %s: invalid super block magic number", + mdname(mddev)); + goto out_put_page; + } + + if (sb->version !=3D cpu_to_le32(BITMAP_MAJOR_LOCKLESS)) { + pr_err("md/llbitmap: %s: invalid super block version", + mdname(mddev)); + goto out_put_page; + } + + if (memcmp(sb->uuid, mddev->uuid, 16)) { + pr_err("md/llbitmap: %s: bitmap superblock UUID mismatch\n", + mdname(mddev)); + goto out_put_page; + } + + if (mddev->bitmap_info.space =3D=3D 0) { + int room =3D le32_to_cpu(sb->sectors_reserved); + + if (room) + mddev->bitmap_info.space =3D room; + else + mddev->bitmap_info.space =3D mddev->bitmap_info.default_space; + } + llbitmap->flags =3D le32_to_cpu(sb->state); + if (test_and_clear_bit(BITMAP_FIRST_USE, &llbitmap->flags)) { + ret =3D llbitmap_init(llbitmap); + goto out_put_page; + } + + chunksize =3D le32_to_cpu(sb->chunksize); + if (!is_power_of_2(chunksize)) { + pr_err("md/llbitmap: %s: chunksize not a power of 2", + mdname(mddev)); + goto out_put_page; + } + + if (chunksize < DIV_ROUND_UP(mddev->resync_max_sectors, + mddev->bitmap_info.space << SECTOR_SHIFT)) { + pr_err("md/llbitmap: %s: chunksize too small %lu < %llu / %lu", + mdname(mddev), chunksize, mddev->resync_max_sectors, + mddev->bitmap_info.space); + goto out_put_page; + } + + daemon_sleep =3D le32_to_cpu(sb->daemon_sleep); + if (daemon_sleep < 1 || daemon_sleep > MAX_SCHEDULE_TIMEOUT / HZ) { + pr_err("md/llbitmap: %s: daemon sleep %lu period out of range", + mdname(mddev), daemon_sleep); + goto out_put_page; + } + + events =3D le64_to_cpu(sb->events); + if (events < mddev->events) { + pr_warn("md/llbitmap :%s: bitmap file is out of date (%lu < %llu) -- for= cing full recovery", + mdname(mddev), events, mddev->events); + set_bit(BITMAP_STALE, &llbitmap->flags); + } + + sb->sync_size =3D cpu_to_le64(mddev->resync_max_sectors); + mddev->bitmap_info.chunksize =3D chunksize; + mddev->bitmap_info.daemon_sleep =3D daemon_sleep; + + llbitmap->chunksize =3D chunksize; + llbitmap->chunks =3D DIV_ROUND_UP(mddev->resync_max_sectors, chunksize); + llbitmap->chunkshift =3D ffz(~chunksize); + ret =3D llbitmap_cache_pages(llbitmap); + +out_put_page: + __free_page(sb_page); +out: + kunmap_local(sb); + return ret; +} + +static void llbitmap_pending_timer_fn(struct timer_list *t) +{ + struct llbitmap *llbitmap =3D from_timer(llbitmap, t, pending_timer); + + if (work_busy(&llbitmap->daemon_work)) { + pr_warn("daemon_work not finished\n"); + set_bit(BITMAP_DAEMON_BUSY, &llbitmap->flags); + return; + } + + queue_work(md_llbitmap_io_wq, &llbitmap->daemon_work); +} + +static void md_llbitmap_daemon_fn(struct work_struct *work) +{ + struct llbitmap *llbitmap =3D + container_of(work, struct llbitmap, daemon_work); + unsigned long start; + unsigned long end; + bool restart; + int idx; + + if (llbitmap->mddev->degraded) + return; + +retry: + start =3D 0; + end =3D min(llbitmap->chunks, PAGE_SIZE - BITMAP_SB_SIZE) - 1; + restart =3D false; + + for (idx =3D 0; idx < llbitmap->nr_pages; idx++) { + struct llbitmap_page_ctl *pctl =3D llbitmap->pctl[idx]; + + if (idx > 0) { + start =3D end + 1; + end =3D min(end + PAGE_SIZE, llbitmap->chunks - 1); + } + + if (!test_bit(LLPageFlush, &pctl->flags) && + time_before(jiffies, pctl->expire)) { + restart =3D true; + continue; + } + + llbitmap_suspend(llbitmap, idx); + llbitmap_state_machine(llbitmap, start, end, BitmapActionDaemon); + llbitmap_resume(llbitmap, idx); + } + + /* + * If the daemon took a long time to finish, retry to prevent missing + * clearing dirty bits. + */ + if (test_and_clear_bit(BITMAP_DAEMON_BUSY, &llbitmap->flags)) + goto retry; + + /* If some page is dirty but not expired, setup timer again */ + if (restart) + mod_timer(&llbitmap->pending_timer, + jiffies + llbitmap->mddev->bitmap_info.daemon_sleep * HZ); +} + +static int llbitmap_create(struct mddev *mddev) +{ + struct llbitmap *llbitmap; + int ret; + + ret =3D llbitmap_check_support(mddev); + if (ret) + return ret; + + llbitmap =3D kzalloc(sizeof(*llbitmap), GFP_KERNEL); + if (!llbitmap) + return -ENOMEM; + + llbitmap->mddev =3D mddev; + llbitmap->io_size =3D bdev_logical_block_size(mddev->gendisk->part0); + llbitmap->bits_per_page =3D PAGE_SIZE / llbitmap->io_size; + + timer_setup(&llbitmap->pending_timer, llbitmap_pending_timer_fn, 0); + INIT_WORK(&llbitmap->daemon_work, md_llbitmap_daemon_fn); + atomic_set(&llbitmap->behind_writes, 0); + init_waitqueue_head(&llbitmap->behind_wait); + + mutex_lock(&mddev->bitmap_info.mutex); + mddev->bitmap =3D llbitmap; + ret =3D llbitmap_read_sb(llbitmap); + mutex_unlock(&mddev->bitmap_info.mutex); + if (ret) + goto err_out; + + return 0; + +err_out: + kfree(llbitmap); + return ret; +} + +static int llbitmap_resize(struct mddev *mddev, sector_t blocks, int chunk= size) +{ + struct llbitmap *llbitmap =3D mddev->bitmap; + unsigned long chunks; + + if (chunksize =3D=3D 0) + chunksize =3D llbitmap->chunksize; + + /* If there is enough space, leave the chunksize unchanged. */ + chunks =3D DIV_ROUND_UP(blocks, chunksize); + while (chunks > mddev->bitmap_info.space << SECTOR_SHIFT) { + chunksize =3D chunksize << 1; + chunks =3D DIV_ROUND_UP(blocks, chunksize); + } + + llbitmap->chunkshift =3D ffz(~chunksize); + llbitmap->chunksize =3D chunksize; + llbitmap->chunks =3D chunks; + + return 0; +} + +static int llbitmap_load(struct mddev *mddev) +{ + enum llbitmap_action action =3D BitmapActionReload; + struct llbitmap *llbitmap =3D mddev->bitmap; + + if (test_and_clear_bit(BITMAP_STALE, &llbitmap->flags)) + action =3D BitmapActionStale; + + llbitmap_state_machine(llbitmap, 0, llbitmap->chunks - 1, action); + return 0; +} + +static void llbitmap_destroy(struct mddev *mddev) +{ + struct llbitmap *llbitmap =3D mddev->bitmap; + + if (!llbitmap) + return; + + mutex_lock(&mddev->bitmap_info.mutex); + + timer_delete_sync(&llbitmap->pending_timer); + flush_workqueue(md_llbitmap_io_wq); + flush_workqueue(md_llbitmap_unplug_wq); + + mddev->bitmap =3D NULL; + llbitmap_free_pages(llbitmap); + kfree(llbitmap); + mutex_unlock(&mddev->bitmap_info.mutex); +} + #endif /* CONFIG_MD_LLBITMAP */ --=20 2.39.2 From nobody Fri Dec 19 16:08:17 2025 Received: from dggsgout12.his.huawei.com (dggsgout12.his.huawei.com [45.249.212.56]) (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 D6B221EBFFF; Sat, 24 May 2025 06:18:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748067506; cv=none; b=aho98tbVeWT4BP8jWKpmPLTJdFVPLNbacp/Btm93n+mWRFXyIgvHjQFOdslVGjMe2n43fTjh1dLpnHda4n545jrqtXnmb5OfiFD+dq3YUSQ6DMeIjcRjUHXFhdaBnpfMLnzvLIuyZhvZBm60lJCawZPVq+TDtGds3DQkjH/tT/o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748067506; c=relaxed/simple; bh=MyWhWTcxnRGi1PbvP79UXlEvSyp3oQ83ku+Es7Y1HtA=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=s0uzlreGFEMLcsNCIrWQONXOv8mMn/uB+e2k1vm7vSVTZOa1V9xauaAwOaEeVXYMQjVOrnWFmBvn+43+WLZ4TSQMfUPlxOfbmeW+fMneY10lE8BFXhTNMcPLpafWtfBm7ITViO0lONJ98GodQjGQBsLxurVLcQilWTXILt1tV2U= 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.56 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.216]) by dggsgout12.his.huawei.com (SkyGuard) with ESMTP id 4b4BfC5xFjz4f3jJ8; Sat, 24 May 2025 14:17:55 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.128]) by mail.maildlp.com (Postfix) with ESMTP id F2A7E1A14E3; Sat, 24 May 2025 14:18:20 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP4 (Coremail) with SMTP id gCh0CgCnCl+dZDFo3etkNQ--.42979S23; Sat, 24 May 2025 14:18:20 +0800 (CST) From: Yu Kuai To: hch@lst.de, xni@redhat.com, colyli@kernel.org, song@kernel.org, yukuai3@huawei.com Cc: linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-raid@vger.kernel.org, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com, johnny.chenyi@huawei.com Subject: [PATCH 19/23] md/md-llbitmap: implement APIs to dirty bits and clear bits Date: Sat, 24 May 2025 14:13:16 +0800 Message-Id: <20250524061320.370630-20-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20250524061320.370630-1-yukuai1@huaweicloud.com> References: <20250524061320.370630-1-yukuai1@huaweicloud.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: gCh0CgCnCl+dZDFo3etkNQ--.42979S23 X-Coremail-Antispam: 1UD129KBjvJXoW3JF1DtFWkCFW8Gw4UCr17KFg_yoW7ZFyrpF 43Xw15Kr45J34Fg347J3srZF1rtr4kJwnFqF93A34rGw15Ars0gF48GFykZw1Uur93WF1D Aw45Kry5Cw4fWrDanT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUmS14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_Ar0_tr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F 4UJwA2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq 3wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0I7 IYx2IY67AKxVWUJVWUGwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r1j6r4U M4x0Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwACI402YVCY1x02628vn2 kIc2xKxwCY1x0262kKe7AKxVWUtVW8ZwCF04k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7xkE bVWUJVW8JwC20s026c02F40E14v26r1j6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E67 AF67kF1VAFwI0_Jw0_GFylIxkGc2Ij64vIr41lIxAIcVC0I7IYx2IY67AKxVW8JVW5JwCI 42IY6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F4UJwCI42IY6xAIw20EY4v20xvaj40_Jr0_JF 4lIxAIcVC2z280aVAFwI0_Gr0_Cr1lIxAIcVC2z280aVCY1x0267AKxVW8Jr0_Cr1UYxBI daVFxhVjvjDU0xZFpf9x0JUQFxUUUUUU= X-CM-SenderInfo: 51xn3trlr6x35dzhxuhorxvhhfrp/ Content-Type: text/plain; charset="utf-8" From: Yu Kuai Include following APIs: - llbitmap_startwrite - llbitmap_endwrite - llbitmap_start_discard - llbitmap_end_discard - llbitmap_unplug - llbitmap_flush Signed-off-by: Yu Kuai --- drivers/md/md-llbitmap.c | 162 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 162 insertions(+) diff --git a/drivers/md/md-llbitmap.c b/drivers/md/md-llbitmap.c index 23283c4f7263..37e72885dbdb 100644 --- a/drivers/md/md-llbitmap.c +++ b/drivers/md/md-llbitmap.c @@ -1011,4 +1011,166 @@ static void llbitmap_destroy(struct mddev *mddev) mutex_unlock(&mddev->bitmap_info.mutex); } =20 +static void llbitmap_start_write(struct mddev *mddev, sector_t offset, + unsigned long sectors) +{ + struct llbitmap *llbitmap =3D mddev->bitmap; + unsigned long start =3D offset >> llbitmap->chunkshift; + unsigned long end =3D (offset + sectors - 1) >> llbitmap->chunkshift; + int page_start =3D (start + BITMAP_SB_SIZE) >> PAGE_SHIFT; + int page_end =3D (end + BITMAP_SB_SIZE) >> PAGE_SHIFT; + + llbitmap_state_machine(llbitmap, start, end, BitmapActionStartwrite); + + + while (page_start <=3D page_end) { + llbitmap_raise_barrier(llbitmap, page_start); + page_start++; + } +} + +static void llbitmap_end_write(struct mddev *mddev, sector_t offset, + unsigned long sectors) +{ + struct llbitmap *llbitmap =3D mddev->bitmap; + unsigned long start =3D offset >> llbitmap->chunkshift; + unsigned long end =3D (offset + sectors - 1) >> llbitmap->chunkshift; + int page_start =3D (start + BITMAP_SB_SIZE) >> PAGE_SHIFT; + int page_end =3D (end + BITMAP_SB_SIZE) >> PAGE_SHIFT; + + while (page_start <=3D page_end) { + llbitmap_release_barrier(llbitmap, page_start); + page_start++; + } +} + +static void llbitmap_start_discard(struct mddev *mddev, sector_t offset, + unsigned long sectors) +{ + struct llbitmap *llbitmap =3D mddev->bitmap; + unsigned long start =3D DIV_ROUND_UP(offset, llbitmap->chunksize); + unsigned long end =3D (offset + sectors - 1) >> llbitmap->chunkshift; + int page_start =3D (start + BITMAP_SB_SIZE) >> PAGE_SHIFT; + int page_end =3D (end + BITMAP_SB_SIZE) >> PAGE_SHIFT; + + llbitmap_state_machine(llbitmap, start, end, BitmapActionDiscard); + + while (page_start <=3D page_end) { + llbitmap_raise_barrier(llbitmap, page_start); + page_start++; + } +} + +static void llbitmap_end_discard(struct mddev *mddev, sector_t offset, + unsigned long sectors) +{ + struct llbitmap *llbitmap =3D mddev->bitmap; + unsigned long start =3D DIV_ROUND_UP(offset, llbitmap->chunksize); + unsigned long end =3D (offset + sectors - 1) >> llbitmap->chunkshift; + int page_start =3D (start + BITMAP_SB_SIZE) >> PAGE_SHIFT; + int page_end =3D (end + BITMAP_SB_SIZE) >> PAGE_SHIFT; + + while (page_start <=3D page_end) { + llbitmap_release_barrier(llbitmap, page_start); + page_start++; + } +} + +static void llbitmap_unplug_fn(struct work_struct *work) +{ + struct llbitmap_unplug_work *unplug_work =3D + container_of(work, struct llbitmap_unplug_work, work); + struct llbitmap *llbitmap =3D unplug_work->llbitmap; + struct blk_plug plug; + int i; + + blk_start_plug(&plug); + + for (i =3D 0; i < llbitmap->nr_pages; i++) { + if (!test_bit(LLPageDirty, &llbitmap->pctl[i]->flags) || + !test_and_clear_bit(LLPageDirty, &llbitmap->pctl[i]->flags)) + continue; + + llbitmap_write_page(llbitmap, i); + } + + blk_finish_plug(&plug); + md_super_wait(llbitmap->mddev); + complete(unplug_work->done); +} + +static bool llbitmap_dirty(struct llbitmap *llbitmap) +{ + int i; + + for (i =3D 0; i < llbitmap->nr_pages; i++) + if (test_bit(LLPageDirty, &llbitmap->pctl[i]->flags)) + return true; + + return false; +} + +static void llbitmap_unplug(struct mddev *mddev, bool sync) +{ + DECLARE_COMPLETION_ONSTACK(done); + struct llbitmap *llbitmap =3D mddev->bitmap; + struct llbitmap_unplug_work unplug_work =3D { + .llbitmap =3D llbitmap, + .done =3D &done, + }; + + if (!llbitmap_dirty(llbitmap)) + return; + + /* + * Issue new bitmap IO under submit_bio() context will deadlock: + * - the bio will wait for bitmap bio to be done, before it can be + * issued; + * - bitmap bio will be added to current->bio_list and wait for this + * bio to be issued; + */ + INIT_WORK_ONSTACK(&unplug_work.work, llbitmap_unplug_fn); + queue_work(md_llbitmap_unplug_wq, &unplug_work.work); + wait_for_completion(&done); + destroy_work_on_stack(&unplug_work.work); +} + +/* + * Force to write all bitmap pages to disk, called when stopping the array= , or + * every daemon_sleep seconds when sync_thread is running. + */ +static void __llbitmap_flush(struct mddev *mddev) +{ + struct llbitmap *llbitmap =3D mddev->bitmap; + struct blk_plug plug; + int i; + + blk_start_plug(&plug); + for (i =3D 0; i < llbitmap->nr_pages; i++) { + struct llbitmap_page_ctl *pctl =3D llbitmap->pctl[i]; + + /* mark all bits as dirty */ + set_bit(LLPageDirty, &pctl->flags); + bitmap_fill(pctl->dirty, llbitmap->bits_per_page); + llbitmap_write_page(llbitmap, i); + } + blk_finish_plug(&plug); + md_super_wait(llbitmap->mddev); +} + +static void llbitmap_flush(struct mddev *mddev) +{ + struct llbitmap *llbitmap =3D mddev->bitmap; + int i; + + for (i =3D 0; i < llbitmap->nr_pages; i++) + set_bit(LLPageFlush, &llbitmap->pctl[i]->flags); + + timer_delete_sync(&llbitmap->pending_timer); + queue_work(md_llbitmap_io_wq, &llbitmap->daemon_work); + flush_work(&llbitmap->daemon_work); + + __llbitmap_flush(mddev); +} + #endif /* CONFIG_MD_LLBITMAP */ --=20 2.39.2 From nobody Fri Dec 19 16:08:17 2025 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 612211EEA32; Sat, 24 May 2025 06:18:24 +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=1748067506; cv=none; b=JfMF5jt67Gbwn8KPvhn1LeQvoV9fEL/brntYDbpwYmQKck6BdLr+sg3whrgSbDTwM5ODZY2EwedYZavWGCooyzDf62dx3VvPNjS8fEFl/IklMf1LHxmWTBaHJ96r5d/4IGNTp60gp4og4TCxu+5mkyLYjZ7vPRyu708c52EpGq0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748067506; c=relaxed/simple; bh=WmXQMAfxyMLUfgvGpc1z8Xs740apUoNKute2R0RfwxU=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=JFxrnfgO+Y9mBrG5ie3G7aG4093UQEj5YNZIhDpKXyIIq00tLbRjcNWbgTNi9MZi6JjiWStG/RJmRaQ8G8FKYG0xsHnjyByOJdS1C07p5EAyjxv1RkXCiKYtRCcnVB7lHgHLbQ4sqrhWPFODyCiD13BWP65S4Bpgy+l67d4RVvo= 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.93.142]) by dggsgout11.his.huawei.com (SkyGuard) with ESMTP id 4b4BfK3cbXz4f3jt0; Sat, 24 May 2025 14:18:01 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.128]) by mail.maildlp.com (Postfix) with ESMTP id 795361A018D; Sat, 24 May 2025 14:18:21 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP4 (Coremail) with SMTP id gCh0CgCnCl+dZDFo3etkNQ--.42979S24; Sat, 24 May 2025 14:18:21 +0800 (CST) From: Yu Kuai To: hch@lst.de, xni@redhat.com, colyli@kernel.org, song@kernel.org, yukuai3@huawei.com Cc: linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-raid@vger.kernel.org, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com, johnny.chenyi@huawei.com Subject: [PATCH 20/23] md/md-llbitmap: implement APIs for sync_thread Date: Sat, 24 May 2025 14:13:17 +0800 Message-Id: <20250524061320.370630-21-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20250524061320.370630-1-yukuai1@huaweicloud.com> References: <20250524061320.370630-1-yukuai1@huaweicloud.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: gCh0CgCnCl+dZDFo3etkNQ--.42979S24 X-Coremail-Antispam: 1UD129KBjvJXoWxWFykXr1UXFWktry5XFWkZwb_yoWrWr1kpr 47Xr15Gr45X3yfX3y3Jr9rAFyFqw4kJr9FqF93Aa4rGr1YkrsIgFyrGFyUX3WjgFyfG3WD X3Z8GrW5Cr18WFJanT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUmS14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_Ar0_tr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F 4UJwA2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq 3wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0I7 IYx2IY67AKxVWUJVWUGwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r1j6r4U M4x0Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwACI402YVCY1x02628vn2 kIc2xKxwCY1x0262kKe7AKxVWUtVW8ZwCF04k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7xkE bVWUJVW8JwC20s026c02F40E14v26r1j6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E67 AF67kF1VAFwI0_Jw0_GFylIxkGc2Ij64vIr41lIxAIcVC0I7IYx2IY67AKxVW5JVW7JwCI 42IY6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F4UJwCI42IY6xAIw20EY4v20xvaj40_Jr0_JF 4lIxAIcVC2z280aVAFwI0_Gr0_Cr1lIxAIcVC2z280aVCY1x0267AKxVW8Jr0_Cr1UYxBI daVFxhVjvjDU0xZFpf9x0JUQFxUUUUUU= X-CM-SenderInfo: 51xn3trlr6x35dzhxuhorxvhhfrp/ Content-Type: text/plain; charset="utf-8" From: Yu Kuai Include following APIs: - llbitmap_blocks_synced - llbitmap_skip_sync_blocks - llbitmap_start_sync - llbitmap_end_sync - llbitmap_close_sync - llbitmap_cond_end_sync Signed-off-by: Yu Kuai --- drivers/md/md-llbitmap.c | 104 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) diff --git a/drivers/md/md-llbitmap.c b/drivers/md/md-llbitmap.c index 37e72885dbdb..1b7625d3e2ed 100644 --- a/drivers/md/md-llbitmap.c +++ b/drivers/md/md-llbitmap.c @@ -1173,4 +1173,108 @@ static void llbitmap_flush(struct mddev *mddev) __llbitmap_flush(mddev); } =20 +/* This is used for raid5 lazy initial recovery */ +static bool llbitmap_blocks_synced(struct mddev *mddev, sector_t offset) +{ + struct llbitmap *llbitmap =3D mddev->bitmap; + unsigned long p =3D offset >> llbitmap->chunkshift; + enum llbitmap_state c =3D llbitmap_read(llbitmap, p); + + return c =3D=3D BitClean || c =3D=3D BitDirty; +} + +static sector_t llbitmap_skip_sync_blocks(struct mddev *mddev, sector_t of= fset) +{ + struct llbitmap *llbitmap =3D mddev->bitmap; + unsigned long p =3D offset >> llbitmap->chunkshift; + int blocks =3D llbitmap->chunksize - (offset & (llbitmap->chunksize - 1)); + enum llbitmap_state c =3D llbitmap_read(llbitmap, p); + + /* always skip unwritten blocks */ + if (c =3D=3D BitUnwritten) + return blocks; + + /* For resync also skip clean/dirty blocks */ + if ((c =3D=3D BitClean || c =3D=3D BitDirty) && + test_bit(MD_RECOVERY_SYNC, &mddev->recovery) && + !test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery)) + return blocks; + + return 0; +} + +static bool llbitmap_start_sync(struct mddev *mddev, sector_t offset, + sector_t *blocks, bool degraded) +{ + struct llbitmap *llbitmap =3D mddev->bitmap; + unsigned long p =3D offset >> llbitmap->chunkshift; + + /* + * Handle one bit at a time, this is much simpler. And it doesn't matter + * if md_do_sync() loop more times. + */ + *blocks =3D llbitmap->chunksize - (offset & (llbitmap->chunksize - 1)); + return llbitmap_state_machine(llbitmap, p, p, + BitmapActionStartsync) =3D=3D BitSyncing; +} + +/* Something is wrong, sync_thread stop at @offset */ +static void llbitmap_end_sync(struct mddev *mddev, sector_t offset, + sector_t *blocks) +{ + struct llbitmap *llbitmap =3D mddev->bitmap; + unsigned long p =3D offset >> llbitmap->chunkshift; + + *blocks =3D llbitmap->chunksize - (offset & (llbitmap->chunksize - 1)); + llbitmap_state_machine(llbitmap, p, llbitmap->chunks - 1, + BitmapActionAbortsync); +} + +/* A full sync_thread is finished */ +static void llbitmap_close_sync(struct mddev *mddev) +{ + struct llbitmap *llbitmap =3D mddev->bitmap; + int i; + + for (i =3D 0; i < llbitmap->nr_pages; i++) { + struct llbitmap_page_ctl *pctl =3D llbitmap->pctl[i]; + + /* let daemon_fn clear dirty bits immediately */ + WRITE_ONCE(pctl->expire, jiffies); + } + + llbitmap_state_machine(llbitmap, 0, llbitmap->chunks - 1, + BitmapActionEndsync); +} + +/* + * sync_thread have reached @sector, update metadata every daemon_sleep se= conds, + * just in case sync_thread have to restart after power failure. + */ +static void llbitmap_cond_end_sync(struct mddev *mddev, sector_t sector, + bool force) +{ + struct llbitmap *llbitmap =3D mddev->bitmap; + + if (sector =3D=3D 0) { + llbitmap->last_end_sync =3D jiffies; + return; + } + + if (time_before(jiffies, llbitmap->last_end_sync + + HZ * mddev->bitmap_info.daemon_sleep)) + return; + + wait_event(mddev->recovery_wait, !atomic_read(&mddev->recovery_active)); + + mddev->curr_resync_completed =3D sector; + set_bit(MD_SB_CHANGE_CLEAN, &mddev->sb_flags); + llbitmap_state_machine(llbitmap, 0, sector >> llbitmap->chunkshift, + BitmapActionEndsync); + __llbitmap_flush(mddev); + + llbitmap->last_end_sync =3D jiffies; + sysfs_notify_dirent_safe(mddev->sysfs_completed); +} + #endif /* CONFIG_MD_LLBITMAP */ --=20 2.39.2 From nobody Fri Dec 19 16:08:17 2025 Received: from dggsgout12.his.huawei.com (dggsgout12.his.huawei.com [45.249.212.56]) (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 A6C091EB9F3; Sat, 24 May 2025 06:18:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748067506; cv=none; b=UsLsnpAG5fiJvXzDy8TDe4+5KW1r1zr6M7dt7Ro/T9IUh3DhdUjnUn8o5bVkizRu65wvSBfui2Xt7htVHeCGRk6HusG/sJMXy4zv3ztuDOH/TgvnJiFPTEdDxNtLh24AcQH8yxDodDdYRH35tPzzx7I/s/0uIRX2rQzYRW9ZjBU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748067506; c=relaxed/simple; bh=++g/sKcSP3o2HG7k1VLirDPrYJkkjBOAcO00ejz1BQY=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=VffqRsE4r9N2ME58+YpRFMabJQqDCLzOnDPSEbVhhoIXqJ5Wo0kB9vEtG2VEkeTc+sldY9lns1ZE1HeTycwfY/LZgtyH72D1dpuEdgFe8pOJoeEQ3VTuhTa8ImzxfSUVLSYH97yAU9qlEZZlkgqnEKw0YcA4+bua5Qn16YPGrq0= 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.56 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.93.142]) by dggsgout12.his.huawei.com (SkyGuard) with ESMTPS id 4b4Bfl3dRQzKHMbP; Sat, 24 May 2025 14:18:23 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.128]) by mail.maildlp.com (Postfix) with ESMTP id 017E61A0359; Sat, 24 May 2025 14:18:22 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP4 (Coremail) with SMTP id gCh0CgCnCl+dZDFo3etkNQ--.42979S25; Sat, 24 May 2025 14:18:21 +0800 (CST) From: Yu Kuai To: hch@lst.de, xni@redhat.com, colyli@kernel.org, song@kernel.org, yukuai3@huawei.com Cc: linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-raid@vger.kernel.org, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com, johnny.chenyi@huawei.com Subject: [PATCH 21/23] md/md-llbitmap: implement all bitmap operations Date: Sat, 24 May 2025 14:13:18 +0800 Message-Id: <20250524061320.370630-22-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20250524061320.370630-1-yukuai1@huaweicloud.com> References: <20250524061320.370630-1-yukuai1@huaweicloud.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: gCh0CgCnCl+dZDFo3etkNQ--.42979S25 X-Coremail-Antispam: 1UD129KBjvJXoWxuF15JFyDJFykKrWrZF4fZrb_yoWrWF47pF 47XFy5Gr45JF1xWw13Jr97ZF1rArs2q3sFqrZ3C34rWr1UArZxKF4rWFyUJw1DXryrJFs8 Xw45KF45C3yrXFUanT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUmS14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_Ar0_tr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F 4UJwA2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq 3wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0I7 IYx2IY67AKxVWUJVWUGwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r1j6r4U M4x0Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwACI402YVCY1x02628vn2 kIc2xKxwCY1x0262kKe7AKxVWUtVW8ZwCF04k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7xkE bVWUJVW8JwC20s026c02F40E14v26r1j6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E67 AF67kF1VAFwI0_Jw0_GFylIxkGc2Ij64vIr41lIxAIcVC0I7IYx2IY67AKxVW5JVW7JwCI 42IY6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F4UJwCI42IY6xAIw20EY4v20xvaj40_Jr0_JF 4lIxAIcVC2z280aVAFwI0_Gr0_Cr1lIxAIcVC2z280aVCY1x0267AKxVW8Jr0_Cr1UYxBI daVFxhVjvjDU0xZFpf9x0JUQFxUUUUUU= X-CM-SenderInfo: 51xn3trlr6x35dzhxuhorxvhhfrp/ Content-Type: text/plain; charset="utf-8" From: Yu Kuai Include following left APIs - llbitmap_enabled - llbitmap_dirty_bits - llbitmap_update_sb - llbitmap_write_all - llbitmap_start_behind_write - llbitmap_end_behind_write - llbitmap_wait_behind_writes Signed-off-by: Yu Kuai --- drivers/md/md-llbitmap.c | 114 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) diff --git a/drivers/md/md-llbitmap.c b/drivers/md/md-llbitmap.c index 1b7625d3e2ed..ae664aa110a8 100644 --- a/drivers/md/md-llbitmap.c +++ b/drivers/md/md-llbitmap.c @@ -1277,4 +1277,118 @@ static void llbitmap_cond_end_sync(struct mddev *md= dev, sector_t sector, sysfs_notify_dirent_safe(mddev->sysfs_completed); } =20 +static bool llbitmap_enabled(void *data) +{ + struct llbitmap *llbitmap =3D data; + + return llbitmap && !test_bit(BITMAP_WRITE_ERROR, &llbitmap->flags); +} + +static void llbitmap_dirty_bits(struct mddev *mddev, unsigned long s, + unsigned long e) +{ + llbitmap_state_machine(mddev->bitmap, s, e, BitmapActionStartwrite); +} + +static void llbitmap_write_sb(struct llbitmap *llbitmap) +{ + int nr_bits =3D DIV_ROUND_UP(BITMAP_SB_SIZE, llbitmap->io_size); + + bitmap_fill(llbitmap->pctl[0]->dirty, nr_bits); + llbitmap_write_page(llbitmap, 0); + md_super_wait(llbitmap->mddev); +} + +static void llbitmap_update_sb(void *data) +{ + struct llbitmap *llbitmap =3D data; + struct mddev *mddev =3D llbitmap->mddev; + struct page *sb_page; + bitmap_super_t *sb; + + if (test_bit(BITMAP_WRITE_ERROR, &llbitmap->flags)) + return; + + sb_page =3D llbitmap_read_page(llbitmap, 0); + if (IS_ERR(sb_page)) { + pr_err("%s: %s: read super block failed", __func__, + mdname(mddev)); + set_bit(BITMAP_WRITE_ERROR, &llbitmap->flags); + return; + } + + if (mddev->events < llbitmap->events_cleared) + llbitmap->events_cleared =3D mddev->events; + + sb =3D kmap_local_page(sb_page); + sb->events =3D cpu_to_le64(mddev->events); + sb->state =3D cpu_to_le32(llbitmap->flags); + sb->chunksize =3D cpu_to_le32(llbitmap->chunksize); + sb->sync_size =3D cpu_to_le64(mddev->resync_max_sectors); + sb->events_cleared =3D cpu_to_le64(llbitmap->events_cleared); + sb->sectors_reserved =3D cpu_to_le32(mddev->bitmap_info.space); + sb->daemon_sleep =3D cpu_to_le32(mddev->bitmap_info.daemon_sleep); + + kunmap_local(sb); + llbitmap_write_sb(llbitmap); +} + +static int llbitmap_get_stats(void *data, struct md_bitmap_stats *stats) +{ + struct llbitmap *llbitmap =3D data; + + memset(stats, 0, sizeof(*stats)); + + stats->missing_pages =3D 0; + stats->pages =3D llbitmap->nr_pages; + stats->file_pages =3D llbitmap->nr_pages; + + stats->behind_writes =3D atomic_read(&llbitmap->behind_writes); + stats->behind_wait =3D wq_has_sleeper(&llbitmap->behind_wait); + stats->events_cleared =3D llbitmap->events_cleared; + + return 0; +} + +/* just flag all pages as needing to be written */ +static void llbitmap_write_all(struct mddev *mddev) +{ + int i; + struct llbitmap *llbitmap =3D mddev->bitmap; + + for (i =3D 0; i < llbitmap->nr_pages; i++) { + struct llbitmap_page_ctl *pctl =3D llbitmap->pctl[i]; + + set_bit(LLPageDirty, &pctl->flags); + bitmap_fill(pctl->dirty, llbitmap->bits_per_page); + } +} + +static void llbitmap_start_behind_write(struct mddev *mddev) +{ + struct llbitmap *llbitmap =3D mddev->bitmap; + + atomic_inc(&llbitmap->behind_writes); +} + +static void llbitmap_end_behind_write(struct mddev *mddev) +{ + struct llbitmap *llbitmap =3D mddev->bitmap; + + if (atomic_dec_and_test(&llbitmap->behind_writes)) + wake_up(&llbitmap->behind_wait); +} + +static void llbitmap_wait_behind_writes(struct mddev *mddev) +{ + struct llbitmap *llbitmap =3D mddev->bitmap; + + if (!llbitmap) + return; + + wait_event(llbitmap->behind_wait, + atomic_read(&llbitmap->behind_writes) =3D=3D 0); + +} + #endif /* CONFIG_MD_LLBITMAP */ --=20 2.39.2 From nobody Fri Dec 19 16:08:17 2025 Received: from dggsgout12.his.huawei.com (dggsgout12.his.huawei.com [45.249.212.56]) (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 774A61D54EF; Sat, 24 May 2025 06:18:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748067507; cv=none; b=GCElEum/4tRNTAlsyQ/DI9mJV/i74hoid23niRGpYzBtbgw/IW2wB8RxG6792erwFtY7FAf4nYMHe/2gxv7rW3fFHzBW5tg2yVveN7JXdKmz7Vx2YIVQjja6urQjp39PoftyJeZhhSre26ZfLleIawOC/Hg++MV0no2TM4eU/Og= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748067507; c=relaxed/simple; bh=lOxzkU3aFVC8gZwfFHSunwYKzPFcPBMu2IAExmH73O8=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=NtMzmv1ydaSqNSjeLzenwXa9rh0M/6AHimjz92jsd9momp1MRNgnKd0ywHvkcwBcR4GbDcOPCokbJUA669ThVsEY3WqalS9G8zy0JPxBCBcXOlNwEf+NqhD9SqV294i24h7G1ChYj1lrOCp1J3MZ6p2z35zrCivA80uzJBB/fG0= 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.56 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 dggsgout12.his.huawei.com (SkyGuard) with ESMTPS id 4b4Bfm01NBzKHMbS; Sat, 24 May 2025 14:18:23 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.128]) by mail.maildlp.com (Postfix) with ESMTP id 792791A0E23; Sat, 24 May 2025 14:18:22 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP4 (Coremail) with SMTP id gCh0CgCnCl+dZDFo3etkNQ--.42979S26; Sat, 24 May 2025 14:18:22 +0800 (CST) From: Yu Kuai To: hch@lst.de, xni@redhat.com, colyli@kernel.org, song@kernel.org, yukuai3@huawei.com Cc: linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-raid@vger.kernel.org, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com, johnny.chenyi@huawei.com Subject: [PATCH 22/23] md/md-llbitmap: implement sysfs APIs Date: Sat, 24 May 2025 14:13:19 +0800 Message-Id: <20250524061320.370630-23-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20250524061320.370630-1-yukuai1@huaweicloud.com> References: <20250524061320.370630-1-yukuai1@huaweicloud.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: gCh0CgCnCl+dZDFo3etkNQ--.42979S26 X-Coremail-Antispam: 1UD129KBjvJXoWxWF1DWryUCw18JFy3JFW8JFb_yoWrCw1Upa yIg345ur45Jr1fWr17JrZrZayrWws5u3srtr97Ca4rCF1UArsIgFy8WFy8Jw1kWryfGF1D Zan0grWrGF48XFJanT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUmS14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_Ar0_tr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F 4UJwA2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq 3wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0I7 IYx2IY67AKxVWUJVWUGwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r1j6r4U M4x0Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwACI402YVCY1x02628vn2 kIc2xKxwCY1x0262kKe7AKxVWUtVW8ZwCF04k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7xkE bVWUJVW8JwC20s026c02F40E14v26r1j6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E67 AF67kF1VAFwI0_Jw0_GFylIxkGc2Ij64vIr41lIxAIcVC0I7IYx2IY67AKxVW5JVW7JwCI 42IY6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F4UJwCI42IY6xAIw20EY4v20xvaj40_Jr0_JF 4lIxAIcVC2z280aVAFwI0_Gr0_Cr1lIxAIcVC2z280aVCY1x0267AKxVW8Jr0_Cr1UYxBI daVFxhVjvjDU0xZFpf9x0JUQFxUUUUUU= X-CM-SenderInfo: 51xn3trlr6x35dzhxuhorxvhhfrp/ Content-Type: text/plain; charset="utf-8" From: Yu Kuai There are 3 APIs for now: - bits: readonly, show status of bitmap bits, the number of each value; - metadata: readonly show bitmap metadata, include chunksize, chunkshift, chunks, offset and daemon_sleep; - daemon_sleep: read-write, default value is 30; Signed-off-by: Yu Kuai --- Documentation/admin-guide/md.rst | 13 +++++ drivers/md/md-llbitmap.c | 96 ++++++++++++++++++++++++++++++++ 2 files changed, 109 insertions(+) diff --git a/Documentation/admin-guide/md.rst b/Documentation/admin-guide/m= d.rst index 356d2a344f08..2030772075b5 100644 --- a/Documentation/admin-guide/md.rst +++ b/Documentation/admin-guide/md.rst @@ -444,6 +444,19 @@ If bitmap_type is bitmap, then the md device will also= contain: once the array becomes non-degraded, and this fact has been recorded in the metadata. =20 +If bitmap_type is llbitmap, then the md device will also contain: + + llbitmap/bits + This is readonly, show status of bitmap bits, the number of each + value. + + llbitmap/metadata + This is readonly, show bitmap metadata, include chunksize, chunkshift, + chunks, offset and daemon_sleep. + + llbitmap/daemon_sleep + This is readwrite, time in seconds that daemon function will be + triggered to clear dirty bits. As component devices are added to an md array, they appear in the ``md`` directory as new directories named:: =20 diff --git a/drivers/md/md-llbitmap.c b/drivers/md/md-llbitmap.c index ae664aa110a8..38e67d4582ad 100644 --- a/drivers/md/md-llbitmap.c +++ b/drivers/md/md-llbitmap.c @@ -1391,4 +1391,100 @@ static void llbitmap_wait_behind_writes(struct mdde= v *mddev) =20 } =20 +static ssize_t bits_show(struct mddev *mddev, char *page) +{ + struct llbitmap *llbitmap; + int bits[nr_llbitmap_state] =3D {0}; + loff_t start =3D 0; + + mutex_lock(&mddev->bitmap_info.mutex); + llbitmap =3D mddev->bitmap; + if (!llbitmap || !llbitmap->pctl) { + mutex_unlock(&mddev->bitmap_info.mutex); + return sprintf(page, "no bitmap\n"); + } + + if (test_bit(BITMAP_WRITE_ERROR, &llbitmap->flags)) { + mutex_unlock(&mddev->bitmap_info.mutex); + return sprintf(page, "bitmap io error\n"); + } + + while (start < llbitmap->chunks) { + enum llbitmap_state c =3D llbitmap_read(llbitmap, start); + + if (c < 0 || c >=3D nr_llbitmap_state) + pr_err("%s: invalid bit %llu state %d\n", + __func__, start, c); + else + bits[c]++; + start++; + } + + mutex_unlock(&mddev->bitmap_info.mutex); + return sprintf(page, "unwritten %d\nclean %d\ndirty %d\nneed sync %d\nsyn= cing %d\n", + bits[BitUnwritten], bits[BitClean], bits[BitDirty], + bits[BitNeedSync], bits[BitSyncing]); +} + +static struct md_sysfs_entry llbitmap_bits =3D +__ATTR_RO(bits); + +static ssize_t metadata_show(struct mddev *mddev, char *page) +{ + struct llbitmap *llbitmap; + ssize_t ret; + + mutex_lock(&mddev->bitmap_info.mutex); + llbitmap =3D mddev->bitmap; + if (!llbitmap) { + mutex_unlock(&mddev->bitmap_info.mutex); + return sprintf(page, "no bitmap\n"); + } + + ret =3D sprintf(page, "chunksize %lu\nchunkshift %lu\nchunks %lu\noffset= %llu\ndaemon_sleep %lu\n", + llbitmap->chunksize, llbitmap->chunkshift, + llbitmap->chunks, mddev->bitmap_info.offset, + llbitmap->mddev->bitmap_info.daemon_sleep); + mutex_unlock(&mddev->bitmap_info.mutex); + + return ret; +} + +static struct md_sysfs_entry llbitmap_metadata =3D +__ATTR_RO(metadata); + +static ssize_t +daemon_sleep_show(struct mddev *mddev, char *page) +{ + return sprintf(page, "%lu\n", mddev->bitmap_info.daemon_sleep); +} + +static ssize_t +daemon_sleep_store(struct mddev *mddev, const char *buf, size_t len) +{ + unsigned long timeout; + int rv =3D kstrtoul(buf, 10, &timeout); + + if (rv) + return rv; + + mddev->bitmap_info.daemon_sleep =3D timeout; + return len; +} + +static struct md_sysfs_entry llbitmap_daemon_sleep =3D +__ATTR_RW(daemon_sleep); + +static struct attribute *md_llbitmap_attrs[] =3D { + &llbitmap_bits.attr, + &llbitmap_metadata.attr, + &llbitmap_daemon_sleep.attr, + NULL +}; + +static struct attribute_group md_llbitmap_group =3D { + .name =3D "llbitmap", + .attrs =3D md_llbitmap_attrs, +}; + #endif /* CONFIG_MD_LLBITMAP */ --=20 2.39.2 From nobody Fri Dec 19 16:08:17 2025 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 D868A1DB13E; Sat, 24 May 2025 06:18:24 +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=1748067507; cv=none; b=nBRFDToEMucluqbrwaC45ajy7oRu+x+JVkqKx2J+mWOrIbUScCGhUsd9Pw99CzA0yNOJ2d2x+dvelWDv5/cIs1/7Zc4FSB3fzSnc4XOlA13S9VP8+Rjpodmr78tNhP0L2CBUoyrkjTeZBaMUulQ1edxsw/xpwHkj+YBg6465pgs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748067507; c=relaxed/simple; bh=Yksn/VMnec2y9uintveVhkg1+s2ouTyiPeqvkqMtvXQ=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=oroHGcgBKFzZQtMcVnQtYuCOpakI11hiXQ+pUl65V9NBjDbgBhg5Iv55TUGSyk6wk8eu0GUdb5cpyB62x4enG3+uZylD/ar7YoiWI7Zuydt0P0Tcfd/s4kjVnXzf4+D7psys4Adpsm6R/bCqcB9sHi9nQ4AFV4VsmzhOP3fwoUw= 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.93.142]) by dggsgout11.his.huawei.com (SkyGuard) with ESMTPS id 4b4Bfl5pXxzYQtvs; Sat, 24 May 2025 14:18:23 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.128]) by mail.maildlp.com (Postfix) with ESMTP id F12AC1A07BB; Sat, 24 May 2025 14:18:22 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP4 (Coremail) with SMTP id gCh0CgCnCl+dZDFo3etkNQ--.42979S27; Sat, 24 May 2025 14:18:22 +0800 (CST) From: Yu Kuai To: hch@lst.de, xni@redhat.com, colyli@kernel.org, song@kernel.org, yukuai3@huawei.com Cc: linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-raid@vger.kernel.org, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com, johnny.chenyi@huawei.com Subject: [PATCH 23/23] md/md-llbitmap: add Kconfig Date: Sat, 24 May 2025 14:13:20 +0800 Message-Id: <20250524061320.370630-24-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20250524061320.370630-1-yukuai1@huaweicloud.com> References: <20250524061320.370630-1-yukuai1@huaweicloud.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: gCh0CgCnCl+dZDFo3etkNQ--.42979S27 X-Coremail-Antispam: 1UD129KBjvJXoW3Jr1kCw43tr43CryfJr13urg_yoW7Wr1DpF ZxXry3Cw15JF4xXw15Ja47uF95ta1ktr9F9rn3C34ruFWUArZxtr4xGFyUJw1DWrsxJFZ8 JF15GF9xCw1UXaUanT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUmS14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_Ar0_tr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F 4UJwA2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq 3wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0I7 IYx2IY67AKxVWUJVWUGwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r1j6r4U M4x0Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwACI402YVCY1x02628vn2 kIc2xKxwCY1x0262kKe7AKxVWUtVW8ZwCF04k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7xkE bVWUJVW8JwC20s026c02F40E14v26r1j6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E67 AF67kF1VAFwI0_Jw0_GFylIxkGc2Ij64vIr41lIxAIcVC0I7IYx2IY67AKxVW5JVW7JwCI 42IY6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F4UJwCI42IY6xAIw20EY4v20xvaj40_Jr0_JF 4lIxAIcVC2z280aVAFwI0_Gr0_Cr1lIxAIcVC2z280aVCY1x0267AKxVW8Jr0_Cr1UYxBI daVFxhVjvjDU0xZFpf9x0JUQFxUUUUUU= X-CM-SenderInfo: 51xn3trlr6x35dzhxuhorxvhhfrp/ Content-Type: text/plain; charset="utf-8" From: Yu Kuai A new config MD_LLBITMAP is added, user can now using llbitmap to replace the old bitmap. Signed-off-by: Yu Kuai --- drivers/md/Kconfig | 11 +++++++ drivers/md/Makefile | 2 +- drivers/md/md-bitmap.h | 13 ++++++++ drivers/md/md-llbitmap.c | 66 ++++++++++++++++++++++++++++++++++++++++ drivers/md/md.c | 6 ++++ drivers/md/md.h | 4 +-- 6 files changed, 99 insertions(+), 3 deletions(-) diff --git a/drivers/md/Kconfig b/drivers/md/Kconfig index f913579e731c..07c19b2182ca 100644 --- a/drivers/md/Kconfig +++ b/drivers/md/Kconfig @@ -52,6 +52,17 @@ config MD_BITMAP =20 If unsure, say Y. =20 +config MD_LLBITMAP + bool "MD RAID lockless bitmap support" + depends on BLK_DEV_MD + help + If you say Y here, support for the lockless write intent bitmap will + be enabled. + + Note, this is an experimental feature. + + If unsure, say N. + config MD_AUTODETECT bool "Autodetect RAID arrays during kernel boot" depends on BLK_DEV_MD=3Dy diff --git a/drivers/md/Makefile b/drivers/md/Makefile index 87bdfc9fe14c..f1ca25cc1408 100644 --- a/drivers/md/Makefile +++ b/drivers/md/Makefile @@ -27,7 +27,7 @@ dm-clone-y +=3D dm-clone-target.o dm-clone-metadata.o dm-verity-y +=3D dm-verity-target.o dm-zoned-y +=3D dm-zoned-target.o dm-zoned-metadata.o dm-zoned-reclaim.o =20 -md-mod-y +=3D md.o md-bitmap.o +md-mod-y +=3D md.o md-bitmap.o md-llbitmap.o raid456-y +=3D raid5.o raid5-cache.o raid5-ppl.o linear-y +=3D md-linear.o =20 diff --git a/drivers/md/md-bitmap.h b/drivers/md/md-bitmap.h index a9a0f6a8d96d..8b4f2068931e 100644 --- a/drivers/md/md-bitmap.h +++ b/drivers/md/md-bitmap.h @@ -183,4 +183,17 @@ static inline void md_bitmap_exit(void) } #endif =20 +#ifdef CONFIG_MD_LLBITMAP +int md_llbitmap_init(void); +void md_llbitmap_exit(void); +#else +static inline int md_llbitmap_init(void) +{ + return 0; +} +static inline void md_llbitmap_exit(void) +{ +} +#endif + #endif diff --git a/drivers/md/md-llbitmap.c b/drivers/md/md-llbitmap.c index 38e67d4582ad..8321dcbf1ce2 100644 --- a/drivers/md/md-llbitmap.c +++ b/drivers/md/md-llbitmap.c @@ -1487,4 +1487,70 @@ static struct attribute_group md_llbitmap_group =3D { .attrs =3D md_llbitmap_attrs, }; =20 +static struct bitmap_operations llbitmap_ops =3D { + .head =3D { + .type =3D MD_BITMAP, + .id =3D ID_LLBITMAP, + .name =3D "llbitmap", + }, + + .enabled =3D llbitmap_enabled, + .create =3D llbitmap_create, + .resize =3D llbitmap_resize, + .load =3D llbitmap_load, + .destroy =3D llbitmap_destroy, + + .start_write =3D llbitmap_start_write, + .end_write =3D llbitmap_end_write, + .start_discard =3D llbitmap_start_discard, + .end_discard =3D llbitmap_end_discard, + .unplug =3D llbitmap_unplug, + .flush =3D llbitmap_flush, + + .start_behind_write =3D llbitmap_start_behind_write, + .end_behind_write =3D llbitmap_end_behind_write, + .wait_behind_writes =3D llbitmap_wait_behind_writes, + + .blocks_synced =3D llbitmap_blocks_synced, + .skip_sync_blocks =3D llbitmap_skip_sync_blocks, + .start_sync =3D llbitmap_start_sync, + .end_sync =3D llbitmap_end_sync, + .close_sync =3D llbitmap_close_sync, + .cond_end_sync =3D llbitmap_cond_end_sync, + + .update_sb =3D llbitmap_update_sb, + .get_stats =3D llbitmap_get_stats, + .dirty_bits =3D llbitmap_dirty_bits, + .write_all =3D llbitmap_write_all, + + .group =3D &md_llbitmap_group, +}; + +int md_llbitmap_init(void) +{ + md_llbitmap_io_wq =3D alloc_workqueue("md_llbitmap_io", + WQ_MEM_RECLAIM | WQ_UNBOUND, 0); + if (!md_llbitmap_io_wq) + return -ENOMEM; + + md_llbitmap_unplug_wq =3D alloc_workqueue("md_llbitmap_unplug", + WQ_MEM_RECLAIM | WQ_UNBOUND, 0); + if (!md_llbitmap_unplug_wq) { + destroy_workqueue(md_llbitmap_io_wq); + md_llbitmap_io_wq =3D NULL; + return -ENOMEM; + } + + return register_md_submodule(&llbitmap_ops.head); +} + +void md_llbitmap_exit(void) +{ + destroy_workqueue(md_llbitmap_io_wq); + md_llbitmap_io_wq =3D NULL; + destroy_workqueue(md_llbitmap_unplug_wq); + md_llbitmap_unplug_wq =3D NULL; + unregister_md_submodule(&llbitmap_ops.head); +} + #endif /* CONFIG_MD_LLBITMAP */ diff --git a/drivers/md/md.c b/drivers/md/md.c index c7f7914b7452..52e19344b73e 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -10183,6 +10183,10 @@ static int __init md_init(void) if (ret) return ret; =20 + ret =3D md_llbitmap_init(); + if (ret) + goto err_bitmap; + ret =3D -ENOMEM; md_wq =3D alloc_workqueue("md", WQ_MEM_RECLAIM, 0); if (!md_wq) @@ -10214,6 +10218,8 @@ static int __init md_init(void) err_misc_wq: destroy_workqueue(md_wq); err_wq: + md_llbitmap_exit(); +err_bitmap: md_bitmap_exit(); return ret; } diff --git a/drivers/md/md.h b/drivers/md/md.h index 3adb1660c7ed..aba5f1ffcdfd 100644 --- a/drivers/md/md.h +++ b/drivers/md/md.h @@ -26,7 +26,7 @@ enum md_submodule_type { MD_PERSONALITY =3D 0, MD_CLUSTER, - MD_BITMAP, /* TODO */ + MD_BITMAP, }; =20 enum md_submodule_id { @@ -39,7 +39,7 @@ enum md_submodule_id { ID_RAID10 =3D 10, ID_CLUSTER, ID_BITMAP, - ID_LLBITMAP, /* TODO */ + ID_LLBITMAP, ID_BITMAP_NONE, }; =20 --=20 2.39.2