|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH RFC 25/44] x86/fixmap: Drop percpu fixmap range
The percpu fixmap range was introduced to allow opencoding of
map_domain_page() in the middle of a context switch.
The new implementation of map_domain_page() is safe to use in a context
switch, so drop the percpu fixmap infrastructure.
This removes the temporary build-time restriction on NR_CPUS.
Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
---
xen/arch/x86/mm.c | 6 ++----
xen/arch/x86/pv/pt-shadow.c | 15 ++++++---------
xen/include/asm-x86/fixmap.h | 32 --------------------------------
3 files changed, 8 insertions(+), 45 deletions(-)
diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
index 7c08807..d5c69c0 100644
--- a/xen/arch/x86/mm.c
+++ b/xen/arch/x86/mm.c
@@ -526,11 +526,9 @@ void do_write_ptbase(struct vcpu *v, bool tlb_maintenance)
ASSERT(test_bit(_PGC_inuse_pgtable, &new_pg->count_info));
/* Insert percpu mappings into the new pagetables. */
- set_percpu_fixmap(cpu, PERCPU_FIXSLOT_LINEAR,
- l1e_from_paddr(new_cr3, __PAGE_HYPERVISOR_RW));
- new_l4t = percpu_fix_to_virt(cpu, PERCPU_FIXSLOT_LINEAR);
+ new_l4t = map_domain_page(maddr_to_mfn(new_cr3));
new_l4t[l4_table_offset(PERCPU_LINEAR_START)] = percpu_mappings;
- barrier();
+ unmap_domain_page(new_l4t);
/* If the new cr3 has a short directmap, report so before switching... */
if ( !new_extd_directmap )
diff --git a/xen/arch/x86/pv/pt-shadow.c b/xen/arch/x86/pv/pt-shadow.c
index 46c7b86..33cb303 100644
--- a/xen/arch/x86/pv/pt-shadow.c
+++ b/xen/arch/x86/pv/pt-shadow.c
@@ -22,7 +22,6 @@
#include <xen/mm.h>
#include <xen/numa.h>
-#include <asm/fixmap.h>
#include <asm/pv/pt-shadow.h>
/*
@@ -163,13 +162,11 @@ unsigned long pt_maybe_shadow(struct vcpu *v)
unsigned int slot = l4_table_offset(PERCPU_LINEAR_START);
l4_pgentry_t *l4t, *vcpu_l4t;
- set_percpu_fixmap(cpu, PERCPU_FIXSLOT_SHADOW,
- l1e_from_paddr(new_cr3, __PAGE_HYPERVISOR_RO));
ptsh->shadowing = new_cr3;
local_irq_restore(flags);
l4t = ptsh->shadow_l4_va;
- vcpu_l4t = percpu_fix_to_virt(cpu, PERCPU_FIXSLOT_SHADOW);
+ vcpu_l4t = map_domain_page(maddr_to_mfn(new_cr3));
/*
* Careful! When context switching between two vcpus, both of which
@@ -183,6 +180,8 @@ unsigned long pt_maybe_shadow(struct vcpu *v)
sizeof(*l4t) * slot);
memcpy(&l4t[slot + 1], &vcpu_l4t[slot + 1],
sizeof(*l4t) * (L4_PAGETABLE_ENTRIES - (slot + 1)));
+
+ unmap_domain_page(vcpu_l4t);
}
return ptsh->shadow_l4;
@@ -219,13 +218,11 @@ static void _pt_shadow_ipi(void *arg)
case PTSH_IPI_WRITE:
l4t = ptsh->shadow_l4_va;
-
- /* Reuse the mapping established in pt_maybe_shadow(). */
- ASSERT(l1e_get_paddr(*percpu_fixmap_l1e(cpu, PERCPU_FIXSLOT_SHADOW)) ==
- maddr);
- vcpu_l4t = percpu_fix_to_virt(cpu, PERCPU_FIXSLOT_SHADOW);
+ vcpu_l4t = map_domain_page(maddr_to_mfn(maddr));
l4t[info->slot] = vcpu_l4t[info->slot];
+
+ unmap_domain_page(vcpu_l4t);
break;
default:
diff --git a/xen/include/asm-x86/fixmap.h b/xen/include/asm-x86/fixmap.h
index c1b3bda..89bf6cb 100644
--- a/xen/include/asm-x86/fixmap.h
+++ b/xen/include/asm-x86/fixmap.h
@@ -27,10 +27,6 @@
#include <asm/msi.h>
#include <acpi/apei.h>
-#define NR_PERCPU_SLOTS 2
-#define PERCPU_FIXSLOT_SHADOW 0
-#define PERCPU_FIXSLOT_LINEAR 1
-
/*
* Here we define all the compile-time 'special' virtual
* addresses. The point is to have a constant address at
@@ -49,8 +45,6 @@ enum fixed_addresses {
FIX_COM_BEGIN,
FIX_COM_END,
FIX_EHCI_DBGP,
- FIX_PERCPU_BEGIN,
- FIX_PERCPU_END = FIX_PERCPU_BEGIN + (NR_CPUS - 1) * NR_PERCPU_SLOTS,
/* Everything else should go further down. */
FIX_APIC_BASE,
FIX_IO_APIC_BASE_0,
@@ -93,32 +87,6 @@ static inline unsigned long virt_to_fix(const unsigned long
vaddr)
return __virt_to_fix(vaddr);
}
-static inline void *percpu_fix_to_virt(unsigned int cpu, unsigned int slot)
-{
- return (void *)fix_to_virt(FIX_PERCPU_BEGIN + (slot * NR_CPUS) + cpu);
-}
-
-static inline l1_pgentry_t *percpu_fixmap_l1e(unsigned int cpu, unsigned int
slot)
-{
- BUILD_BUG_ON(FIX_PERCPU_END >= L1_PAGETABLE_ENTRIES);
-
- return &l1_fixmap[l1_table_offset((unsigned long)percpu_fix_to_virt(cpu,
slot))];
-}
-
-static inline void set_percpu_fixmap(unsigned int cpu, unsigned int slot,
l1_pgentry_t l1e)
-{
- l1_pgentry_t *pl1e = percpu_fixmap_l1e(cpu, slot);
-
- if ( l1e_get_intpte(*pl1e) != l1e_get_intpte(l1e) )
- {
- *pl1e = l1e;
-
- __asm__ __volatile__ ( "invlpg %0"
- :: "m" (*(char *)percpu_fix_to_virt(cpu, slot))
- : "memory" );
- }
-}
-
#endif /* __ASSEMBLY__ */
#endif
--
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 |