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

Re: [Xen-devel] [PATCH 1 of 1] Intel VT-D: Don't turn x2APIC if there is a missing DRHD entry for the IOAPIC



On Wed, Mar 10, 2010 at 11:04:39PM -0700, Alex Williamson wrote:
> On Tue, 2010-03-09 at 12:04 -0500, Konrad Rzeszutek Wilk wrote:
> > # HG changeset patch
> > # User Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx>
> > # Date 1268154140 18000
> > # Node ID 81272f761f631d3c0929642fc833b66243b7d2bc
> > # Parent  b8d2a4134a6823f6d5179928a0618eaf33be4684
> > Intel VT-D: Don't turn x2APIC if there is a missing DRHD entry for the 
> > IOAPIC.
> > 
> > Follow the Linux kernel lead in which the x2APIC is
> > only turned on only if there is an DRHD entry for all
> > IOAPICs in the system. If we don't do this
> > we might enable x2APIC and see various devices not covered by the
> > IOAPIC mentioned in DRHD, not receive any interrupts.
> > 
> > Workaround is to use 'x2apic=0' on command line.
> > 
> > diff -r b8d2a4134a68 -r 81272f761f63 xen/drivers/passthrough/vtd/intremap.c
> > --- a/xen/drivers/passthrough/vtd/intremap.c        Wed Mar 03 17:41:58 
> > 2010 +0000
> > +++ b/xen/drivers/passthrough/vtd/intremap.c        Tue Mar 09 12:02:20 
> > 2010 -0500
> > @@ -127,10 +127,17 @@
> >  int iommu_supports_eim(void)
> >  {
> >      struct acpi_drhd_unit *drhd;
> > +    int apic;
> >  
> >      if ( !iommu_enabled || !iommu_qinval || !iommu_intremap )
> >          return 0;
> >  
> > +    // We MUST have a DRHD unit for each IOAPIC.
> > +    for ( apic = 0; apic < nr_ioapics; apic++ )
> > +    {
> > +       if ( ioapic_to_iommu(IO_APIC_ID(apic)) == NULL )
> 
> 
> This has a pretty serious bug.  ioapic_to_iommu() gets returned
> drhd->iommu.  However, drhd->iommu isn't allocated until part of

Yikes!

> iommu_setup(), which is called after enable_x2apic().  Has this ever
> worked?  Here's the fix.

Yes. But I only have faulty hardware (ie, the is one IOAPIC in the DRHD,
and three existing IOAPICS), so I couldn't test it on working hardware.

Thank you for spotting this mistake and coming to resuce with a proper
patch.

Much appreciated.
> 
> Signed-off-by: Alex Williamson <alex.williamson@xxxxxx>
> --
> 
> diff -r 132ac04cbdba xen/drivers/passthrough/vtd/intremap.c
> --- a/xen/drivers/passthrough/vtd/intremap.c  Tue Mar 09 18:18:19 2010 +0000
> +++ b/xen/drivers/passthrough/vtd/intremap.c  Wed Mar 10 22:58:08 2010 -0700
> @@ -134,7 +134,7 @@
>  
>      /* We MUST have a DRHD unit for each IOAPIC. */
>      for ( apic = 0; apic < nr_ioapics; apic++ )
> -        if ( !ioapic_to_iommu(IO_APIC_ID(apic)) )
> +        if ( !ioapic_to_drhd(IO_APIC_ID(apic)) )
>              return 0;
>  
>      if ( list_empty(&acpi_drhd_units) )
> 

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

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