|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v3 1/9] x86/PVH: improve Dom0 memory size calculation
On 22.09.2021 13:59, Roger Pau Monné wrote:
> On Tue, Sep 21, 2021 at 09:16:44AM +0200, Jan Beulich wrote:
>> @@ -337,18 +337,23 @@ unsigned long __init dom0_compute_nr_pag
>> avail -= d->max_vcpus - 1;
>>
>> /* Reserve memory for iommu_dom0_init() (rough estimate). */
>> - if ( is_iommu_enabled(d) )
>> + if ( is_iommu_enabled(d) && !iommu_hwdom_passthrough )
>> {
>> unsigned int s;
>>
>> for ( s = 9; s < BITS_PER_LONG; s += 9 )
>> - avail -= max_pdx >> s;
>> + iommu_pages += max_pdx >> s;
>> +
>> + avail -= iommu_pages;
>> }
>>
>> - need_paging = is_hvm_domain(d) &&
>> - (!iommu_use_hap_pt(d) || !paging_mode_hap(d));
>> + need_paging = is_hvm_domain(d)
>> + ? !iommu_use_hap_pt(d) || !paging_mode_hap(d)
>> + : opt_dom0_shadow;
>> for ( ; ; need_paging = false )
>> {
>> + unsigned long paging_pages;
>> +
>> nr_pages = get_memsize(&dom0_size, avail);
>> min_pages = get_memsize(&dom0_min_size, avail);
>> max_pages = get_memsize(&dom0_max_size, avail);
>> @@ -377,11 +382,20 @@ unsigned long __init dom0_compute_nr_pag
>> nr_pages = min(nr_pages, max_pages);
>> nr_pages = min(nr_pages, avail);
>>
>> - if ( !need_paging )
>> - break;
>> + paging_pages = paging_mode_enabled(d) || need_paging
>> + ? dom0_paging_pages(d, nr_pages) : 0;
>>
>> /* Reserve memory for shadow or HAP. */
>> - avail -= dom0_paging_pages(d, nr_pages);
>> + if ( !need_paging )
>> + {
>> + if ( paging_pages <= iommu_pages )
>> + break;
>> +
>> + avail -= paging_pages - iommu_pages;
>> + }
>> + else
>> + avail -= paging_pages;
>> + iommu_pages = paging_pages;
>> }
>
> I always found this loop extremely confusing to reason about. Now that
> we account for the iommu page tables using separate logic, do we
> really need a loop here?
>
> In fact I would suggest something like:
>
> unsigned long cpu_pages = 0;
>
> if ( is_iommu_enabled(d) && !iommu_hwdom_passthrough )
> {
> unsigned int s;
>
> for ( s = 9; s < BITS_PER_LONG; s += 9 )
> iommu_pages += max_pdx >> s;
> }
>
> [perform all the nr_pages adjustments]
>
> if ( paging_mode_enabled(d) ||
> opt_dom0_shadow /* shadow paging gets enabled later for PV dom0. */ )
> cpu_pages = dom0_paging_pages(d, nr_pages);
>
> if ( is_hvm_domain(d) && iommu_use_hap_pt(d) && paging_mode_hap(d) )
> avail -= max(iommu_pages, cpu_pages);
> else
> avail -= cpu_pages + iommu_pages;
>
> There will be a slight over estimation of cpu_pages, as the value
> passed in doesn't account for the iommu pages in case they are used,
> but still it's better to over estimate than to under estimate.
Overestimating cpu_pages isn't a primary concern, I agree. But we
want to get the min/max clamping reasonably close. Therefore, while
dropping the loop as you suggest I've introduced two instances of
that logic, before and after calculating cpu_pages. I'll see to
send out v4 soonish (provided the result actually works for, in
particular, the case that I needed the fix for in the first place).
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |