]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blame - src/patches/60068_xen-x86_64-pgd-pin.patch1
Fix collectd thermal-zone disabling
[people/pmueller/ipfire-2.x.git] / src / patches / 60068_xen-x86_64-pgd-pin.patch1
CommitLineData
cc90b958
BS
1From: jbeulich@novell.com
2Subject: make pinning of pgd pairs transparent to callers
3Patch-mainline: obsolete
4
5Index: 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)
62Index: 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)
79Index: 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 }
105Index: 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