|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v9 10/10] xen/arm: make accesses to desc->status flags atomic
On Fri, 25 Jul 2014, Julien Grall wrote:
> Hi Stefano,
>
> On 07/24/2014 06:33 PM, Stefano Stabellini wrote:
> > Using *_bit manipulation functions on desc->status is safe on arm64:
> > status is an unsigned int but is the first field of a struct that
> > contains pointers, therefore the alignement of the struct is at least 8
> > bytes.
>
> I would add a comment in the structure irq_desc in include/common/irq.h.
> To explain this assumption.
>
> It would avoid people breaking the structure by mistake in the future.
I can do that
> Also I would explain a bit more why we need to use atomic while most of
> the access are protected by desc->lock.
OK
> [..]
>
> > diff --git a/xen/arch/arm/irq.c b/xen/arch/arm/irq.c
> > index 7150c7a..0097349 100644
> > --- a/xen/arch/arm/irq.c
> > +++ b/xen/arch/arm/irq.c
> > @@ -126,7 +126,7 @@ static inline struct domain *irq_get_domain(struct
> > irq_desc *desc)
> > {
> > ASSERT(spin_is_locked(&desc->lock));
> >
> > - if ( !(desc->status & IRQ_GUEST) )
> > + if ( !test_bit(_IRQ_GUEST, &desc->status) )
> > return dom_xen;
> >
> > ASSERT(desc->action != NULL);
> > @@ -195,13 +195,13 @@ void do_IRQ(struct cpu_user_regs *regs, unsigned int
> > irq, int is_fiq)
> > goto out;
> > }
> >
> > - if ( desc->status & IRQ_GUEST )
> > + if ( test_bit(_IRQ_GUEST, &desc->status) )
> > {
> > struct domain *d = irq_get_domain(desc);
> >
> > desc->handler->end(desc);
> >
> > - desc->status |= IRQ_INPROGRESS;
> > + set_bit(_IRQ_INPROGRESS, &desc->status);
> > desc->arch.eoi_cpu = smp_processor_id();
> >
> > /* the irq cannot be a PPI, we only support delivery of SPIs to
> > @@ -210,22 +210,23 @@ void do_IRQ(struct cpu_user_regs *regs, unsigned int
> > irq, int is_fiq)
> > goto out_no_end;
> > }
> >
> > - desc->status |= IRQ_PENDING;
> > + set_bit(_IRQ_PENDING, &desc->status);
> >
> > /*
> > * Since we set PENDING, if another processor is handling a different
> > * instance of this same irq, the other processor will take care of it.
> > */
> > - if ( desc->status & (IRQ_DISABLED | IRQ_INPROGRESS) )
> > + if ( test_bit(_IRQ_DISABLED, &desc->status) ||
> > + test_bit(_IRQ_INPROGRESS, &desc->status) )
>
> You replaced 1 access to desc->status by 2 accesses. I think it may have
> a race condition when the desc->lock it's not taken (such as in
> gic_update_one_lr).
It wasn't guaranteed to be atomic before either.
> At the same time, this will never happen as a guest IRQ will never
> execute this code.
>
> If it happens for IRQ routed to Xen, the interrupt will be EOIed and
> fire again as soon as we leave the IRQ exception mode.
>
> So I think we are fine for now.
I think so too.
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |