Received: by 2002:a05:7412:e794:b0:fa:551:50a7 with SMTP id o20csp180497rdd; Tue, 9 Jan 2024 00:04:27 -0800 (PST) X-Google-Smtp-Source: AGHT+IFvZ3HUBcgfNx7g03U661QWwMv+HXUrAm4pQGXgnV2aoYZaxJ0tVArpZlzLsTB8tfG9YFxZ X-Received: by 2002:a05:6a20:1605:b0:199:d3e3:93df with SMTP id l5-20020a056a20160500b00199d3e393dfmr1520700pzj.14.1704787467616; Tue, 09 Jan 2024 00:04:27 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1704787467; cv=none; d=google.com; s=arc-20160816; b=WGjvV+gJ1LOU34XqykYolLPWkb2EbhRzZbh3FRs3fWkgQyCT4eS3WcyvkQ4WE3Qh5A kYkhW7qBx97L7N6PhthJsc9KqZYxafkpud/GWiybfS28jha5DNLbZqkL0BsA9RCvlZWu KmulCDPD1kOw7Kt0cVF+NWhwTnm6fIXSIm3GiTrqaWoV6qIvZHgckZzoiTAjCNGvlbK2 PD2z3KQJHSR7IPA5Ah9b+jVIhY38Fy3WDe/6t86RNGkEC4MhWP0V7gYPwmTmPPyYJLyt 8BummOaJMCeYEhm2ZeeJFdelkZzVggbK1NyrKc5B+V2ZhkAeWPzswOtYYPB2EFQKaliF E5+w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:in-reply-to:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:user-agent:date:message-id:from :references:cc:to:subject; bh=jWcRfvaaIFGL033anYH6HN2yM9PxA6LlwQNeQLPoy7Q=; fh=aOLVszRPOeqZIIOM+Nr5wN6KUWB7dl0tYLp7DAVQPlk=; b=gLcx5TaN2f4Xku6HcbzBxabdljJj9RzX68hszJh5xQnOWk+bc3PZgn0kLjT6FHDamk GVbrYly0kQLsMCKOtEKY6MJ9oNrAyICl3axiEZFYtFziimJi0Ja408yMeTI5QLRFjQeX +JYR56WgmawBFbPmmfDQyzabCW1MixzzgcEoHjn00r2ZCl92mtKcLwLhzArwbZlwKL0T 1bG4ccULbyeNmw4ySST2M4gIInNVavzwxatS4Fwyh/j1tRCqIaor1NjneW40G7+OZOPZ EiZWK4SHOT9H3TDz1uRq/XC3ZXvARyIsH/IAVrw+/LNDREmko7+AWob9WOXf2hx5Nd9i BTfw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel+bounces-20494-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:40f1:3f00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-20494-linux.lists.archive=gmail.com@vger.kernel.org" Return-Path: Received: from sy.mirrors.kernel.org (sy.mirrors.kernel.org. [2604:1380:40f1:3f00::1]) by mx.google.com with ESMTPS id s1-20020a625e01000000b006dabf5c26b5si1090247pfb.224.2024.01.09.00.04.27 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 09 Jan 2024 00:04:27 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-20494-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:40f1:3f00::1 as permitted sender) client-ip=2604:1380:40f1:3f00::1; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel+bounces-20494-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:40f1:3f00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-20494-linux.lists.archive=gmail.com@vger.kernel.org" Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sy.mirrors.kernel.org (Postfix) with ESMTPS id CFF21B25EC0 for ; Tue, 9 Jan 2024 07:48:43 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 8B6D9B67F; Tue, 9 Jan 2024 07:48:33 +0000 (UTC) Received: from dggsgout12.his.huawei.com (unknown [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 521216D6E2; Tue, 9 Jan 2024 07:48:29 +0000 (UTC) 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.235]) by dggsgout12.his.huawei.com (SkyGuard) with ESMTP id 4T8NMp6tvqz4f3kjN; Tue, 9 Jan 2024 15:48:22 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.112]) by mail.maildlp.com (Postfix) with ESMTP id 6EB0D1A0272; Tue, 9 Jan 2024 15:48:26 +0800 (CST) Received: from [10.174.176.73] (unknown [10.174.176.73]) by APP1 (Coremail) with SMTP id cCh0CgBXKBFJ+pxlGV82AQ--.34051S3; Tue, 09 Jan 2024 15:48:26 +0800 (CST) Subject: Re: [PATCH v3 2/2] md: simplify md_seq_ops To: Yu Kuai , Song Liu Cc: mariusz.tkaczyk@linux.intel.com, xni@redhat.com, linux-raid@vger.kernel.org, linux-kernel@vger.kernel.org, yi.zhang@huawei.com, yangerkun@huawei.com, "yukuai (C)" References: <20230927061241.1552837-1-yukuai1@huaweicloud.com> <20230927061241.1552837-3-yukuai1@huaweicloud.com> From: Yu Kuai Message-ID: <753615cc-16d6-3c58-99ee-b5e1f0aa0cde@huaweicloud.com> Date: Tue, 9 Jan 2024 15:48:25 +0800 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:60.0) Gecko/20100101 Thunderbird/60.8.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit X-CM-TRANSID:cCh0CgBXKBFJ+pxlGV82AQ--.34051S3 X-Coremail-Antispam: 1UD129KBjvJXoWxGFyrAryDWr43AFy7Ww18AFb_yoWrtFyDpa 9xZFWUAr4DZFWrtw4DXa1kua4Fv3ZFqryqgr9rG3s3Cr1jqr9a93W3XrWjvF98uFW8W3Z8 Zw4UKFyUWrW8JwUanT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUkE14x267AKxVW8JVW5JwAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2ocxC64kIII0Yj41l84x0c7CEw4AK67xGY2AK02 1l84ACjcxK6xIIjxv20xvE14v26w1j6s0DM28EF7xvwVC0I7IYx2IY6xkF7I0E14v26r4U JVWxJr1l84ACjcxK6I8E87Iv67AKxVW0oVCq3wA2z4x0Y4vEx4A2jsIEc7CjxVAFwI0_Gc CE3s1le2I262IYc4CY6c8Ij28IcVAaY2xG8wAqx4xG64xvF2IEw4CE5I8CrVC2j2WlYx0E 2Ix0cI8IcVAFwI0_Jr0_Jr4lYx0Ex4A2jsIE14v26r1j6r4UMcvjeVCFs4IE7xkEbVWUJV W8JwACjcxG0xvEwIxGrwACjI8F5VA0II8E6IAqYI8I648v4I1lc7I2V7IY0VAS07AlzVAY IcxG8wCF04k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7xkEbVWUJVW8JwC20s026c02F40E14 v26r1j6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E67AF67kF1VAFwI0_Jw0_GFylIxkG c2Ij64vIr41lIxAIcVC0I7IYx2IY67AKxVWUJVWUCwCI42IY6xIIjxv20xvEc7CjxVAFwI 0_Jr0_Gr1lIxAIcVCF04k26cxKx2IYs7xG6rWUJVWrZr1UMIIF0xvEx4A2jsIE14v26r1j 6r4UMIIF0xvEx4A2jsIEc7CjxVAFwI0_Gr0_Gr1UYxBIdaVFxhVjvjDU0xZFpf9x0JUdHU DUUUUU= X-CM-SenderInfo: 51xn3trlr6x35dzhxuhorxvhhfrp/ Hi, 在 2024/01/09 9:21, Yu Kuai 写道: > Hi, > > 在 2024/01/09 7:38, Song Liu 写道: >> On Tue, Sep 26, 2023 at 11:19 PM Yu Kuai wrote: >>> >>> From: Yu Kuai >>> >>> Before this patch, the implementation is hacky and hard to understand: >>> >>> 1) md_seq_start set pos to 1; >>> 2) md_seq_show found pos is 1, then print Personalities; >>> 3) md_seq_next found pos is 1, then it update pos to the first mddev; >>> 4) md_seq_show found pos is not 1 or 2, show mddev; >>> 5) md_seq_next found pos is not 1 or 2, update pos to next mddev; >>> 6) loop 4-5 until the last mddev, then md_seq_next update pos to 2; >>> 7) md_seq_show found pos is 2, then print unused devices; >>> 8) md_seq_next found pos is 2, stop; >>> >>> This patch remove the magic value and use seq_list_start/next/stop() >>> directly, and move printing "Personalities" to md_seq_start(), >>> "unsed devices" to md_seq_stop(): >>> >>> 1) md_seq_start print Personalities, and then set pos to first mddev; >>> 2) md_seq_show show mddev; >>> 3) md_seq_next update pos to next mddev; >>> 4) loop 2-3 until the last mddev; >>> 5) md_seq_stop print unsed devices; >>> >>> Signed-off-by: Yu Kuai >> >> Just realized this introduced a behavior change: >> >> When there is not md devices, before this patch, we have >> >> [root@eth50-1 ~]# cat /proc/mdstat >> Personalities : [raid0] [raid1] [raid10] [raid6] [raid5] [raid4] >> unused devices: >> >> After this patch, "cat /proc/mdstat" returns nothing. This causes >> some confusion for users who want to read "Personalities" line, >> for example, the mdadm test suite reads it. >> >> I haven't figured out the best fix yet. > > Yes, that's a problem. And after reviewing seq_read_iter() in detail, I > realize that I also can't use seq_printf() in m->op->start() directly, > because if seq buffer overflowed, md_seq_start() can be called more than > once. > > I'll fix these problems soon. How about following patch(already tested)? Thanks, Kuai diff --git a/drivers/md/md.c b/drivers/md/md.c index e351e6c51cc7..289d3d89e73d 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -8135,6 +8135,19 @@ static void status_unused(struct seq_file *seq) seq_printf(seq, "\n"); } +static void status_personalities(struct seq_file *seq) +{ + struct md_personality *pers; + + seq_puts(seq, "Personalities : "); + spin_lock(&pers_lock); + list_for_each_entry(pers, &pers_list, list) + seq_printf(seq, "[%s] ", pers->name); + + spin_unlock(&pers_lock); + seq_puts(seq, "\n"); +} + static int status_resync(struct seq_file *seq, struct mddev *mddev) { sector_t max_sectors, resync, res; @@ -8273,43 +8286,53 @@ static int status_resync(struct seq_file *seq, struct mddev *mddev) return 1; } +#define MDDEV_NONE (void *)1 + static void *md_seq_start(struct seq_file *seq, loff_t *pos) __acquires(&all_mddevs_lock) { - struct md_personality *pers; - - seq_puts(seq, "Personalities : "); - spin_lock(&pers_lock); - list_for_each_entry(pers, &pers_list, list) - seq_printf(seq, "[%s] ", pers->name); - - spin_unlock(&pers_lock); - seq_puts(seq, "\n"); seq->poll_event = atomic_read(&md_event_count); - spin_lock(&all_mddevs_lock); - return seq_list_start(&all_mddevs, *pos); + if (!list_empty(&all_mddevs)) + return seq_list_start(&all_mddevs, *pos); + else if (*pos == 0) + return MDDEV_NONE; + else + return NULL; } static void *md_seq_next(struct seq_file *seq, void *v, loff_t *pos) { + if (v == MDDEV_NONE) { + ++*pos; + return NULL; + } + return seq_list_next(v, &all_mddevs, pos); } static void md_seq_stop(struct seq_file *seq, void *v) __releases(&all_mddevs_lock) { - status_unused(seq); spin_unlock(&all_mddevs_lock); } static int md_seq_show(struct seq_file *seq, void *v) { - struct mddev *mddev = list_entry(v, struct mddev, all_mddevs); + struct mddev *mddev; sector_t sectors; struct md_rdev *rdev; + if (v == MDDEV_NONE) { + status_personalities(seq); + status_unused(seq); + return 0; + } + + mddev = list_entry(v, struct mddev, all_mddevs); + if (mddev == list_first_entry(&all_mddevs, struct mddev, all_mddevs)) + status_personalities(seq); if (!mddev_get(mddev)) return 0; @@ -8385,6 +8408,10 @@ static int md_seq_show(struct seq_file *seq, void *v) } spin_unlock(&mddev->lock); spin_lock(&all_mddevs_lock); + + if (mddev == list_last_entry(&all_mddevs, struct mddev, all_mddevs)) + status_unused(seq); + if (atomic_dec_and_test(&mddev->active)) __mddev_put(mddev); > > Thanks, > Kuai > >> >> Thanks, >> Song >> >> . >> > > . >