> > diff --git a/drivers/nvdimm/region_devs.c b/drivers/nvdimm/region_devs.c > > index 63cb01ef4ef0..0eecc8670f80 100644 > > --- a/drivers/nvdimm/region_devs.c > > +++ b/drivers/nvdimm/region_devs.c > > @@ -926,18 +926,15 @@ int nd_blk_region_init(struct nd_region *nd_region) > > unsigned int nd_region_acquire_lane(struct nd_region *nd_region) { > > unsigned int cpu, lane; > > + struct nd_percpu_lane *ndl_lock, *ndl_count; > > > > - cpu = get_cpu(); > > - if (nd_region->num_lanes < nr_cpu_ids) { > > - struct nd_percpu_lane *ndl_lock, *ndl_count; > > + cpu = get_cpu_light(); > > what is wrong with using raw_smp_processor_id() instead of get_cpu()? In > case the schedulers pushes the task to another CPU the it will access > cross-CPU data which is locked. > > > > > - lane = cpu % nd_region->num_lanes; > > - ndl_count = per_cpu_ptr(nd_region->lane, cpu); > > - ndl_lock = per_cpu_ptr(nd_region->lane, lane); > > - if (ndl_count->count++ == 0) Wouldn't there is chance of race with both get_cpu_light() & raw_smp_processor_id()? Maybe I am wrong. Thanks, Pankaj > > - spin_lock(&ndl_lock->lock); > > - } else > > - lane = cpu; > > + lane = cpu % nd_region->num_lanes; > > + ndl_count = per_cpu_ptr(nd_region->lane, cpu); > > + ndl_lock = per_cpu_ptr(nd_region->lane, lane); > > + if (ndl_count->count++ == 0) > > + spin_lock(&ndl_lock->lock); > > > > return lane; > > } > > Sebastian >