]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blob - src/patches/60068_xen-x86_64-pgd-pin.patch1
Imported xen patches.
[people/pmueller/ipfire-2.x.git] / src / patches / 60068_xen-x86_64-pgd-pin.patch1
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