On Tue, Oct 11, 2022 at 04:35:44PM +0800, Yu Kuai wrote: > From: Yu Kuai <yukuai3@xxxxxxxxxx> > > ioc_qos_write() and ioc_cost_model_write() are the same: > > 1) hold lock to read 'ioc->params' to local variable; > 2) update params to local variable without lock; > 3) hold lock to write local variable to 'ioc->params'; > > In theroy, if user updates params concurrenty, the params might be lost: > > t1: update params a t2: update params b > spin_lock_irq(&ioc->lock); > memcpy(qos, ioc->params.qos, sizeof(qos)) > spin_unlock_irq(&ioc->lock); > > qos[a] = xxx; > > spin_lock_irq(&ioc->lock); > memcpy(qos, ioc->params.qos, sizeof(qos)) > spin_unlock_irq(&ioc->lock); > > qos[b] = xxx; > > spin_lock_irq(&ioc->lock); > memcpy(ioc->params.qos, qos, sizeof(qos)); > ioc_refresh_params(ioc, true); > spin_unlock_irq(&ioc->lock); > > spin_lock_irq(&ioc->lock); > // updates of a will be lost > memcpy(ioc->params.qos, qos, sizeof(qos)); > ioc_refresh_params(ioc, true); > spin_unlock_irq(&ioc->lock); > > Althrough this is not common case, the problem can by fixed easily by > holding the lock through the read, update, write process. > > Signed-off-by: Yu Kuai <yukuai3@xxxxxxxxxx> Acked-by: Tejun Heo <tj@xxxxxxxxxx> Thanks. -- tejun