Re: [patch 2/2 v3]raid5: create multiple threads to handle stripes
From: NeilBrown <hidden>
Date: 2012-09-26 01:26:51
On Mon, 24 Sep 2012 19:15:12 +0800 "Jianpeng Ma" [off-list ref] 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:quoted
quoted
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
quoted hunk ↗ jump to hunk
Signed-off-by: Jianpeng Ma <redacted> --- 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);
Attachments
- signature.asc [application/pgp-signature] 828 bytes