]> rtime.felk.cvut.cz Git - zynq/linux.git/blobdiff - drivers/md/raid5.c
Merge branch '4.0.8-rt6'
[zynq/linux.git] / drivers / md / raid5.c
index 007ab861eca00365d89c08c69741c84f58a02510..c2f73936baa00b6f52394affb645fc277f18afdb 100644 (file)
@@ -1646,8 +1646,9 @@ static void raid_run_ops(struct stripe_head *sh, unsigned long ops_request)
        struct raid5_percpu *percpu;
        unsigned long cpu;
 
-       cpu = get_cpu();
+       cpu = get_cpu_light();
        percpu = per_cpu_ptr(conf->percpu, cpu);
+       spin_lock(&percpu->lock);
        if (test_bit(STRIPE_OP_BIOFILL, &ops_request)) {
                ops_run_biofill(sh);
                overlap_clear++;
@@ -1699,7 +1700,8 @@ static void raid_run_ops(struct stripe_head *sh, unsigned long ops_request)
                        if (test_and_clear_bit(R5_Overlap, &dev->flags))
                                wake_up(&sh->raid_conf->wait_for_overlap);
                }
-       put_cpu();
+       spin_unlock(&percpu->lock);
+       put_cpu_light();
 }
 
 static int grow_one_stripe(struct r5conf *conf, int hash)
@@ -5802,6 +5804,7 @@ static int raid5_alloc_percpu(struct r5conf *conf)
                               __func__, cpu);
                        break;
                }
+               spin_lock_init(&per_cpu_ptr(conf->percpu, cpu)->lock);
        }
        put_online_cpus();