KVM: arm64: pkvm: Fix hyp_pool max order
authorQuentin Perret <qperret@google.com>
Wed, 8 Dec 2021 15:22:54 +0000 (15:22 +0000)
committerMarc Zyngier <maz@kernel.org>
Wed, 15 Dec 2021 14:16:28 +0000 (14:16 +0000)
The EL2 page allocator in protected mode maintains a per-pool max order
value to optimize allocations when the memory region it covers is small.
However, the max order value is currently under-estimated whenever the
number of pages in the region is a power of two. Fix the estimation.

Signed-off-by: Quentin Perret <qperret@google.com>
Acked-by: Will Deacon <will@kernel.org>
Signed-off-by: Marc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20211208152300.2478542-2-qperret@google.com
arch/arm64/kvm/hyp/nvhe/page_alloc.c

index 0bd7701ad1df5d1e71fc58c4d1d9de72e55c7cdf..543cad6c376a2134bd0a3f3f94f69ddbfb1f40f3 100644 (file)
@@ -241,7 +241,7 @@ int hyp_pool_init(struct hyp_pool *pool, u64 pfn, unsigned int nr_pages,
        int i;
 
        hyp_spin_lock_init(&pool->lock);
-       pool->max_order = min(MAX_ORDER, get_order(nr_pages << PAGE_SHIFT));
+       pool->max_order = min(MAX_ORDER, get_order((nr_pages + 1) << PAGE_SHIFT));
        for (i = 0; i < pool->max_order; i++)
                INIT_LIST_HEAD(&pool->free_area[i]);
        pool->range_start = phys;