> > > > + if (ufshpb_mode == HPB_HOST_CONTROL) > > + reads = atomic64_inc_return(&rgn->reads); > > + > > if (!ufshpb_is_support_chunk(transfer_len)) > > return; > > > > + if (ufshpb_mode == HPB_HOST_CONTROL) { > > + /* > > + * in host control mode, reads are the main source for > > + * activation trials. > > + */ > > + if (reads == ACTIVATION_THRSHLD) { Oops - this is a bug... > > + > > + /* region reads - for host mode */ > > + atomic64_t reads; > > Why do you need an atomic variable for this? What are you trying to > "protect" here by flushing the cpus all the time? What protects this > variable from changing right after you have read from it (hint, you do > that above...) > > atomics are not race-free, use a real lock if you need that. We are on the data path here - this is called from queuecommand. The "reads" counter is being symmetrically read and written, so adding a spin lock here might become a source for contention. Also I am not worried about the exact value of this counter, except of one place - See above. Will fix it. Thanks, Avri