[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH for-4.6 2/4] xen/arm: vgic: Keep track of vIRQ used by a domain



On Tue, 2015-01-13 at 16:27 +0000, Julien Grall wrote:
> Hi Ian,
> 
> On 13/01/15 15:51, Ian Campbell wrote:
> > On Fri, 2014-12-12 at 14:43 +0000, Julien Grall wrote:
> >> While it's easy to know which hardware IRQ is assigned to a domain, there
> >> is no way to know which IRQ is emulated by Xen for a specific domain.
> > 
> > It seems you are tracking all valid interrupts, including hardware ones,
> > not just those for emulated devices? Perhaps rather than emulated you
> > meant "allocated to the guest" or "routed" or something?
> > 
> >> Introduce a bitmap to keep track of every vIRQ used by a domain. This
> >> will be used later to find free vIRQ for interrupt device assignment and
> >> emulated interrupt.
> > 
> > Actually, don't you implement the alloc/free of vIRQs here too?
> 
> Yes.
> 
> > Is there a usecase for tracking SPIs in this way, or would tracking PPIs
> > only be sufficient?
> 
> We need to track everything for interrupt assignment to a guest/dom0. So
> if the guest ask for a free vIRQ we can give it directly.

Makes sense.

In that case you 0/4 mail doesn't fully describe the use case for the
series, since it talks about the dom0 PPI only.
> > 
> >> +    if ( !d->arch.vgic.allocated_irqs )
> >> +        return -ENOMEM;
> >> +
> >> +    /* vIRQ0-15 (SGIs) are reserved */
> >> +    for (i = 0; i <= 15; i++)
> >> +        set_bit(i, d->arch.vgic.allocated_irqs);
> >> +
> >>      return 0;
> >>  }
> >>  
> >> @@ -119,6 +130,7 @@ void domain_vgic_free(struct domain *d)
> >>  {
> >>      xfree(d->arch.vgic.shared_irqs);
> >>      xfree(d->arch.vgic.pending_irqs);
> >> +    xfree(d->arch.vgic.allocated_irqs);
> >>  }
> >>  
> >>  int vcpu_vgic_init(struct vcpu *v)
> >> @@ -441,6 +453,70 @@ int vgic_emulate(struct cpu_user_regs *regs, union 
> >> hsr hsr)
> >>      return v->domain->arch.vgic.handler->emulate_sysreg(regs, hsr);
> >>  }
> >>  
> >> +bool_t vgic_reserve_virq(struct domain *d, unsigned int virq)
> >> +{
> >> +    bool_t reserved;
> >> +
> >> +    if ( virq >= vgic_num_irqs(d) )
> >> +        return 0;
> > 
> > EINVAL?
> 
> vgic_reserve_irq returns a boolean:

Please use true/false then.

In Xen we have xen/stdbool.h which differs from normal stdboot.h. I'm
not sure what the rules are for use.

>       0 => not reserved
>       1 => reserved
> 
> I don't see why we should return an int in this case, as the caller
> should know how to use it.

It's slightly more conventional to return error codes, but I guess I
don't mind much.

> >> @@ -49,6 +49,21 @@ int domain_vtimer_init(struct domain *d)
> >>  {
> >>      d->arch.phys_timer_base.offset = NOW();
> >>      d->arch.virt_timer_base.offset = READ_SYSREG64(CNTPCT_EL0);
> >> +
> >> +    /* At this stage vgic_reserve_virq can't fail */
> >> +    if ( is_hardware_domain(d) )
> >> +    {
> >> +        BUG_ON(!vgic_reserve_virq(d, 
> >> timer_get_irq(TIMER_PHYS_SECURE_PPI)));
> >> +        BUG_ON(!vgic_reserve_virq(d, 
> >> timer_get_irq(TIMER_PHYS_NONSECURE_PPI)));
> >> +        BUG_ON(!vgic_reserve_virq(d, timer_get_irq(TIMER_VIRT_PPI)));
> >> +    }
> >> +    else
> >> +    {
> >> +        BUG_ON(!vgic_reserve_virq(d, GUEST_TIMER_PHYS_S_PPI));
> >> +        BUG_ON(!vgic_reserve_virq(d, GUEST_TIMER_PHYS_NS_PPI));
> >> +        BUG_ON(!vgic_reserve_virq(d, GUEST_TIMER_VIRT_PPI));
> > 
> > Although BUG_ON is not conditional on $debug I think we still should
> > avoid side effects in the condition.
> 
> I know, but this should never fail as it called during on domain
> construction. If so we may have some other issue later if we decide to
> assign PPI to a guest.
> 
> I would prefer to keep the BUG_ON here

I'm not objecting the the BUG_ON itself but to the fact that the
condition has a side effect. Please use:
        if (!do_something())
                BUG()
instead to avoid this.

Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.