[PATCH 16 of 36] x86/paravirt: add a pgd_alloc/free hooks

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Jeremy Fitzhardinge
Date: Tuesday, June 24, 2008 - 9:19 pm

Add hooks which are called at pgd_alloc/free time.  The pgd_alloc hook
may return an error code, which if non-zero, causes the pgd allocation
to be failed.  The hooks may be used to allocate/free auxillary
per-pgd information.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
---
 arch/x86/kernel/paravirt.c |    4 ++++
 arch/x86/mm/pgtable.c      |   13 ++++++++-----
 arch/x86/xen/enlighten.c   |    4 ++++
 include/asm-x86/paravirt.h |   19 ++++++++++++++++++-
 include/asm-x86/pgalloc.h  |    4 ++++
 5 files changed, 38 insertions(+), 6 deletions(-)

diff --git a/arch/x86/kernel/paravirt.c b/arch/x86/kernel/paravirt.c
--- a/arch/x86/kernel/paravirt.c
+++ b/arch/x86/kernel/paravirt.c
@@ -30,6 +30,7 @@
 #include <asm/setup.h>
 #include <asm/arch_hooks.h>
 #include <asm/time.h>
+#include <asm/pgalloc.h>
 #include <asm/irq.h>
 #include <asm/delay.h>
 #include <asm/fixmap.h>
@@ -369,6 +370,9 @@
 	.flush_tlb_single = native_flush_tlb_single,
 	.flush_tlb_others = native_flush_tlb_others,
 
+	.pgd_alloc = __paravirt_pgd_alloc,
+	.pgd_free = paravirt_nop,
+
 	.alloc_pte = paravirt_nop,
 	.alloc_pmd = paravirt_nop,
 	.alloc_pmd_clone = paravirt_nop,
diff --git a/arch/x86/mm/pgtable.c b/arch/x86/mm/pgtable.c
--- a/arch/x86/mm/pgtable.c
+++ b/arch/x86/mm/pgtable.c
@@ -215,13 +215,15 @@
 
 	/* so that alloc_pmd can use it */
 	mm->pgd = pgd;
-	if (pgd)
+	if (pgd) {
 		pgd_ctor(pgd);
 
-	if (pgd && !pgd_prepopulate_pmd(mm, pgd)) {
-		pgd_dtor(pgd);
-		free_page((unsigned long)pgd);
-		pgd = NULL;
+		if (paravirt_pgd_alloc(mm) != 0 ||
+		    !pgd_prepopulate_pmd(mm, pgd)) {
+			pgd_dtor(pgd);
+			free_page((unsigned long)pgd);
+			pgd = NULL;
+		}
 	}
 
 	return pgd;
@@ -231,6 +233,7 @@
 {
 	pgd_mop_up_pmds(mm, pgd);
 	pgd_dtor(pgd);
+	paravirt_pgd_free(mm, pgd);
 	free_page((unsigned long)pgd);
 }
 
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c
--- a/arch/x86/xen/enlighten.c
+++ b/arch/x86/xen/enlighten.c
@@ -45,6 +45,7 @@
 #include <asm/pgtable.h>
 #include <asm/tlbflush.h>
 #include <asm/reboot.h>
+#include <asm/pgalloc.h>
 
 #include "xen-ops.h"
 #include "mmu.h"
@@ -1151,6 +1152,9 @@
 	.pte_update = paravirt_nop,
 	.pte_update_defer = paravirt_nop,
 
+	.pgd_alloc = __paravirt_pgd_alloc,
+	.pgd_free = paravirt_nop,
+
 	.alloc_pte = xen_alloc_pte_init,
 	.release_pte = xen_release_pte_init,
 	.alloc_pmd = xen_alloc_pte_init,
diff --git a/include/asm-x86/paravirt.h b/include/asm-x86/paravirt.h
--- a/include/asm-x86/paravirt.h
+++ b/include/asm-x86/paravirt.h
@@ -220,7 +220,14 @@
 	void (*flush_tlb_others)(const cpumask_t *cpus, struct mm_struct *mm,
 				 unsigned long va);
 
-	/* Hooks for allocating/releasing pagetable pages */
+	/* Hooks for allocating and freeing a pagetable top-level */
+	int  (*pgd_alloc)(struct mm_struct *mm);
+	void (*pgd_free)(struct mm_struct *mm, pgd_t *pgd);
+
+	/*
+	 * Hooks for allocating/releasing pagetable pages when they're
+	 * attached to a pagetable
+	 */
 	void (*alloc_pte)(struct mm_struct *mm, u32 pfn);
 	void (*alloc_pmd)(struct mm_struct *mm, u32 pfn);
 	void (*alloc_pmd_clone)(u32 pfn, u32 clonepfn, u32 start, u32 count);
@@ -926,6 +933,16 @@
 	PVOP_VCALL3(pv_mmu_ops.flush_tlb_others, &cpumask, mm, va);
 }
 
