From: NeilBrown <neilb@suse.de>
To: Jianpeng Ma <majianpeng@gmail.com>
Cc: shli <shli@kernel.org>, linux-raid <linux-raid@vger.kernel.org>
Subject: Re: [patch 2/2 v3]raid5: create multiple threads to handle stripes
Date: Wed, 26 Sep 2012 11:26:51 +1000 [thread overview]
Message-ID: <20120926112651.728e8452@notabene.brown> (raw)
In-Reply-To: <201209241914270784655@gmail.com>
[-- Attachment #1: Type: text/plain, Size: 4874 bytes --]
On Mon, 24 Sep 2012 19:15:12 +0800 "Jianpeng Ma" <majianpeng@gmail.com> wrote:
> Sorry for using this title to send this.
It isn't hard to change the Subject line for the Email, is it?
> This code maybe error,so it should correct(If multiple-thread dosen't enable,it maybe also error,but no obviously).
> In func handle_parity_checks5:
> >>conf->mddev->resync_mismatches += STRIPE_SECTORS;
> If multi-thread handle stripe on different cpu, there will be raced on resync_mismatches.
>
> So the patch is:
>
> Subject: [PATCH] md:change resync_mismatches to atomic64_t to avoid races
I doubt this is really necessary, as resync_mismatches doesn't need to be
precise.
But it doesn't really hurt either, so I've applied it.
Thanks,
NeilBrown
>
> Signed-off-by: Jianpeng Ma <majianpeng@gmail.com>
> ---
> drivers/md/md.c | 7 ++++---
> drivers/md/md.h | 2 +-
> drivers/md/raid1.c | 2 +-
> drivers/md/raid10.c | 2 +-
> drivers/md/raid5.c | 4 ++--
> 5 files changed, 9 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/md/md.c b/drivers/md/md.c
> index 308e87b..b0b9474 100644
> --- a/drivers/md/md.c
> +++ b/drivers/md/md.c
> @@ -4278,7 +4278,8 @@ static ssize_t
> mismatch_cnt_show(struct mddev *mddev, char *page)
> {
> return sprintf(page, "%llu\n",
> - (unsigned long long) mddev->resync_mismatches);
> + (unsigned long long)
> + atomic64_read(&mddev->resync_mismatches));
> }
>
> static struct md_sysfs_entry md_scan_mode =
> @@ -5245,7 +5246,7 @@ static void md_clean(struct mddev *mddev)
> mddev->new_layout = 0;
> mddev->new_chunk_sectors = 0;
> mddev->curr_resync = 0;
> - mddev->resync_mismatches = 0;
> + atomic64_set(&mddev->resync_mismatches, 0);
> mddev->suspend_lo = mddev->suspend_hi = 0;
> mddev->sync_speed_min = mddev->sync_speed_max = 0;
> mddev->recovery = 0;
> @@ -7349,7 +7350,7 @@ void md_do_sync(struct mddev *mddev)
> * which defaults to physical size, but can be virtual size
> */
> max_sectors = mddev->resync_max_sectors;
> - mddev->resync_mismatches = 0;
> + atomic64_set(&mddev->resync_mismatches, 0);
> /* we don't use the checkpoint if there's a bitmap */
> if (test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery))
> j = mddev->resync_min;
> diff --git a/drivers/md/md.h b/drivers/md/md.h
> index f385b03..8f341d8 100644
> --- a/drivers/md/md.h
> +++ b/drivers/md/md.h
> @@ -282,7 +282,7 @@ struct mddev {
>
> sector_t resync_max_sectors; /* may be set by personality */
>
> - sector_t resync_mismatches; /* count of sectors where
> + atomic64_t resync_mismatches; /* count of sectors where
> * parity/replica mismatch found
> */
>
> diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c
> index 611b5f7..ebceb98 100644
> --- a/drivers/md/raid1.c
> +++ b/drivers/md/raid1.c
> @@ -1867,7 +1867,7 @@ static int process_checks(struct r1bio *r1_bio)
> } else
> j = 0;
> if (j >= 0)
> - mddev->resync_mismatches += r1_bio->sectors;
> + atomic64_add(r1_bio->sectors, &mddev->resync_mismatches);
> if (j < 0 || (test_bit(MD_RECOVERY_CHECK, &mddev->recovery)
> && test_bit(BIO_UPTODATE, &sbio->bi_flags))) {
> /* No need to write to this device. */
> diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c
> index 1c2eb38..ad0a8b7 100644
> --- a/drivers/md/raid10.c
> +++ b/drivers/md/raid10.c
> @@ -1950,7 +1950,7 @@ static void sync_request_write(struct mddev *mddev, struct r10bio *r10_bio)
> break;
> if (j == vcnt)
> continue;
> - mddev->resync_mismatches += r10_bio->sectors;
> + atomic64_add(r10_bio->sectors, &mddev->resync_mismatches);
> if (test_bit(MD_RECOVERY_CHECK, &mddev->recovery))
> /* Don't fix anything. */
> continue;
> diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c
> index 7031b86..0a2702f 100644
> --- a/drivers/md/raid5.c
> +++ b/drivers/md/raid5.c
> @@ -2931,7 +2931,7 @@ static void handle_parity_checks5(struct r5conf *conf, struct stripe_head *sh,
> */
> set_bit(STRIPE_INSYNC, &sh->state);
> else {
> - conf->mddev->resync_mismatches += STRIPE_SECTORS;
> + atomic64_add(STRIPE_SECTORS, &conf->mddev->resync_mismatches);
> if (test_bit(MD_RECOVERY_CHECK, &conf->mddev->recovery))
> /* don't try to repair!! */
> set_bit(STRIPE_INSYNC, &sh->state);
> @@ -3083,7 +3083,7 @@ static void handle_parity_checks6(struct r5conf *conf, struct stripe_head *sh,
> */
> }
> } else {
> - conf->mddev->resync_mismatches += STRIPE_SECTORS;
> + atomic64_add(STRIPE_SECTORS, &conf->mddev->resync_mismatches);
> if (test_bit(MD_RECOVERY_CHECK, &conf->mddev->recovery))
> /* don't try to repair!! */
> set_bit(STRIPE_INSYNC, &sh->state);
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 828 bytes --]
next prev parent reply other threads:[~2012-09-26 1:26 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-08-09 8:58 [patch 2/2 v3]raid5: create multiple threads to handle stripes Shaohua Li
2012-08-11 8:45 ` Jianpeng Ma
2012-08-13 0:21 ` Shaohua Li
2012-08-13 1:06 ` Jianpeng Ma
2012-08-13 2:13 ` Shaohua Li
2012-08-13 2:20 ` Shaohua Li
2012-08-13 2:25 ` Jianpeng Ma
2012-08-13 4:21 ` NeilBrown
2012-08-14 10:39 ` Jianpeng Ma
2012-08-15 3:51 ` Shaohua Li
2012-08-15 6:21 ` Jianpeng Ma
2012-08-15 8:04 ` Shaohua Li
2012-08-15 8:19 ` Jianpeng Ma
2012-09-24 11:15 ` Jianpeng Ma
2012-09-26 1:26 ` NeilBrown [this message]
2012-08-13 9:11 ` Jianpeng Ma
2012-08-13 4:29 ` NeilBrown
2012-08-13 6:22 ` Shaohua Li
2013-03-07 7:31 ` Shaohua Li
2013-03-12 1:39 ` NeilBrown
2013-03-13 0:44 ` Stan Hoeppner
2013-03-28 6:47 ` NeilBrown
2013-03-28 16:53 ` Stan Hoeppner
2013-03-29 2:34 ` Shaohua Li
2013-03-29 9:36 ` Stan Hoeppner
2013-04-01 1:57 ` Shaohua Li
2013-04-01 19:31 ` Stan Hoeppner
2013-04-02 0:39 ` Shaohua Li
2013-04-02 3:12 ` Stan Hoeppner
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20120926112651.728e8452@notabene.brown \
--to=neilb@suse.de \
--cc=linux-raid@vger.kernel.org \
--cc=majianpeng@gmail.com \
--cc=shli@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.