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

Re: [Xen-devel] [PATCH for-4.9 v4 1/2] x86/vioapic: introduce support for multiple vIO APICS



On Wed, Apr 05, 2017 at 08:10:35AM -0600, Jan Beulich wrote:
> >>> On 05.04.17 at 11:23, <roger.pau@xxxxxxxxxx> wrote:
> > +static unsigned int base_gsi(const struct domain *d,
> > +                             const struct hvm_vioapic *vioapic)
> > +{
> > +    unsigned int nr_vioapics = d->arch.hvm_domain.nr_vioapics;
> > +    unsigned int base_gsi = 0, i = 0;
> > +    const struct hvm_vioapic *tmp;
> > +
> > +    while ( --nr_vioapics && (tmp = domain_vioapic(d, i++)) != vioapic )
> > +        base_gsi += tmp->nr_pins;
> 
> While for valid input it should be benign, I think the first part of the
> condition would better use post-decrement (or "i < nr_vioapics").

i < nr_vioapic seems like the best option to me.

> That way you'll return an out of range GSI for a not found vioapic
> input.

Right, with the current code it would return a valid looking base_gsi.

> > @@ -454,32 +523,68 @@ HVM_REGISTER_SAVE_RESTORE(IOAPIC, ioapic_save, 
> > ioapic_load, 1, HVMSR_PER_DOM);
> >  
> >  void vioapic_reset(struct domain *d)
> >  {
> > -    struct hvm_vioapic *vioapic = domain_vioapic(d);
> > -    uint32_t nr_pins = vioapic->nr_pins;
> > -    int i;
> > +    unsigned int i;
> >  
> >      if ( !has_vioapic(d) )
> > +    {
> > +        ASSERT(!d->arch.hvm_domain.nr_vioapics);
> >          return;
> > +    }
> >  
> > -    memset(vioapic, 0, hvm_vioapic_size(nr_pins));
> > -    vioapic->domain = d;
> > -    vioapic->nr_pins = nr_pins;
> > -    for ( i = 0; i < nr_pins; i++ )
> > -        vioapic->redirtbl[i].fields.mask = 1;
> > -    vioapic->base_address = VIOAPIC_DEFAULT_BASE_ADDRESS;
> > +    for ( i = 0; i < d->arch.hvm_domain.nr_vioapics; i++ )
> > +    {
> > +        struct hvm_vioapic *vioapic = domain_vioapic(d, i);
> > +        unsigned int pin, nr_pins = vioapic->nr_pins;
> > +
> > +        memset(vioapic, 0, hvm_vioapic_size(nr_pins));
> > +        for ( pin = 0; pin < nr_pins; pin++ )
> > +            vioapic->redirtbl[pin].fields.mask = 1;
> > +        ASSERT(!i);
> > +        vioapic->base_address = VIOAPIC_DEFAULT_BASE_ADDRESS +
> > +                                VIOAPIC_MEM_LENGTH * 0;
> 
> Why not simply
> 
>         vioapic->base_address = VIOAPIC_DEFAULT_BASE_ADDRESS;
> 
> ?

Sight, yes please.

> With these taken care of (which can be done while committing, if you
> agree)
> Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx>

Thanks, Roger.

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

 


Rackspace

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