Re: [PATCH RESEND] mfd: mc13xxx: Remove unneeded mc13xxx_lock/unlock

From: Philippe Rétornaz
Date: Mon Dec 02 2013 - 04:51:10 EST


Le 30/11/2013 06:01, Alexander Shiyan a écrit :
Locking is performed by regmap API so no additional locking is
needed. Nevertheless, keep locking in the ADC conversion routine.
This need for keep proper read ADC sequence when calling from adc &
touchscreen drivers.

You can't do that so easily !
Regmap only protect against concurrent access to the SPI/I2C bus, but do
not protect the driver's internal data.
And it does not protect against a race between concurrent access at a
higher level :

reg = regmap_read();
(modify reg)
regmap_write(reg);

And we do have such behavior:
* The mc13xxx->irqhandler/irqdata array is
protected by this mutex.

* And we also have non-atomic RMW in mc13xxx_irq_unmask():

ret = mc13xxx_reg_read(mc13xxx, offmask, &mask);
if (ret)
return ret;
if (!(mask & irqbit))
return 0;
return mc13xxx_reg_write(mc13xxx, offmask, mask & ~irqbit);

It's OK to do this if you are protected by a mutex, but as soon as you
remove it you will have concurrency between two irq_unmask/irq_mask.

So you can remove the lock from trivial function like:
mc13xxx_lock(led->master);
mc13xxx_reg_rmw(led->master, reg, mask << shift, value << shift);
mc13xxx_unlock(led->master);

Which protect only a single access to regmap.

But we need to keep it for more complex behavior.

Regards,

Philippe
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/