Thread (97 messages) 97 messages, 6 authors, 2021-02-22

Re: [RFC PATCH v2 12/26] KVM: arm64: Introduce a Hyp buddy page allocator

From: Will Deacon <will@kernel.org>
Date: 2021-02-04 17:51:39
Also in: kvmarm, linux-arm-kernel, lkml

On Thu, Feb 04, 2021 at 02:52:52PM +0000, Quentin Perret wrote:
On Thursday 04 Feb 2021 at 14:31:08 (+0000), Will Deacon wrote:
quoted
On Wed, Feb 03, 2021 at 06:33:30PM +0000, Quentin Perret wrote:
quoted
On Tuesday 02 Feb 2021 at 18:13:08 (+0000), Will Deacon wrote:
quoted
On Fri, Jan 08, 2021 at 12:15:10PM +0000, Quentin Perret wrote:
quoted
+ *   __find_buddy(pool, page 0, order 0) => page 1
+ *   __find_buddy(pool, page 0, order 1) => page 2
+ *   __find_buddy(pool, page 1, order 0) => page 0
+ *   __find_buddy(pool, page 2, order 0) => page 3
+ */
+static struct hyp_page *__find_buddy(struct hyp_pool *pool, struct hyp_page *p,
+				     unsigned int order)
+{
+	phys_addr_t addr = hyp_page_to_phys(p);
+
+	addr ^= (PAGE_SIZE << order);
+	if (addr < pool->range_start || addr >= pool->range_end)
+		return NULL;
Are these range checks only needed because the pool isn't required to be
an exact power-of-2 pages in size? If so, maybe it would be more
straightforward to limit the max order on a per-pool basis depending upon
its size?
More importantly, it is because pages outside of the pool are not
guaranteed to be covered by the hyp_vmemmap, so I really need to make
sure I don't dereference them.
Wouldn't having a per-pool max order help with that?
The issue is, I have no alignment guarantees for the pools, so I may end
up with max_order = 0 ...
Yeah, so you would still need the range tracking, but it would at least help
to reduce HYP_MAX_ORDER failed searches each time. Still, we can always do
that later.

Will
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help