|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [v3][PATCH 07/16] hvmloader/pci: skip reserved ranges
> From: Chen, Tiejun
> Sent: Friday, June 12, 2015 3:54 PM
> >
> >> bar_data |= (uint32_t)base;
> >> bar_data_upper = (uint32_t)(base >> 32);
> >> + for ( j = 0; j < memory_map.nr_map ; j++ )
> >> + {
> >> + if ( memory_map.map[j].type != E820_RAM )
> >> + {
> >> + reserved_end = memory_map.map[j].addr +
> >> memory_map.map[j].size;
> >> + if ( check_overlap(base, bar_sz,
> >> + memory_map.map[j].addr,
> >> + memory_map.map[j].size) )
> >> + {
> >> + base = (reserved_end + bar_sz - 1) &
> >> ~(uint64_t)(bar_sz - 1);
> >> + goto reallocate_mmio;
>
> That is because our previous implementation is just skipping that
> conflict region,
>
> "But you do nothing to make sure the MMIO regions all fit in the
> available window (see the code ahead of this relocating RAM if
> necessary)." and "...it simply skips assigning resources. Your changes
> potentially growing the space needed to fit all MMIO BARs therefore also
> needs to adjust the up front calculation, such that if necessary more
> RAM can be relocated to make the hole large enough."
>
> And then I replied as follows,
>
> "You're right.
>
> Just think about we're always trying to check pci_mem_start to populate
> more RAM to obtain enough PCI mempry,
>
> /* Relocate RAM that overlaps PCI space (in 64k-page chunks). */
> while ( (pci_mem_start >> PAGE_SHIFT) < hvm_info->low_mem_pgend )
> {
> struct xen_add_to_physmap xatp;
> unsigned int nr_pages = min_t(
> unsigned int,
> hvm_info->low_mem_pgend - (pci_mem_start >> PAGE_SHIFT),
> (1u << 16) - 1);
> if ( hvm_info->high_mem_pgend == 0 )
> hvm_info->high_mem_pgend = 1ull << (32 - PAGE_SHIFT);
> hvm_info->low_mem_pgend -= nr_pages;
> printf("Relocating 0x%x pages from "PRIllx" to "PRIllx\
> " for lowmem MMIO hole\n",
> nr_pages,
> PRIllx_arg(((uint64_t)hvm_info->low_mem_pgend)<<PAGE_SHIFT),
>
> PRIllx_arg(((uint64_t)hvm_info->high_mem_pgend)<<PAGE_SHIFT));
> xatp.domid = DOMID_SELF;
> xatp.space = XENMAPSPACE_gmfn_range;
> xatp.idx = hvm_info->low_mem_pgend;
> xatp.gpfn = hvm_info->high_mem_pgend;
> xatp.size = nr_pages;
> if ( hypercall_memory_op(XENMEM_add_to_physmap, &xatp) != 0 )
> BUG();
> hvm_info->high_mem_pgend += nr_pages;
> }
> "
>
> I hope this can help you understand this background. And I will update
> that code comment like this,
>
> /*
> * We'll skip all space overlapping with reserved memory later,
> * so we need to decrease pci_mem_start to populate more RAM
> * to compensate them.
> */
>
Jan's comment is correct. However I don't think adjusting pci_mem_start
is the right way here (even now I don't quite understand how it's adjusted
in your earlier code). There are other limitations on that value. We can simply
adjust mmio_total to include conflicting reserved ranges, so more bars will
be moved to high_mem_resource automatically by below code:
380 using_64bar = bars[i].is_64bar && bar64_relocate
381 && (mmio_total > (mem_resource.max - mem_resource.base));
382 bar_data = pci_readl(devfn, bar_reg);
383
384 if ( (bar_data & PCI_BASE_ADDRESS_SPACE) ==
385 PCI_BASE_ADDRESS_SPACE_MEMORY )
386 {
387 /* Mapping high memory if PCI device is 64 bits bar */
388 if ( using_64bar ) {
389 if ( high_mem_resource.base & (bar_sz - 1) )
390 high_mem_resource.base = high_mem_resource.base -
391 (high_mem_resource.base & (bar_sz - 1)) + bar_sz;
392 if ( !pci_hi_mem_start )
393 pci_hi_mem_start = high_mem_resource.base;
394 resource = &high_mem_resource;
395 bar_data &= ~PCI_BASE_ADDRESS_MEM_MASK;
396 }
397 else {
398 resource = &mem_resource;
399 bar_data &= ~PCI_BASE_ADDRESS_MEM_MASK;
400 }
401 mmio_total -= bar_sz;
402 }
Thanks
Kevin
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |