Message ID | 20220630135747.26983-4-will@kernel.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | KVM: arm64: Introduce pKVM shadow state at EL2 | expand |
On Thu, Jun 30, 2022 at 02:57:26PM +0100, Will Deacon wrote: > From: Quentin Perret <qperret@google.com> > > Add a 'flags' field to struct hyp_page, and reduce the size of the order > field to u8 to avoid growing the struct size. > > Signed-off-by: Quentin Perret <qperret@google.com> > Signed-off-by: Will Deacon <will@kernel.org> > --- > arch/arm64/kvm/hyp/include/nvhe/gfp.h | 6 +++--- > arch/arm64/kvm/hyp/include/nvhe/memory.h | 3 ++- > arch/arm64/kvm/hyp/nvhe/page_alloc.c | 14 +++++++------- > 3 files changed, 12 insertions(+), 11 deletions(-) > > diff --git a/arch/arm64/kvm/hyp/include/nvhe/gfp.h b/arch/arm64/kvm/hyp/include/nvhe/gfp.h > index 0a048dc06a7d..9330b13075f8 100644 > --- a/arch/arm64/kvm/hyp/include/nvhe/gfp.h > +++ b/arch/arm64/kvm/hyp/include/nvhe/gfp.h > @@ -7,7 +7,7 @@ > #include <nvhe/memory.h> > #include <nvhe/spinlock.h> > > -#define HYP_NO_ORDER USHRT_MAX > +#define HYP_NO_ORDER 0xff BUG_ON in hyp_page_ref_inc() might now need to test for 0xff/HYP_NO_ORDER instead of USHRT_MAX. [...]
On Mon, Jul 18, 2022 at 11:54:24AM +0100, Vincent Donnefort wrote: > On Thu, Jun 30, 2022 at 02:57:26PM +0100, Will Deacon wrote: > > From: Quentin Perret <qperret@google.com> > > > > Add a 'flags' field to struct hyp_page, and reduce the size of the order > > field to u8 to avoid growing the struct size. > > > > Signed-off-by: Quentin Perret <qperret@google.com> > > Signed-off-by: Will Deacon <will@kernel.org> > > --- > > arch/arm64/kvm/hyp/include/nvhe/gfp.h | 6 +++--- > > arch/arm64/kvm/hyp/include/nvhe/memory.h | 3 ++- > > arch/arm64/kvm/hyp/nvhe/page_alloc.c | 14 +++++++------- > > 3 files changed, 12 insertions(+), 11 deletions(-) > > > > diff --git a/arch/arm64/kvm/hyp/include/nvhe/gfp.h b/arch/arm64/kvm/hyp/include/nvhe/gfp.h > > index 0a048dc06a7d..9330b13075f8 100644 > > --- a/arch/arm64/kvm/hyp/include/nvhe/gfp.h > > +++ b/arch/arm64/kvm/hyp/include/nvhe/gfp.h > > @@ -7,7 +7,7 @@ > > #include <nvhe/memory.h> > > #include <nvhe/spinlock.h> > > > > -#define HYP_NO_ORDER USHRT_MAX > > +#define HYP_NO_ORDER 0xff > > BUG_ON in hyp_page_ref_inc() might now need to test for 0xff/HYP_NO_ORDER > instead of USHRT_MAX. My bad, read to quickly, refcount/order... > > [...]
diff --git a/arch/arm64/kvm/hyp/include/nvhe/gfp.h b/arch/arm64/kvm/hyp/include/nvhe/gfp.h index 0a048dc06a7d..9330b13075f8 100644 --- a/arch/arm64/kvm/hyp/include/nvhe/gfp.h +++ b/arch/arm64/kvm/hyp/include/nvhe/gfp.h @@ -7,7 +7,7 @@ #include <nvhe/memory.h> #include <nvhe/spinlock.h> -#define HYP_NO_ORDER USHRT_MAX +#define HYP_NO_ORDER 0xff struct hyp_pool { /* @@ -19,11 +19,11 @@ struct hyp_pool { struct list_head free_area[MAX_ORDER]; phys_addr_t range_start; phys_addr_t range_end; - unsigned short max_order; + u8 max_order; }; /* Allocation */ -void *hyp_alloc_pages(struct hyp_pool *pool, unsigned short order); +void *hyp_alloc_pages(struct hyp_pool *pool, u8 order); void hyp_split_page(struct hyp_page *page); void hyp_get_page(struct hyp_pool *pool, void *addr); void hyp_put_page(struct hyp_pool *pool, void *addr); diff --git a/arch/arm64/kvm/hyp/include/nvhe/memory.h b/arch/arm64/kvm/hyp/include/nvhe/memory.h index 418b66a82a50..2681f632e1c1 100644 --- a/arch/arm64/kvm/hyp/include/nvhe/memory.h +++ b/arch/arm64/kvm/hyp/include/nvhe/memory.h @@ -9,7 +9,8 @@ struct hyp_page { unsigned short refcount; - unsigned short order; + u8 order; + u8 flags; }; extern u64 __hyp_vmemmap; diff --git a/arch/arm64/kvm/hyp/nvhe/page_alloc.c b/arch/arm64/kvm/hyp/nvhe/page_alloc.c index 0d15227aced8..e6e4b550752b 100644 --- a/arch/arm64/kvm/hyp/nvhe/page_alloc.c +++ b/arch/arm64/kvm/hyp/nvhe/page_alloc.c @@ -32,7 +32,7 @@ u64 __hyp_vmemmap; */ static struct hyp_page *__find_buddy_nocheck(struct hyp_pool *pool, struct hyp_page *p, - unsigned short order) + u8 order) { phys_addr_t addr = hyp_page_to_phys(p); @@ -51,7 +51,7 @@ static struct hyp_page *__find_buddy_nocheck(struct hyp_pool *pool, /* Find a buddy page currently available for allocation */ static struct hyp_page *__find_buddy_avail(struct hyp_pool *pool, struct hyp_page *p, - unsigned short order) + u8 order) { struct hyp_page *buddy = __find_buddy_nocheck(pool, p, order); @@ -94,8 +94,8 @@ static void __hyp_attach_page(struct hyp_pool *pool, struct hyp_page *p) { phys_addr_t phys = hyp_page_to_phys(p); - unsigned short order = p->order; struct hyp_page *buddy; + u8 order = p->order; memset(hyp_page_to_virt(p), 0, PAGE_SIZE << p->order); @@ -128,7 +128,7 @@ static void __hyp_attach_page(struct hyp_pool *pool, static struct hyp_page *__hyp_extract_page(struct hyp_pool *pool, struct hyp_page *p, - unsigned short order) + u8 order) { struct hyp_page *buddy; @@ -182,7 +182,7 @@ void hyp_get_page(struct hyp_pool *pool, void *addr) void hyp_split_page(struct hyp_page *p) { - unsigned short order = p->order; + u8 order = p->order; unsigned int i; p->order = 0; @@ -194,10 +194,10 @@ void hyp_split_page(struct hyp_page *p) } } -void *hyp_alloc_pages(struct hyp_pool *pool, unsigned short order) +void *hyp_alloc_pages(struct hyp_pool *pool, u8 order) { - unsigned short i = order; struct hyp_page *p; + u8 i = order; hyp_spin_lock(&pool->lock);