+static inline int paravirt_pgd_alloc(struct mm_struct *mm)
+{
+	return PVOP_CALL1(int, pv_mmu_ops.pgd_alloc, mm);
+}
+
+static inline void paravirt_pgd_free(struct mm_struct *mm, pgd_t *pgd)
+{
+	PVOP_VCALL2(pv_mmu_ops.pgd_free, mm, pgd);
+}
+
 static inline void paravirt_alloc_pte(struct mm_struct *mm, unsigned pfn)
 {
 	PVOP_VCALL2(pv_mmu_ops.alloc_pte, mm, pfn);
diff --git a/include/asm-x86/pgalloc.h b/include/asm-x86/pgalloc.h
--- a/include/asm-x86/pgalloc.h
+++ b/include/asm-x86/pgalloc.h
@@ -5,9 +5,13 @@
 #include <linux/mm.h>		/* for struct page */
 #include <linux/pagemap.h>
 
+static inline int  __paravirt_pgd_alloc(struct mm_struct *mm) { return 0; }
+
 #ifdef CONFIG_PARAVIRT
 #include <asm/paravirt.h>
 #else
+#define paravirt_pgd_alloc(mm)	__paravirt_pgd_alloc(mm)
+static inline void paravirt_pgd_free(struct mm_struct *mm, pgd_t *) {}
 static inline void paravirt_alloc_pte(struct mm_struct *mm, unsigned long pfn)	{}
 static inline void paravirt_alloc_pmd(struct mm_struct *mm, unsigned long pfn)	{}
 static inline void paravirt_alloc_pmd_clone(unsigned long pfn, unsigned long clonepfn,


--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[PATCH 00 of 36] x86/paravirt: groundwork for 64-bit Xen s ..., Jeremy Fitzhardinge, (Tue Jun 24, 9:18 pm)
[PATCH 01 of 36] x86: asm-x86/pgtable.h: fix compiler warning, Jeremy Fitzhardinge, (Tue Jun 24, 9:18 pm)
[PATCH 02 of 36] x86: add memory clobber to save/loadsegment, Jeremy Fitzhardinge, (Tue Jun 24, 9:18 pm)
[PATCH 03 of 36] x86: add memory barriers to wrmsr, Jeremy Fitzhardinge, (Tue Jun 24, 9:18 pm)
[PATCH 04 of 36] x86: remove open-coded save/load segment ..., Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 05 of 36] x86_64: use write_gdt_entry in vsyscall_s ..., Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 06 of 36] x86_64: use p??_populate() to attach page ..., Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 07 of 36] x86_64: unify early_ioremap, Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 08 of 36] x86_64: Add gate_offset() and gate_segmen ..., Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 09 of 36] x86_64: Use __pgd() on mk_kernel_pgd(), Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 10 of 36] x86: unify pgd_index, Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 11 of 36] x86: unify mmu_context.h, Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 12 of 36] x86_64: replace end_pfn with num_physpages, Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 13 of 36] x86_64: add prototype for x86_64_start_ke ..., Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 14 of 36] x86_64: add sync_cmpxchg, Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 15 of 36] x86: simplify vmalloc_sync_all, Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 16 of 36] x86/paravirt: add a pgd_alloc/free hooks, Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 17 of 36] x86: preallocate and prepopulate separately, Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 18 of 36] x86/paravirt: add debugging for missing o ..., Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 19 of 36] paravirt_ops: define PARA_INDIRECT for in ..., Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 20 of 36] paravirt/x86_64: move __PAGE_OFFSET to le ..., Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 21 of 36] x86-64: add FIX_PARAVIRT_BOOTMAP fixmap slot, Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 22 of 36] x86_64: split x86_64_start_kernel, Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 23 of 36] x86_64: adjust mapping of physical pageta ..., Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 24 of 36] x86_64: create small vmemmap mappings if ..., Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 25 of 36] x86_64: PSE no longer a hard requirement, Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 26 of 36] x86_64: Split set_pte_vaddr(), Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 27 of 36] x86_64: __switch_to(): Move arch_leave_la ..., Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 28 of 36] Save %fs and %gs before load_TLS() and ar ..., Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 29 of 36] Use __KERNEL_DS as SS when returning to a ..., Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 30 of 36] x86/paravirt_ops: split sysret and sysexit, Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 31 of 36] x86_64 pvops: don't restore user rsp with ..., Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 32 of 36] Add sysret/sysexit pvops for returning to ..., Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 33 of 36] x86_64: ia32entry: replace privileged ins ..., Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 34 of 36] x86_64: swapgs pvop with a user-stack can ..., Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 35 of 36] x86_64/paravirt: add adjust_exception_frame, Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 36 of 36] x86_64/paravirt: Make load_gs_index() a p ..., Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
Re: [PATCH 03 of 36] x86: add memory barriers to wrmsr, Arjan van de Ven, (Tue Jun 24, 9:44 pm)
Re: [PATCH 00 of 36] x86/paravirt: groundwork for 64-bit X ..., Jeremy Fitzhardinge, (Wed Jun 25, 4:46 am)
Re: [PATCH 36 of 36] x86_64/paravirt: Make load_gs_index() ..., Jeremy Fitzhardinge, (Wed Jun 25, 4:48 am)
Re: [PATCH 00 of 36] x86/paravirt: groundwork for 64-bit X ..., Jeremy Fitzhardinge, (Wed Jun 25, 1:03 pm)
Re: [PATCH 00 of 36] x86/paravirt: groundwork for 64-bit X ..., Jeremy Fitzhardinge, (Wed Jun 25, 1:12 pm)
Re: [PATCH 03 of 36] x86: add memory barriers to wrmsr, Jeremy Fitzhardinge, (Wed Jun 25, 2:08 pm)
Re: [PATCH 03 of 36] x86: add memory barriers to wrmsr, Arjan van de Ven, (Wed Jun 25, 3:31 pm)
Re: [PATCH 03 of 36] x86: add memory barriers to wrmsr, Jeremy Fitzhardinge, (Wed Jun 25, 4:05 pm)
Re: [PATCH 03 of 36] x86: add memory barriers to wrmsr, H. Peter Anvin, (Wed Jun 25, 4:18 pm)
Re: [PATCH 03 of 36] x86: add memory barriers to wrmsr, Jeremy Fitzhardinge, (Wed Jun 25, 4:37 pm)
Re: [PATCH 03 of 36] x86: add memory barriers to wrmsr, H. Peter Anvin, (Wed Jun 25, 4:42 pm)
Re: [PATCH 00 of 36] x86/paravirt: groundwork for 64-bit X ..., Jeremy Fitzhardinge, (Thu Jun 26, 7:28 am)
Re: [Xen-devel] Re: [PATCH 00 of 36] x86/paravirt: groundw ..., Jeremy Fitzhardinge, (Thu Jun 26, 7:34 am)
Re: [PATCH 00 of 36] x86/paravirt: groundwork for 64-bit X ..., Jeremy Fitzhardinge, (Thu Jun 26, 11:25 am)
Re: [PATCH 00 of 36] x86/paravirt: groundwork for 64-bit X ..., Jeremy Fitzhardinge, (Thu Jun 26, 12:02 pm)
Re: [Xen-devel] Re: [PATCH 00 of 36] x86/paravirt: groundw ..., Jeremy Fitzhardinge, (Fri Jun 27, 9:02 am)
Re: [Xen-devel] Re: [PATCH 00 of 36] x86/paravirt: groundw ..., Jeremy Fitzhardinge, (Fri Jun 27, 9:25 am)
Re: [Xen-devel] Re: [PATCH 00 of 36] x86/paravirt: groundw ..., Jeremy Fitzhardinge, (Fri Jun 27, 12:04 pm)
Re: [Xen-devel] Re: [PATCH 00 of 36] x86/paravirt: groundw ..., Jeremy Fitzhardinge, (Sun Jun 29, 8:02 pm)
Re: [Xen-devel] Re: [PATCH 00 of 36] x86/paravirt: groundw ..., Jeremy Fitzhardinge, (Sun Jun 29, 10:32 pm)
Re: [Xen-devel] Re: [PATCH 00 of 36] x86/paravirt: groundw ..., Jeremy Fitzhardinge, (Mon Jun 30, 10:17 am)
Re: [Xen-devel] Re: [PATCH 00 of 36] x86/paravirt: groundw ..., Jeremy Fitzhardinge, (Mon Jun 30, 10:57 am)
Re: [Xen-devel] Re: [PATCH 00 of 36] x86/paravirt: groundw ..., Jeremy Fitzhardinge, (Mon Jun 30, 11:36 am)
Re: [Xen-devel] Re: [PATCH 00 of 36] x86/paravirt: groundw ..., Jeremy Fitzhardinge, (Mon Jun 30, 4:04 pm)
Re: [Xen-devel] Re: [PATCH 00 of 36] x86/paravirt: groundw ..., Jeremy Fitzhardinge, (Tue Jul 1, 9:10 am)
Re: [Xen-devel] Re: [PATCH 00 of 36] x86/paravirt: groundw ..., Jeremy Fitzhardinge, (Tue Jul 1, 9:14 am)
Re: [Xen-devel] Re: [PATCH 00 of 36] x86/paravirt: groundw ..., Jeremy Fitzhardinge, (Thu Jul 3, 8:47 am)
Re: [Xen-devel] Re: [PATCH 00 of 36] x86/paravirt: groundw ..., Jeremy Fitzhardinge, (Thu Jul 3, 11:25 am)
Re: [Xen-devel] Re: [PATCH 00 of 36] x86/paravirt: groundw ..., Jeremy Fitzhardinge, (Thu Jul 3, 11:41 am)