[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 1/1 V3] x86/AMD-Vi: Add additional check for invalid special->handle
>>> On 12.09.13 at 19:00, <suravee.suthikulpanit@xxxxxxx> wrote: > --- a/xen/drivers/passthrough/amd/iommu_acpi.c > +++ b/xen/drivers/passthrough/amd/iommu_acpi.c > @@ -664,19 +664,46 @@ static void __init parse_ivrs_hpet(char *str) > > ASSERT(*s == '['); > id = simple_strtoul(s + 1, &s, 0); > - if ( id != (typeof(hpet_sbdf.id))id || *s != ']' || *++s != '=' ) > + if ( (*s != ']') || (*++s != '=') ) No, unless you have a very good reason. > return; > > s = parse_pci(s + 1, &seg, &bus, &dev, &func); > if ( !s || *s ) > return; > > + hpet_sbdf.id = id; In essence this is the only change not contained in the patch I sent. So I'd be inclined to commit this (and perhaps the one debug message adjustment below) under your name, and my proposed change as a separate one. > hpet_sbdf.bdf = PCI_BDF(bus, dev, func); > hpet_sbdf.seg = seg; > hpet_sbdf.cmdline = 1; > } > custom_param("ivrs_hpet[", parse_ivrs_hpet); > > +static bool_t is_ioapic_overidden(u16 seg, u16 bdf, u8 handle) Missing __init annotation. And anyway, I can't really see why putting this in a separate function is a significant benefit. It's only being used in one place afaics. > +{ > + bool_t ret = 0; > + int apic = find_first_bit(ioapic_cmdline, ARRAY_SIZE(ioapic_sbdf)); > + > + while ( apic < ARRAY_SIZE(ioapic_sbdf) ) > + { > + if ( ioapic_sbdf[apic].bdf == bdf && > + ioapic_sbdf[apic].seg == seg ) > + break; > + apic = find_next_bit(ioapic_cmdline, ARRAY_SIZE(ioapic_sbdf), > + apic + 1); > + } > + > + if ( apic < ARRAY_SIZE(ioapic_sbdf) ) > + { > + AMD_IOMMU_DEBUG("IVHD: Command line override present for IO-APIC %#x > " > + "(IVRS: %#x devID %04x:%02x:%02x.%u)\n", > + apic, handle, seg, PCI_BUS(bdf), > + PCI_SLOT(bdf), PCI_FUNC(bdf)); > + ret = 1; > + } > + > + return ret; > +} > + > static u16 __init parse_ivhd_device_special( > const struct acpi_ivrs_device8c *special, u16 seg, > u16 header_length, u16 block_length, struct amd_iommu *iommu) > @@ -698,16 +725,18 @@ static u16 __init parse_ivhd_device_special( > return 0; > } > > - AMD_IOMMU_DEBUG("IVHD Special: %04x:%02x:%02x.%u variety %#x handle > %#x\n", > + AMD_IOMMU_DEBUG("IVHD Special: %04x:%02x:%02x.%u variety %#x handle %#x > used_id %#x\n", > seg, PCI_BUS(bdf), PCI_SLOT(bdf), PCI_FUNC(bdf), > - special->variety, special->handle); > + special->variety, special->handle, special->used_id); > add_ivrs_mapping_entry(bdf, bdf, special->header.data_setting, iommu); > > switch ( special->variety ) > { > case ACPI_IVHD_IOAPIC: > - if ( !iommu_intremap ) > + if ( !iommu_intremap || > + is_ioapic_overidden(seg, bdf, special->handle) ) > break; > + > /* > * Some BIOSes have IOAPIC broken entries so we check for IVRS > * consistency here --- whether entry's IOAPIC ID is valid and > @@ -725,10 +754,7 @@ static u16 __init parse_ivhd_device_special( > return 0; > } > > - if ( test_bit(special->handle, ioapic_cmdline) ) > - AMD_IOMMU_DEBUG("IVHD: Command line override present for > IO-APIC %#x\n", > - special->handle); > - else if ( ioapic_sbdf[special->handle].pin_2_idx ) > + if ( ioapic_sbdf[special->handle].pin_2_idx ) Again - no, unless you have a very good reason. > { > if ( ioapic_sbdf[special->handle].bdf == bdf && > ioapic_sbdf[special->handle].seg == seg ) > @@ -770,6 +796,16 @@ static u16 __init parse_ivhd_device_special( > } > break; > case ACPI_IVHD_HPET: > + if ( hpet_sbdf.cmdline ) > + { > + AMD_IOMMU_DEBUG("IVHD: Command line override present for HPET > %#x " > + "(IVRS: %#x devID %04x:%02x:%02x.%u)\n", > + hpet_sbdf.id, special->handle, seg, PCI_BUS(bdf), > + PCI_SLOT(bdf), PCI_FUNC(bdf)); > + hpet_sbdf.iommu = iommu; > + break; > + } > + > /* set device id of hpet */ > if ( hpet_sbdf.iommu || > (hpet_sbdf.cmdline && hpet_sbdf.id != special->handle) ) > @@ -777,12 +813,10 @@ static u16 __init parse_ivhd_device_special( > printk(XENLOG_WARNING "Only one IVHD HPET entry is supported\n"); > break; > } > + > hpet_sbdf.id = special->handle; > - if ( !hpet_sbdf.cmdline ) > - { > - hpet_sbdf.bdf = bdf; > - hpet_sbdf.seg = seg; > - } > + hpet_sbdf.bdf = bdf; > + hpet_sbdf.seg = seg; I don't see what benefit these HPET related changes provide. Or if there is any that I overlook, then the previous uses of hpet_sbdf.cmdline should all be eliminated. Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |