]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blob - src/patches/suse-2.6.27.25/patches.xen/xen-x86_64-pgd-pin
Corrected links and text on ids.cgi
[people/pmueller/ipfire-2.x.git] / src / patches / suse-2.6.27.25 / patches.xen / xen-x86_64-pgd-pin
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