Re: NVDIMM: make it RT aware

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




> > 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
> 



[Index of Archives]     [RT Stable]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]

  Powered by Linux