On Wed, Jun 07, 2017 at 11:52:10AM +0100, Marc Zyngier wrote: > On 07/06/17 00:00, Palmer Dabbelt wrote: > > +static void plic_disable(struct plic_data *data, int i, int hwirq) > > +{ > > + struct plic_enable_context *enable = plic_enable_context(data, i); > > + > > + atomic_and(~(1 << (hwirq % 32)), &enable->mask[hwirq / 32]); > > This is still a device access, right? What does it mean to use the > atomic primitives on that? What are you racing against? I thought the > various context were private to an execution context... > > Adding Will and PeterZ to the CC list because they will probably have > their own views on this... atomic_* accesses to MMIO is almost certainly a bad idea. Is this atomic because you want to allow the function to run concurrently, or is it atomic because you want some guarantees from the endpoint's view? Will