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

Re: [Xen-devel] [PATCH v2] xen/SandyBridge: reserve pages when integrated graphics


  • To: Xudong Hao <xudong.hao@xxxxxxxxx>, <xen-devel@xxxxxxxxxxxxx>
  • From: Keir Fraser <keir.xen@xxxxxxxxx>
  • Date: Tue, 26 Mar 2013 11:15:51 +0000
  • Cc: JBeulich@xxxxxxxx
  • Delivery-date: Tue, 26 Mar 2013 11:16:39 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xen.org>
  • Thread-index: Ac4qE0Ym9z3TeVZ8HU69HDxu0p/RTw==
  • Thread-topic: [PATCH v2] xen/SandyBridge: reserve pages when integrated graphics

On 26/03/2013 09:38, "Xudong Hao" <xudong.hao@xxxxxxxxx> wrote:

> SNB graphics devices have a bug that prevent them from accessing certain
> memory ranges, namely anything below 1M and in the pages listed in the
> table.
> 
> Xen does not initialize below 1MB to heap, i.e. below 1MB pages don't be
> allocated, so it's unnecessary to reserve memory below the 1 MB mark
> that has not already been reserved.
> 
> So reserve those pages listed in the table at xen boot if set detect a
> SNB gfx device on the CPU to avoid GPU hangs.
> 
> Changes in v2:
> - using MFNs directly rather than passing a string to parse, suggestion by Jan
>   Beulich
> 
> Signed-off-by: Xudong Hao <xudong.hao@xxxxxxxxx>

Acked-by: Keir Fraser <keir@xxxxxxx>

> ---
>  xen/arch/x86/mm.c                    | 20 ++++++++++++++++++++
>  xen/common/page_alloc.c              | 23 +++++++++++++++++++++++
>  xen/drivers/passthrough/vtd/quirks.c |  2 +-
>  xen/include/asm-x86/mm.h             |  1 +
>  xen/include/asm-x86/pci.h            |  5 +++++
>  5 files changed, 50 insertions(+), 1 deletion(-)
> 
> diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
> index add93ac..ee09b55 100644
> --- a/xen/arch/x86/mm.c
> +++ b/xen/arch/x86/mm.c
> @@ -121,6 +121,7 @@
>  #include <xen/trace.h>
>  #include <asm/setup.h>
>  #include <asm/fixmap.h>
> +#include <asm/pci.h>
>  
>  /* Mapping of the fixmap space needed early. */
>  l1_pgentry_t __attribute__ ((__section__ (".bss.page_aligned")))
> @@ -5597,6 +5598,25 @@ void arch_dump_shared_mem_info(void)
>              mem_sharing_get_nr_saved_mfns());
>  }
>  
> +unsigned long *__init get_platform_badpages(int *array_size)
> +{
> +    u32 igd_id;
> +    static unsigned long __initdata bad_pages[] = {
> +        0x20050000,
> +        0x20110000,
> +        0x20130000,
> +        0x20138000,
> +        0x40004000,
> +    };
> +
> +    *array_size = ARRAY_SIZE(bad_pages);
> +    igd_id = pci_conf_read32(0, 0, 2, 0, 0);
> +    if (!IS_SNB_GFX(igd_id))
> +        return NULL;
> +
> +    return bad_pages;
> +}
> +
>  /*
>   * Local variables:
>   * mode: C
> diff --git a/xen/common/page_alloc.c b/xen/common/page_alloc.c
> index 9e9fb15..45ba327 100644
> --- a/xen/common/page_alloc.c
> +++ b/xen/common/page_alloc.c
> @@ -152,6 +152,10 @@ void __init init_boot_pages(paddr_t ps, paddr_t pe)
>  {
>      unsigned long bad_spfn, bad_epfn;
>      const char *p;
> +#ifdef CONFIG_X86
> +    unsigned long *badpage = NULL;
> +    int i, array_size;
> +#endif
>  
>      ps = round_pgup(ps);
>      pe = round_pgdown(pe);
> @@ -162,6 +166,25 @@ void __init init_boot_pages(paddr_t ps, paddr_t pe)
>  
>      bootmem_region_add(ps >> PAGE_SHIFT, pe >> PAGE_SHIFT);
>  
> +#ifdef CONFIG_X86
> +    /* 
> +     * Here we put platform-specific memory range workarounds, i.e.
> +     * memory known to be corrupt or otherwise in need to be reserved on
> +     * specific platforms.
> +     * We get these certain pages and remove them from memory region list.
> +     */
> +    badpage = get_platform_badpages(&array_size);
> +    if ( badpage )
> +    {
> +        for ( i = 0; i < array_size; i++ )
> +        {
> +            bootmem_region_zap(*badpage >> PAGE_SHIFT,
> +                               (*badpage >> PAGE_SHIFT) + 1);
> +            badpage++;
> +        }
> +    }
> +#endif
> +
>      /* Check new pages against the bad-page list. */
>      p = opt_badpage;
>      while ( *p != '\0' )
> diff --git a/xen/drivers/passthrough/vtd/quirks.c
> b/xen/drivers/passthrough/vtd/quirks.c
> index d79a155..70d57de 100644
> --- a/xen/drivers/passthrough/vtd/quirks.c
> +++ b/xen/drivers/passthrough/vtd/quirks.c
> @@ -31,6 +31,7 @@
>  #include <xen/keyhandler.h>
>  #include <asm/msi.h>
>  #include <asm/irq.h>
> +#include <asm/pci.h>
>  #include <mach_apic.h>
>  #include "iommu.h"
>  #include "dmar.h"
> @@ -47,7 +48,6 @@
>  #define IS_CTG(id)    (id == 0x2a408086)
>  #define IS_ILK(id)    (id == 0x00408086 || id == 0x00448086 || id==
> 0x00628086 || id == 0x006A8086)
>  #define IS_CPT(id)    (id == 0x01008086 || id == 0x01048086)
> -#define IS_SNB_GFX(id) (id == 0x01068086 || id == 0x01168086 || id ==
> 0x01268086 || id == 0x01028086 || id == 0x01128086 || id == 0x01228086 || id
> == 0x010A8086)
>  
>  static u32 __read_mostly ioh_id;
>  static u32 __initdata igd_id;
> diff --git a/xen/include/asm-x86/mm.h b/xen/include/asm-x86/mm.h
> index 4f89dae..8328893 100644
> --- a/xen/include/asm-x86/mm.h
> +++ b/xen/include/asm-x86/mm.h
> @@ -322,6 +322,7 @@ int is_iomem_page(unsigned long mfn);
>  
>  void clear_superpage_mark(struct page_info *page);
>  
> +unsigned long *get_platform_badpages(int *array_size);
>  /* Per page locks:
>   * page_lock() is used for two purposes: pte serialization, and memory
> sharing.
>   *
> diff --git a/xen/include/asm-x86/pci.h b/xen/include/asm-x86/pci.h
> index 7bcb702..e0598fd 100644
> --- a/xen/include/asm-x86/pci.h
> +++ b/xen/include/asm-x86/pci.h
> @@ -1,6 +1,11 @@
>  #ifndef __X86_PCI_H__
>  #define __X86_PCI_H__
>  
> +#define IS_SNB_GFX(id) (id == 0x01068086 || id == 0x01168086 \
> +                        || id == 0x01268086 || id == 0x01028086 \
> +                        || id == 0x01128086 || id == 0x01228086 \
> +                        || id == 0x010A8086 )
> +
>  struct arch_pci_dev {
>      vmask_t used_vectors;
>  };



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