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