|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH] hvmloader/PCI: skip huge BARs in certain calculations
On 04.03.2024 11:02, Roger Pau Monné wrote:
> On Mon, Mar 04, 2024 at 08:32:22AM +0100, Jan Beulich wrote:
>> BARs of size 2Gb and up can't possibly fit below 4Gb: Both the bottom of
>> the lower 2Gb range and the top of the higher 2Gb range have special
>> purpose. Don't even have them influence whether to (perhaps) relocate
>> low RAM.
>
> Here you mention 2Gb BARs, yet the code below sets the maximum BAR
> size supported below 4Gb to 1Gb.
Hmm, I'm puzzled: There are no other BAR sizes between 1Gb and 2Gb.
Anything up to 1Gb continues to work as is, while everything 2Gb and
up has behavior changed.
>> --- a/tools/firmware/hvmloader/pci.c
>> +++ b/tools/firmware/hvmloader/pci.c
>> @@ -33,6 +33,13 @@ uint32_t pci_mem_start = HVM_BELOW_4G_MM
>> const uint32_t pci_mem_end = RESERVED_MEMBASE;
>> uint64_t pci_hi_mem_start = 0, pci_hi_mem_end = 0;
>>
>> +/*
>> + * BARs larger than this value are put in 64-bit space unconditionally.
>> That
>> + * is, such BARs also don't play into the determination of how big the
>> lowmem
>> + * MMIO hole needs to be.
>> + */
>> +#define HUGE_BAR_THRESH GB(1)
>
> I would be fine with defining this to an even lower number, like
> 256Mb, as to avoid as much as possible memory relocation in order to
> make the MMIO hole bigger.
As suggested in a post-commit-message remark, the main question then is
how to justify this.
>> @@ -367,7 +376,7 @@ void pci_setup(void)
>> pci_mem_start = hvm_info->low_mem_pgend << PAGE_SHIFT;
>> }
>>
>> - if ( mmio_total > (pci_mem_end - pci_mem_start) )
>> + if ( mmio_total > (pci_mem_end - pci_mem_start) || bar64_relocate )
>> {
>> printf("Low MMIO hole not large enough for all devices,"
>> " relocating some BARs to 64-bit\n");
>
> Is the above message now accurate? Given the current code the low
> MMIO could be expanded up to 2Gb, yet BAR relocation will happen
> unconditionally once a 1Gb BAR is found.
Well, "all" may not be quite accurate anymore, yet would making it e.g.
"all applicable" really much more meaningful?
>> @@ -446,8 +455,9 @@ void pci_setup(void)
>> * the code here assumes it to be.)
>> * Should either of those two conditions change, this code will
>> break.
>> */
>> - using_64bar = bars[i].is_64bar && bar64_relocate
>> - && (mmio_total > (mem_resource.max - mem_resource.base));
>> + using_64bar = bars[i].is_64bar && bar64_relocate &&
>> + (mmio_total > (mem_resource.max - mem_resource.base) ||
>> + bar_sz > HUGE_BAR_THRESH);
>> bar_data = pci_readl(devfn, bar_reg);
>>
>> if ( (bar_data & PCI_BASE_ADDRESS_SPACE) ==
>> @@ -467,7 +477,8 @@ void pci_setup(void)
>> resource = &mem_resource;
>> bar_data &= ~PCI_BASE_ADDRESS_MEM_MASK;
>> }
>> - mmio_total -= bar_sz;
>> + if ( bar_sz <= HUGE_BAR_THRESH )
>> + mmio_total -= bar_sz;
>
> I'm missing the part where hvmloader notifies QEMU of the possibly
> expanded base and size memory PCI MMIO regions, so that those are
> reflected in the PCI root complex registers?
I don't understand this comment: I'm not changing the interaction
with qemu at all. Whatever the new calculation it'll be communicated
to qemu just as before.
> Overall I think we could simplify the code by having a hardcoded 1Gb
> PCI MMIO hole below 4Gb, fill it with all the 32bit BARs and
> (re)locate all 64bit BARs above 4Gb (not that I'm requesting you to do
> it here).
I'm afraid that would not work very well with OSes which aren't 64-bit
BAR / PA aware (first and foremost non-PAE 32-bit ones). Iirc that's
the reason why it wasn't done like you suggest back at the time.
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |