|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH RFC 28/44] x86/xlat: Use the percpu compat translation area
This allows {setup,free}_compat_arg_xlat() to be dropped.
Changing COMPAT_ARG_XLAT_VIRT_BASE to avoid referencing current has a fairly
large impact on code size, as it is hidden underneath the
copy_{to,from}_guest() logic.
The net bloat-o-meter report for this change is:
add/remove: 0/2 grow/shrink: 4/35 up/down: 570/-1285 (-715)
Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
---
xen/arch/x86/hvm/hvm.c | 8 --------
xen/arch/x86/pv/dom0_build.c | 2 --
xen/arch/x86/pv/domain.c | 12 +-----------
xen/arch/x86/x86_64/mm.c | 13 -------------
xen/include/asm-x86/config.h | 7 -------
xen/include/asm-x86/x86_64/uaccess.h | 6 ++----
6 files changed, 3 insertions(+), 45 deletions(-)
diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c
index 71fddfd..5836269 100644
--- a/xen/arch/x86/hvm/hvm.c
+++ b/xen/arch/x86/hvm/hvm.c
@@ -1533,10 +1533,6 @@ int hvm_vcpu_initialise(struct vcpu *v)
v->arch.hvm_vcpu.inject_event.vector = HVM_EVENT_VECTOR_UNSET;
- rc = setup_compat_arg_xlat(v); /* teardown: free_compat_arg_xlat() */
- if ( rc != 0 )
- goto fail4;
-
if ( nestedhvm_enabled(d)
&& (rc = nestedhvm_vcpu_initialise(v)) < 0 ) /* teardown:
nestedhvm_vcpu_destroy */
goto fail5;
@@ -1562,8 +1558,6 @@ int hvm_vcpu_initialise(struct vcpu *v)
fail6:
nestedhvm_vcpu_destroy(v);
fail5:
- free_compat_arg_xlat(v);
- fail4:
hvm_funcs.vcpu_destroy(v);
fail3:
vlapic_destroy(v);
@@ -1584,8 +1578,6 @@ void hvm_vcpu_destroy(struct vcpu *v)
nestedhvm_vcpu_destroy(v);
- free_compat_arg_xlat(v);
-
tasklet_kill(&v->arch.hvm_vcpu.assert_evtchn_irq_tasklet);
hvm_funcs.vcpu_destroy(v);
diff --git a/xen/arch/x86/pv/dom0_build.c b/xen/arch/x86/pv/dom0_build.c
index 3baf37b..3f5e3bc 100644
--- a/xen/arch/x86/pv/dom0_build.c
+++ b/xen/arch/x86/pv/dom0_build.c
@@ -385,8 +385,6 @@ int __init dom0_construct_pv(struct domain *d,
{
d->arch.is_32bit_pv = d->arch.has_32bit_shinfo = 1;
v->vcpu_info = (void *)&d->shared_info->compat.vcpu_info[0];
- if ( setup_compat_arg_xlat(v) != 0 )
- BUG();
}
nr_pages = dom0_compute_nr_pages(d, &parms, initrd_len);
diff --git a/xen/arch/x86/pv/domain.c b/xen/arch/x86/pv/domain.c
index 7e4566d..4e88bfd 100644
--- a/xen/arch/x86/pv/domain.c
+++ b/xen/arch/x86/pv/domain.c
@@ -72,8 +72,7 @@ int switch_compat(struct domain *d)
for_each_vcpu( d, v )
{
- if ( (rc = setup_compat_arg_xlat(v)) ||
- (rc = setup_compat_l4(v)) )
+ if ( (rc = setup_compat_l4(v)) )
goto undo_and_fail;
}
@@ -87,10 +86,7 @@ int switch_compat(struct domain *d)
undo_and_fail:
d->arch.is_32bit_pv = d->arch.has_32bit_shinfo = 0;
for_each_vcpu( d, v )
- {
- free_compat_arg_xlat(v);
release_compat_l4(v);
- }
return rc;
}
@@ -112,10 +108,7 @@ static void pv_destroy_gdt_ldt_l1tab(struct vcpu *v)
void pv_vcpu_destroy(struct vcpu *v)
{
if ( is_pv_32bit_vcpu(v) )
- {
- free_compat_arg_xlat(v);
release_compat_l4(v);
- }
pv_destroy_gdt_ldt_l1tab(v);
xfree(v->arch.pv_vcpu.trap_ctxt);
@@ -152,9 +145,6 @@ int pv_vcpu_initialise(struct vcpu *v)
if ( is_pv_32bit_domain(d) )
{
- if ( (rc = setup_compat_arg_xlat(v)) )
- goto done;
-
if ( (rc = setup_compat_l4(v)) )
goto done;
}
diff --git a/xen/arch/x86/x86_64/mm.c b/xen/arch/x86/x86_64/mm.c
index 68eee30..aae721b 100644
--- a/xen/arch/x86/x86_64/mm.c
+++ b/xen/arch/x86/x86_64/mm.c
@@ -697,19 +697,6 @@ void __init zap_low_mappings(void)
__PAGE_HYPERVISOR);
}
-int setup_compat_arg_xlat(struct vcpu *v)
-{
- return create_perdomain_mapping(v->domain, ARG_XLAT_START(v),
- PFN_UP(COMPAT_ARG_XLAT_SIZE),
- NULL, NIL(struct page_info *));
-}
-
-void free_compat_arg_xlat(struct vcpu *v)
-{
- destroy_perdomain_mapping(v->domain, ARG_XLAT_START(v),
- PFN_UP(COMPAT_ARG_XLAT_SIZE));
-}
-
static void cleanup_frame_table(struct mem_hotadd_info *info)
{
unsigned long sva, eva;
diff --git a/xen/include/asm-x86/config.h b/xen/include/asm-x86/config.h
index 3d64047..c7503ad 100644
--- a/xen/include/asm-x86/config.h
+++ b/xen/include/asm-x86/config.h
@@ -316,13 +316,6 @@ extern unsigned long xen_phys_start;
#define LDT_VIRT_START(v) \
(GDT_VIRT_START(v) + (64*1024))
-/* Argument translation area. The third per-domain-mapping sub-area. */
-#define ARG_XLAT_VIRT_START PERDOMAIN_VIRT_SLOT(2)
-/* Allow for at least one guard page (COMPAT_ARG_XLAT_SIZE being 2 pages): */
-#define ARG_XLAT_VA_SHIFT (2 + PAGE_SHIFT)
-#define ARG_XLAT_START(v) \
- (ARG_XLAT_VIRT_START + ((v)->vcpu_id << ARG_XLAT_VA_SHIFT))
-
#define NATIVE_VM_ASSIST_VALID ((1UL << VMASST_TYPE_4gb_segments) | \
(1UL << VMASST_TYPE_4gb_segments_notify) | \
(1UL << VMASST_TYPE_writable_pagetables) | \
diff --git a/xen/include/asm-x86/x86_64/uaccess.h
b/xen/include/asm-x86/x86_64/uaccess.h
index d7dad4f..ce88dce 100644
--- a/xen/include/asm-x86/x86_64/uaccess.h
+++ b/xen/include/asm-x86/x86_64/uaccess.h
@@ -1,11 +1,9 @@
#ifndef __X86_64_UACCESS_H
#define __X86_64_UACCESS_H
-#define COMPAT_ARG_XLAT_VIRT_BASE ((void *)ARG_XLAT_START(current))
+#define COMPAT_ARG_XLAT_VIRT_BASE ((void *)PERCPU_XLAT_START)
#define COMPAT_ARG_XLAT_SIZE (2*PAGE_SIZE)
-struct vcpu;
-int setup_compat_arg_xlat(struct vcpu *v);
-void free_compat_arg_xlat(struct vcpu *v);
+
#define is_compat_arg_xlat_range(addr, size) ({ \
unsigned long __off; \
__off = (unsigned long)(addr) - (unsigned long)COMPAT_ARG_XLAT_VIRT_BASE; \
--
2.1.4
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |