]>
Commit | Line | Data |
---|---|---|
cc90b958 BS |
1 | From: jbeulich@novell.com |
2 | Subject: make pinning of pgd pairs transparent to callers | |
3 | Patch-mainline: obsolete | |
4 | ||
5 | Index: head-2008-12-01/arch/x86/mm/hypervisor.c | |
6 | =================================================================== | |
7 | --- head-2008-12-01.orig/arch/x86/mm/hypervisor.c 2008-12-01 12:13:06.000000000 +0100 | |
8 | +++ head-2008-12-01/arch/x86/mm/hypervisor.c 2008-12-01 12:13:22.000000000 +0100 | |
9 | @@ -517,26 +517,38 @@ void xen_invlpg_mask(cpumask_t *mask, un | |
10 | ||
11 | #endif /* CONFIG_SMP */ | |
12 | ||
13 | -void xen_pgd_pin(unsigned long ptr) | |
14 | -{ | |
15 | - struct mmuext_op op; | |
16 | #ifdef CONFIG_X86_64 | |
17 | - op.cmd = MMUEXT_PIN_L4_TABLE; | |
18 | -#elif defined(CONFIG_X86_PAE) | |
19 | - op.cmd = MMUEXT_PIN_L3_TABLE; | |
20 | +#define NR_PGD_PIN_OPS 2 | |
21 | #else | |
22 | - op.cmd = MMUEXT_PIN_L2_TABLE; | |
23 | +#define NR_PGD_PIN_OPS 1 | |
24 | #endif | |
25 | - op.arg1.mfn = pfn_to_mfn(ptr >> PAGE_SHIFT); | |
26 | - BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0); | |
27 | + | |
28 | +void xen_pgd_pin(pgd_t *pgd) | |
29 | +{ | |
30 | + struct mmuext_op op[NR_PGD_PIN_OPS]; | |
31 | + | |
32 | + op[0].cmd = MMUEXT_PIN_L3_TABLE; | |
33 | + op[0].arg1.mfn = pfn_to_mfn(__pa(pgd) >> PAGE_SHIFT); | |
34 | +#ifdef CONFIG_X86_64 | |
35 | + op[1].cmd = op[0].cmd = MMUEXT_PIN_L4_TABLE; | |
36 | + op[1].arg1.mfn = pfn_to_mfn(__pa(__user_pgd(pgd)) >> PAGE_SHIFT); | |
37 | +#endif | |
38 | + if (HYPERVISOR_mmuext_op(op, NR_PGD_PIN_OPS, NULL, DOMID_SELF) < 0) | |
39 | + BUG(); | |
40 | } | |
41 | ||
42 | -void xen_pgd_unpin(unsigned long ptr) | |
43 | +void xen_pgd_unpin(pgd_t *pgd) | |
44 | { | |
45 | - struct mmuext_op op; | |
46 | - op.cmd = MMUEXT_UNPIN_TABLE; | |
47 | - op.arg1.mfn = pfn_to_mfn(ptr >> PAGE_SHIFT); | |
48 | - BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0); | |
49 | + struct mmuext_op op[NR_PGD_PIN_OPS]; | |
50 | + | |
51 | + op[0].cmd = MMUEXT_UNPIN_TABLE; | |
52 | + op[0].arg1.mfn = pfn_to_mfn(__pa(pgd) >> PAGE_SHIFT); | |
53 | +#ifdef CONFIG_X86_64 | |
54 | + op[1].cmd = MMUEXT_UNPIN_TABLE; | |
55 | + op[1].arg1.mfn = pfn_to_mfn(__pa(__user_pgd(pgd)) >> PAGE_SHIFT); | |
56 | +#endif | |
57 | + if (HYPERVISOR_mmuext_op(op, NR_PGD_PIN_OPS, NULL, DOMID_SELF) < 0) | |
58 | + BUG(); | |
59 | } | |
60 | ||
61 | void xen_set_ldt(const void *ptr, unsigned int ents) | |
62 | Index: head-2008-12-01/arch/x86/mm/init_64-xen.c | |
63 | =================================================================== | |
64 | --- head-2008-12-01.orig/arch/x86/mm/init_64-xen.c 2008-12-01 12:13:13.000000000 +0100 | |
65 | +++ head-2008-12-01/arch/x86/mm/init_64-xen.c 2008-12-01 12:13:22.000000000 +0100 | |
66 | @@ -629,10 +629,8 @@ void __init xen_init_pt(void) | |
67 | early_make_page_readonly(level1_fixmap_pgt, | |
68 | XENFEAT_writable_page_tables); | |
69 | ||
70 | - if (!xen_feature(XENFEAT_writable_page_tables)) { | |
71 | - xen_pgd_pin(__pa_symbol(init_level4_pgt)); | |
72 | - xen_pgd_pin(__pa_symbol(__user_pgd(init_level4_pgt))); | |
73 | - } | |
74 | + if (!xen_feature(XENFEAT_writable_page_tables)) | |
75 | + xen_pgd_pin(init_level4_pgt); | |
76 | } | |
77 | ||
78 | static void __init extend_init_mapping(unsigned long tables_space) | |
79 | Index: head-2008-12-01/arch/x86/mm/pgtable-xen.c | |
80 | =================================================================== | |
81 | --- head-2008-12-01.orig/arch/x86/mm/pgtable-xen.c 2008-12-01 12:13:16.000000000 +0100 | |
82 | +++ head-2008-12-01/arch/x86/mm/pgtable-xen.c 2008-12-01 12:13:22.000000000 +0100 | |
83 | @@ -347,19 +347,13 @@ static void __pgd_pin(pgd_t *pgd) | |
84 | { | |
85 | pgd_walk(pgd, PAGE_KERNEL_RO); | |
86 | kmap_flush_unused(); | |
87 | - xen_pgd_pin(__pa(pgd)); /* kernel */ | |
88 | -#ifdef CONFIG_X86_64 | |
89 | - xen_pgd_pin(__pa(__user_pgd(pgd))); /* user */ | |
90 | -#endif | |
91 | + xen_pgd_pin(pgd); | |
92 | SetPagePinned(virt_to_page(pgd)); | |
93 | } | |
94 | ||
95 | static void __pgd_unpin(pgd_t *pgd) | |
96 | { | |
97 | - xen_pgd_unpin(__pa(pgd)); | |
98 | -#ifdef CONFIG_X86_64 | |
99 | - xen_pgd_unpin(__pa(__user_pgd(pgd))); | |
100 | -#endif | |
101 | + xen_pgd_unpin(pgd); | |
102 | pgd_walk(pgd, PAGE_KERNEL); | |
103 | ClearPagePinned(virt_to_page(pgd)); | |
104 | } | |
105 | Index: head-2008-12-01/include/asm-x86/mach-xen/asm/hypervisor.h | |
106 | =================================================================== | |
107 | --- head-2008-12-01.orig/include/asm-x86/mach-xen/asm/hypervisor.h 2008-12-01 12:13:06.000000000 +0100 | |
108 | +++ head-2008-12-01/include/asm-x86/mach-xen/asm/hypervisor.h 2008-12-01 12:13:22.000000000 +0100 | |
109 | @@ -95,8 +95,8 @@ void xen_l1_entry_update(pte_t *ptr, pte | |
110 | void xen_l2_entry_update(pmd_t *ptr, pmd_t val); | |
111 | void xen_l3_entry_update(pud_t *ptr, pud_t val); /* x86_64/PAE */ | |
112 | void xen_l4_entry_update(pgd_t *ptr, int user, pgd_t val); /* x86_64 only */ | |
113 | -void xen_pgd_pin(unsigned long ptr); | |
114 | -void xen_pgd_unpin(unsigned long ptr); | |
115 | +void xen_pgd_pin(pgd_t *); | |
116 | +void xen_pgd_unpin(pgd_t *); | |
117 | ||
118 | void xen_init_pgd_pin(void); | |
119 |