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

Re: [Xen-devel] [PATCH 1/1] keep iommu disabled until iommu_setup is called



>>> On 18.10.12 at 02:49, Ronny Hegewald <ronny.hegewald@xxxxxxxxx> wrote:
> The iommu is enabled by default when xen is booting and later disabled in 
> iommu_setup() when no iommu is present.
> 
> But under some circumstances iommu-code can be called before iommu_setup() is 
> 
> processed. If there is no iommu available xen crashes.
> 
> This can happen for example when panic(...) is called that got introduced 
> with
> patch "x86-64: detect processors subject to AMD erratum #121 and refuse to 
> boot." since xen 4.1.3 and results in the following stacktrace:
> 
>    find_iommu_for_device
>    amd_iommu_ioapic_update_ire
>    timer_interrupt
>    enable_8259_A_irq
>    do_IRQ
>    printk_start_of_line
>    acpi_os_printf
>    io_apic_write
>    __ioapic_write_entry
>    ioapic_write_entry
>    __clear_IO_APIC_pin
>    clear_IO_APIC
>    disable_IO_APIC
>    __stop_this_cpu
>    smp_send_stop
>    machine_restart
>    panic
>    tasklet_schedule_on_cpu
>    display_cacheinfo
>    init_amd
>    generic_identify
>    identify_cpu
>    _start_xen
>    _high_start
> 
> 
> This patch fixes this by keeping the iommu disabled until iommu_setup() is 
> entered. 

The concept is plausible, but I'm not convinced that there aren't
any users of iommu_enabled that actually depend on it having
its final value after command line parsing, yet before
iommu_setup() gets called. Did you fully audit all users?

As to the patch itself, ...

> Signed-off-by: Ronny Hegewald@xxxxxxxxx 
> 
> --- xen/drivers/passthrough/iommu.c.org       2012-10-05 03:38:33.000000000 
> +0000
> +++ xen/drivers/passthrough/iommu.c   2012-10-17 22:58:07.000000000 +0000
> @@ -38,7 +38,7 @@
>   *   no-intremap                Disable VT-d Interrupt Remapping
>   */
>  custom_param("iommu", parse_iommu_param);
> -bool_t __read_mostly iommu_enabled = 1;
> +bool_t __read_mostly iommu_enabled = 0;

No initializer needed.

>  bool_t __read_mostly force_iommu;
>  bool_t __initdata iommu_dom0_strict;
>  bool_t __read_mostly iommu_verbose;
> @@ -51,6 +51,8 @@
>  bool_t __read_mostly amd_iommu_debug;
>  bool_t __read_mostly amd_iommu_perdev_intremap;
>  
> +bool_t iommu_enabled_default = 1;

__initdata. Also better placed alongside iommu_enabled (see
below for the naming).

> +
>  static void __init parse_iommu_param(char *s)
>  {
>      char *ss;
> @@ -61,7 +63,7 @@
>              *ss = '\0';
>  
>          if ( !parse_bool(s) )
> -            iommu_enabled = 0;
> +            iommu_enabled_default = 0;
>          else if ( !strcmp(s, "force") || !strcmp(s, "required") )
>              force_iommu = 1;
>          else if ( !strcmp(s, "workaround_bios_bug") )
> @@ -312,6 +314,7 @@
>  {
>      int rc = -ENODEV;
>      bool_t force_intremap = force_iommu && iommu_intremap;
> +    iommu_enabled = iommu_enabled_default;

Misplaced and pointless - just make the subsequent conditional
check the new variable instead of iommu_enabled (making quite
obvious that the chosen name is somewhat odd - iommu_enable
would probably be better).

Jan

>  
>      if ( iommu_dom0_strict )
>          iommu_passthrough = 0;
> 
> 
> 
> 
> 
> 
> 
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxx 
> http://lists.xen.org/xen-devel 




_______________________________________________
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®.