On 26/02/15 13:55, Jan Beulich wrote:
> Signed-off-by: Jan Beulich <jbeul...@suse.com>

I believe that this change is incorrect.

>
> --- a/xen/drivers/passthrough/vtd/extern.h
> +++ b/xen/drivers/passthrough/vtd/extern.h
> @@ -67,7 +67,8 @@ unsigned int get_cache_line_size(void);
>  void cacheline_flush(char *);
>  void flush_all_cache(void);
>  
> -u64 alloc_pgtable_maddr(struct acpi_drhd_unit *drhd, unsigned long npages);
> +u64 alloc_pgtable_maddr(struct acpi_drhd_unit *, unsigned int npages,
> +                        struct domain *);
>  void free_pgtable_maddr(u64 maddr);
>  void *map_vtd_domain_page(u64 maddr);
>  void unmap_vtd_domain_page(void *va);
> --- a/xen/drivers/passthrough/vtd/intremap.c
> +++ b/xen/drivers/passthrough/vtd/intremap.c
> @@ -739,7 +739,8 @@ int enable_intremap(struct iommu *iommu,
>      if ( ir_ctrl->iremap_maddr == 0 )
>      {
>          drhd = iommu_to_drhd(iommu);
> -        ir_ctrl->iremap_maddr = alloc_pgtable_maddr(drhd, 
> IREMAP_ARCH_PAGE_NR);
> +        ir_ctrl->iremap_maddr = alloc_pgtable_maddr(drhd, 
> IREMAP_ARCH_PAGE_NR,
> +                                                    NULL);
>          if ( ir_ctrl->iremap_maddr == 0 )
>          {
>              dprintk(XENLOG_WARNING VTDPREFIX,
> --- a/xen/drivers/passthrough/vtd/iommu.c
> +++ b/xen/drivers/passthrough/vtd/iommu.c
> @@ -185,7 +185,8 @@ void iommu_flush_cache_page(void *addr, 
>  }
>  
>  /* Allocate page table, return its machine address */
> -u64 alloc_pgtable_maddr(struct acpi_drhd_unit *drhd, unsigned long npages)
> +u64 alloc_pgtable_maddr(struct acpi_drhd_unit *drhd, unsigned int npages,
> +                        struct domain *d)
>  {
>      struct acpi_rhsa_unit *rhsa;
>      struct page_info *pg, *cur_pg;
> @@ -195,10 +196,10 @@ u64 alloc_pgtable_maddr(struct acpi_drhd
>  
>      rhsa = drhd_to_rhsa(drhd);
>      if ( rhsa )
> -        node =  pxm_to_node(rhsa->proximity_domain);
> +        node = pxm_to_node(rhsa->proximity_domain);
>  
> -    pg = alloc_domheap_pages(NULL, get_order_from_pages(npages),
> -                             (node == NUMA_NO_NODE) ? 0 : MEMF_node(node));
> +    pg = alloc_domheap_pages(d, get_order_from_pages(npages),
> +                             MEMF_node(node) | MEMF_no_owner);
>      if ( !pg )
>          return 0;
>  
> @@ -223,7 +224,7 @@ void free_pgtable_maddr(u64 maddr)
>  }
>  
>  /* context entry handling */
> -static u64 bus_to_context_maddr(struct iommu *iommu, u8 bus)
> +static u64 bus_to_context_maddr(struct iommu *iommu, u8 bus, struct domain 
> *d)
>  {
>      struct acpi_drhd_unit *drhd;
>      struct root_entry *root, *root_entries;
> @@ -235,7 +236,7 @@ static u64 bus_to_context_maddr(struct i
>      if ( !root_present(*root) )
>      {
>          drhd = iommu_to_drhd(iommu);
> -        maddr = alloc_pgtable_maddr(drhd, 1);
> +        maddr = alloc_pgtable_maddr(drhd, 1, d);
>          if ( maddr == 0 )
>          {
>              unmap_vtd_domain_page(root_entries);
> @@ -271,7 +272,9 @@ static u64 addr_to_dma_page_maddr(struct
>           */
>          pdev = pci_get_pdev_by_domain(domain, -1, -1, -1);
>          drhd = acpi_find_matched_drhd_unit(pdev);
> -        if ( !alloc || ((hd->arch.pgd_maddr = alloc_pgtable_maddr(drhd, 1)) 
> == 0) )
> +        if ( !alloc ||
> +             ((hd->arch.pgd_maddr = alloc_pgtable_maddr(drhd, 1,
> +                                                        domain)) == 0) )

This allocation should be based on the proximity information of the
iommu, not of the requesting domain.

>              goto out;
>      }
>  
> @@ -289,7 +292,7 @@ static u64 addr_to_dma_page_maddr(struct
>  
>              pdev = pci_get_pdev_by_domain(domain, -1, -1, -1);
>              drhd = acpi_find_matched_drhd_unit(pdev);
> -            pte_maddr = alloc_pgtable_maddr(drhd, 1);
> +            pte_maddr = alloc_pgtable_maddr(drhd, 1, domain);

As should this.

I don't see a need to extend the prototype of alloc_pgtable_maddr(). 
The drhd parameter contains all relevant information concerning proximity.

~Andrew

>              if ( !pte_maddr )
>                  break;
>  
> @@ -1119,7 +1122,7 @@ int __init iommu_alloc(struct acpi_drhd_
>      iommu->intel->drhd = drhd;
>      drhd->iommu = iommu;
>  
> -    if ( !(iommu->root_maddr = alloc_pgtable_maddr(drhd, 1)) )
> +    if ( !(iommu->root_maddr = alloc_pgtable_maddr(drhd, 1, NULL)) )
>          return -ENOMEM;
>  
>      iommu->reg = ioremap(drhd->address, PAGE_SIZE);
> @@ -1270,7 +1273,7 @@ int domain_context_mapping_one(
>  
>      ASSERT(spin_is_locked(&pcidevs_lock));
>      spin_lock(&iommu->lock);
> -    maddr = bus_to_context_maddr(iommu, bus);
> +    maddr = bus_to_context_maddr(iommu, bus, domain);
>      context_entries = (struct context_entry *)map_vtd_domain_page(maddr);
>      context = &context_entries[devfn];
>  
> @@ -1495,7 +1498,7 @@ int domain_context_unmap_one(
>      ASSERT(spin_is_locked(&pcidevs_lock));
>      spin_lock(&iommu->lock);
>  
> -    maddr = bus_to_context_maddr(iommu, bus);
> +    maddr = bus_to_context_maddr(iommu, bus, domain);
>      context_entries = (struct context_entry *)map_vtd_domain_page(maddr);
>      context = &context_entries[devfn];
>  
> --- a/xen/drivers/passthrough/vtd/qinval.c
> +++ b/xen/drivers/passthrough/vtd/qinval.c
> @@ -374,7 +374,8 @@ int enable_qinval(struct iommu *iommu)
>      if ( qi_ctrl->qinval_maddr == 0 )
>      {
>          drhd = iommu_to_drhd(iommu);
> -        qi_ctrl->qinval_maddr = alloc_pgtable_maddr(drhd, 
> QINVAL_ARCH_PAGE_NR);
> +        qi_ctrl->qinval_maddr = alloc_pgtable_maddr(drhd, 
> QINVAL_ARCH_PAGE_NR,
> +                                                    NULL);
>          if ( qi_ctrl->qinval_maddr == 0 )
>          {
>              dprintk(XENLOG_WARNING VTDPREFIX,
>
>
>
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xen.org
> http://lists.xen.org/xen-devel

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

Reply via email to