Received: by 2002:a05:7412:e794:b0:fa:551:50a7 with SMTP id o20csp187099rdd; Tue, 9 Jan 2024 00:21:34 -0800 (PST) X-Google-Smtp-Source: AGHT+IFFezCGyuOxYHkiUWMIdUv1P3MFqGDkHtLkEvELcrWxXvOcICRR3FMIUaG12WxpEj4qvOrG X-Received: by 2002:a17:906:194:b0:a28:b7c1:7210 with SMTP id 20-20020a170906019400b00a28b7c17210mr410345ejb.7.1704788494729; Tue, 09 Jan 2024 00:21:34 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1704788494; cv=none; d=google.com; s=arc-20160816; b=l3T28JsVwObGI2X4GdIzqX/LY+dxVk58O33npv5aq7TX7vIsqd+GghCb+7kG1Q77Wr d5Q6Q9LNDxH5FAZtNCSDWjiJcaRvAq9Up02RH5081MU7B7cWT9d14ESLP+ww4RYF/IG+ jkCtha46muoK3QezNjNj1NB+DD9T2QuFC55jOdJlIhbaKpUiqDpqk5/9lVUGAFrci8fO xUiv22ce33uLMPlAlQGHQrsyAiSsDsn8VNJZh98cj5q6q6RtTCiEHg3anbAMl5PVxW0z +8F0MmU2VWrK4zIrh4tYmdS8b5CRwaIhphmfffldXq3WJy+WvC5Oe3kMCY7/3OSToHpD NNaQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:list-unsubscribe:list-subscribe :list-id:precedence:dkim-signature; bh=siZhN4cOJU0SVZV6wdsiqps/kbKSny/lsc1ToBREpJA=; fh=NlV5nY6tNGKiHaD8Rd6RB/JYJQhDiTqyFnJccUZ7txw=; b=AMXhjspmtsz3YEcGo9AXvVpYnYURDfw75661BSPwH18mt0aGOgB6mOuJZGN4SFDq8U CJ1GPeY36a9TCVPYCSLg1a/nXrO0DQmc3seMXD1ODI4BBMglN8xsWHL4rYpki5xU9AV4 quYSbEgrZP73GZFTVr/l2XhhhT4HORl7Z90vVL14LEdOb/fQ3/aQJJ4GKkVpLhYk9o/1 qcw41v6tzOS4UkSCNEBwuAy2gaY+0upoNYLmsUjNWSqzCURsjue+IaG3IWHzR/ARkB3O rzEyglq6eWWeA7RDLI1CqxZuIHHuvC1rtn2VUixkUxlEUctmFwZfOs5u3en6NpAlLMT3 BuwA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b="ZJ9T1/Z0"; spf=pass (google.com: domain of linux-kernel+bounces-20529-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.80.249 as permitted sender) smtp.mailfrom="linux-kernel+bounces-20529-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from am.mirrors.kernel.org (am.mirrors.kernel.org. [147.75.80.249]) by mx.google.com with ESMTPS id lc20-20020a170906f91400b00a28c07c85casi625174ejb.197.2024.01.09.00.21.34 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 09 Jan 2024 00:21:34 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-20529-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.80.249 as permitted sender) client-ip=147.75.80.249; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b="ZJ9T1/Z0"; spf=pass (google.com: domain of linux-kernel+bounces-20529-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.80.249 as permitted sender) smtp.mailfrom="linux-kernel+bounces-20529-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=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 am.mirrors.kernel.org (Postfix) with ESMTPS id 086051F27756 for ; Tue, 9 Jan 2024 08:13:03 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id C986C250F5; Tue, 9 Jan 2024 08:12:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="ZJ9T1/Z0" Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 D0A4911CAF; Tue, 9 Jan 2024 08:12:43 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 6175CC43394; Tue, 9 Jan 2024 08:12:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1704787963; bh=224IB4+F5ytDnqRtVIkge9vsOi4Yg6Fso5YIj7PvVR8=; h=References:In-Reply-To:From:Date:Subject:To:Cc:From; b=ZJ9T1/Z00y2Cq0xhLXoOezF1jzEhxlO3O+baBYOeDQCnjWPgLRuVkejB2IhnLuXQM nqsWh4gIwwYVnvbHhbfEtaiyJ3Au7ECT05UQ2B1lYDQVOSHgYVSEcBipgOx0/zE8vo g+lNIR0bFHdL1eLw3TDWVN8FgWRAdehn4apQzUJifSQ25BvbFP5Z/z/6Es99wDMKUU lyv6il906YrGSR9kvVDuGemVK2PO/+8Q/nGjUo01YQa1Dx/6o/EmtkUF7gx5KSrrb/ oDJOAw2tIuETBJKfEqoI24O5eGiNclu6l6nHhuyVZWfBFBRsS5aNlxCRF66EUTC7iK qcwYbbfBwNB2w== Received: by mail-lf1-f51.google.com with SMTP id 2adb3069b0e04-50e7b51b0ceso2491578e87.1; Tue, 09 Jan 2024 00:12:43 -0800 (PST) X-Gm-Message-State: AOJu0Yx1kbUZtRQZizMMGuA5uMhSzZ4EUH2lZTn6dTozu88o/7OCinnQ THQFKehAoDdxUfj/AIOsYQOHx6LtwAR8yqfjfSs= X-Received: by 2002:a05:6512:2388:b0:50e:3879:8222 with SMTP id c8-20020a056512238800b0050e38798222mr267241lfv.21.1704787961552; Tue, 09 Jan 2024 00:12:41 -0800 (PST) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 References: <20230927061241.1552837-1-yukuai1@huaweicloud.com> <20230927061241.1552837-3-yukuai1@huaweicloud.com> <753615cc-16d6-3c58-99ee-b5e1f0aa0cde@huaweicloud.com> In-Reply-To: <753615cc-16d6-3c58-99ee-b5e1f0aa0cde@huaweicloud.com> From: Song Liu Date: Tue, 9 Jan 2024 00:12:30 -0800 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: [PATCH v3 2/2] md: simplify md_seq_ops To: Yu Kuai 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)" Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Mon, Jan 8, 2024 at 11:48=E2=80=AFPM Yu Kuai w= rote: > > Hi, > > =E5=9C=A8 2024/01/09 9:21, Yu Kuai =E5=86=99=E9=81=93: > > Hi, > > > > =E5=9C=A8 2024/01/09 7:38, Song Liu =E5=86=99=E9=81=93: > >> On Tue, Sep 26, 2023 at 11:19=E2=80=AFPM Yu Kuai wrote: [...] > 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 =3D 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 =3D=3D 0) > + return MDDEV_NONE; > + else > + return NULL; > } > > static void *md_seq_next(struct seq_file *seq, void *v, loff_t *pos) > { > + if (v =3D=3D 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 =3D list_entry(v, struct mddev, all_mddevs); > + struct mddev *mddev; > sector_t sectors; > struct md_rdev *rdev; > > + if (v =3D=3D MDDEV_NONE) { > + status_personalities(seq); > + status_unused(seq); > + return 0; > + } > + > + mddev =3D list_entry(v, struct mddev, all_mddevs); > + if (mddev =3D=3D 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 =3D=3D list_last_entry(&all_mddevs, struct mddev, all_m= ddevs)) > + status_unused(seq); > + > if (atomic_dec_and_test(&mddev->active)) > __mddev_put(mddev); > I think something like the following is the right way to do this. Thanks, Song diff --git i/drivers/md/md.c w/drivers/md/md.c index 38a6767c65b1..14044febe009 100644 --- i/drivers/md/md.c +++ w/drivers/md/md.c @@ -8215,20 +8215,8 @@ static int status_resync(struct seq_file *seq, struct mddev *mddev) 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 =3D atomic_read(&md_event_count); - spin_lock(&all_mddevs_lock); - - return seq_list_start(&all_mddevs, *pos); + return seq_list_start_head(&all_mddevs, *pos); } static void *md_seq_next(struct seq_file *seq, void *v, loff_t *pos) @@ -8243,12 +8231,31 @@ static void md_seq_stop(struct seq_file *seq, void = *v) spin_unlock(&all_mddevs_lock); } +static void md_seq_print_header(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"); + seq->poll_event =3D atomic_read(&md_event_count); +} + static int md_seq_show(struct seq_file *seq, void *v) { struct mddev *mddev =3D list_entry(v, struct mddev, all_mddevs); sector_t sectors; struct md_rdev *rdev; + if (v =3D=3D &all_mddevs) { + md_seq_print_header(seq); + return 0; + } + if (!mddev_get(mddev)) return 0;