|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen master] x86/PV: polish pv_set_gdt()
commit 87827167bb1737e826b0a8fe0abe07c0ace36ac5
Author: Jan Beulich <jbeulich@xxxxxxxx>
AuthorDate: Fri May 22 16:10:40 2020 +0200
Commit: Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Fri May 22 16:10:40 2020 +0200
x86/PV: polish pv_set_gdt()
There's no need to invoke get_page_from_gfn(), and there's also no need
to update the passed in frames[]. Invoke get_page_and_type() directly.
Also make the function's frames[] parameter const, change its return
type to int, and drop the bogus casts from two of its invocations.
Finally a little bit of cosmetics.
Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
Acked-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
---
xen/arch/x86/domain.c | 4 ++--
xen/arch/x86/pv/descriptor-tables.c | 18 ++++++------------
xen/include/asm-x86/pv/mm.h | 7 ++++---
3 files changed, 12 insertions(+), 17 deletions(-)
diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c
index 6402b09993..6327ba0790 100644
--- a/xen/arch/x86/domain.c
+++ b/xen/arch/x86/domain.c
@@ -1096,7 +1096,7 @@ int arch_set_info_guest(
return rc;
if ( !compat )
- rc = (int)pv_set_gdt(v, c.nat->gdt_frames, c.nat->gdt_ents);
+ rc = pv_set_gdt(v, c.nat->gdt_frames, c.nat->gdt_ents);
else
{
unsigned long gdt_frames[ARRAY_SIZE(v->arch.pv.gdt_frames)];
@@ -1104,7 +1104,7 @@ int arch_set_info_guest(
for ( i = 0; i < nr_gdt_frames; ++i )
gdt_frames[i] = c.cmp->gdt_frames[i];
- rc = (int)pv_set_gdt(v, gdt_frames, c.cmp->gdt_ents);
+ rc = pv_set_gdt(v, gdt_frames, c.cmp->gdt_ents);
}
if ( rc != 0 )
return rc;
diff --git a/xen/arch/x86/pv/descriptor-tables.c
b/xen/arch/x86/pv/descriptor-tables.c
index 090f901b5b..3856128993 100644
--- a/xen/arch/x86/pv/descriptor-tables.c
+++ b/xen/arch/x86/pv/descriptor-tables.c
@@ -81,7 +81,8 @@ void pv_destroy_gdt(struct vcpu *v)
}
}
-long pv_set_gdt(struct vcpu *v, unsigned long *frames, unsigned int entries)
+int pv_set_gdt(struct vcpu *v, const unsigned long frames[],
+ unsigned int entries)
{
struct domain *d = v->domain;
l1_pgentry_t *pl1e;
@@ -95,17 +96,11 @@ long pv_set_gdt(struct vcpu *v, unsigned long *frames,
unsigned int entries)
/* Check the pages in the new GDT. */
for ( i = 0; i < nr_frames; i++ )
{
- struct page_info *page;
+ mfn_t mfn = _mfn(frames[i]);
- page = get_page_from_gfn(d, frames[i], NULL, P2M_ALLOC);
- if ( !page )
+ if ( !mfn_valid(mfn) ||
+ !get_page_and_type(mfn_to_page(mfn), d, PGT_seg_desc_page) )
goto fail;
- if ( !get_page_type(page, PGT_seg_desc_page) )
- {
- put_page(page);
- goto fail;
- }
- frames[i] = mfn_x(page_to_mfn(page));
}
/* Tear down the old GDT. */
@@ -124,9 +119,8 @@ long pv_set_gdt(struct vcpu *v, unsigned long *frames,
unsigned int entries)
fail:
while ( i-- > 0 )
- {
put_page_and_type(mfn_to_page(_mfn(frames[i])));
- }
+
return -EINVAL;
}
diff --git a/xen/include/asm-x86/pv/mm.h b/xen/include/asm-x86/pv/mm.h
index 246b99014c..07a12d5c49 100644
--- a/xen/include/asm-x86/pv/mm.h
+++ b/xen/include/asm-x86/pv/mm.h
@@ -25,7 +25,8 @@
int pv_ro_page_fault(unsigned long addr, struct cpu_user_regs *regs);
-long pv_set_gdt(struct vcpu *v, unsigned long *frames, unsigned int entries);
+int pv_set_gdt(struct vcpu *v, const unsigned long frames[],
+ unsigned int entries);
void pv_destroy_gdt(struct vcpu *v);
bool pv_map_ldt_shadow_page(unsigned int off);
@@ -43,8 +44,8 @@ static inline int pv_ro_page_fault(unsigned long addr,
return 0;
}
-static inline long pv_set_gdt(struct vcpu *v, unsigned long *frames,
- unsigned int entries)
+static inline int pv_set_gdt(struct vcpu *v, const unsigned long frames[],
+ unsigned int entries)
{ ASSERT_UNREACHABLE(); return -EINVAL; }
static inline void pv_destroy_gdt(struct vcpu *v) { ASSERT_UNREACHABLE(); }
--
generated by git-patchbot for /home/xen/git/xen.git#master
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |