]>
Commit | Line | Data |
---|---|---|
cc90b958 BS |
1 | From: http://xenbits.xensource.com/linux-2.6.18-xen.hg?rev/39a8680e7a70 |
2 | # HG changeset 747 patch | |
3 | # User Keir Fraser <keir.fraser@citrix.com> | |
4 | # Date 1227879058 0 | |
5 | # Node ID 39a8680e7a70a28ce639c507fb6a9bc0aa7d8f14 | |
6 | # Parent d545a95fca739d0b1963b73a9eb64ea64a244e76 | |
7 | Subject: linux/x86: revert the effect of xen_limit_pages_to_max_mfn() | |
8 | Patch-mainline: obsolete | |
9 | ||
10 | Signed-off-by: Jan Beulich <jbeulich@novell.com> | |
11 | ||
12 | Index: head-2008-12-01/arch/x86/mm/hypervisor.c | |
13 | =================================================================== | |
14 | --- head-2008-12-01.orig/arch/x86/mm/hypervisor.c 2008-10-29 09:55:56.000000000 +0100 | |
15 | +++ head-2008-12-01/arch/x86/mm/hypervisor.c 2008-12-01 11:25:57.000000000 +0100 | |
16 | @@ -374,6 +374,15 @@ void xen_destroy_contiguous_region(unsig | |
17 | } | |
18 | EXPORT_SYMBOL_GPL(xen_destroy_contiguous_region); | |
19 | ||
20 | +static void undo_limit_pages(struct page *pages, unsigned int order) | |
21 | +{ | |
22 | + BUG_ON(xen_feature(XENFEAT_auto_translated_physmap)); | |
23 | + BUG_ON(order > MAX_CONTIG_ORDER); | |
24 | + xen_limit_pages_to_max_mfn(pages, order, 0); | |
25 | + ClearPageForeign(pages); | |
26 | + __free_pages(pages, order); | |
27 | +} | |
28 | + | |
29 | int xen_limit_pages_to_max_mfn( | |
30 | struct page *pages, unsigned int order, unsigned int address_bits) | |
31 | { | |
32 | @@ -402,16 +411,28 @@ int xen_limit_pages_to_max_mfn( | |
33 | if (unlikely(order > MAX_CONTIG_ORDER)) | |
34 | return -ENOMEM; | |
35 | ||
36 | - bitmap_zero(limit_map, 1U << order); | |
37 | + if (address_bits) { | |
38 | + if (address_bits < PAGE_SHIFT) | |
39 | + return -EINVAL; | |
40 | + bitmap_zero(limit_map, 1U << order); | |
41 | + } else if (order) { | |
42 | + BUILD_BUG_ON(sizeof(pages->index) != sizeof(*limit_map)); | |
43 | + for (i = 0; i < BITS_TO_LONGS(1U << order); ++i) | |
44 | + limit_map[i] = pages[i + 1].index; | |
45 | + } else | |
46 | + __set_bit(0, limit_map); | |
47 | + | |
48 | set_xen_guest_handle(exchange.in.extent_start, in_frames); | |
49 | set_xen_guest_handle(exchange.out.extent_start, out_frames); | |
50 | ||
51 | /* 0. Scrub the pages. */ | |
52 | for (i = 0, n = 0; i < 1U<<order ; i++) { | |
53 | page = &pages[i]; | |
54 | - if (!(pfn_to_mfn(page_to_pfn(page)) >> (address_bits - PAGE_SHIFT))) | |
55 | - continue; | |
56 | - __set_bit(i, limit_map); | |
57 | + if (address_bits) { | |
58 | + if (!(pfn_to_mfn(page_to_pfn(page)) >> (address_bits - PAGE_SHIFT))) | |
59 | + continue; | |
60 | + __set_bit(i, limit_map); | |
61 | + } | |
62 | ||
63 | if (!PageHighMem(page)) | |
64 | scrub_pages(page_address(page), 1); | |
65 | @@ -497,7 +518,19 @@ int xen_limit_pages_to_max_mfn( | |
66 | ||
67 | balloon_unlock(flags); | |
68 | ||
69 | - return success ? 0 : -ENOMEM; | |
70 | + if (!success) | |
71 | + return -ENOMEM; | |
72 | + | |
73 | + if (address_bits) { | |
74 | + if (order) { | |
75 | + BUILD_BUG_ON(sizeof(*limit_map) != sizeof(pages->index)); | |
76 | + for (i = 0; i < BITS_TO_LONGS(1U << order); ++i) | |
77 | + pages[i + 1].index = limit_map[i]; | |
78 | + } | |
79 | + SetPageForeign(pages, undo_limit_pages); | |
80 | + } | |
81 | + | |
82 | + return 0; | |
83 | } | |
84 | EXPORT_SYMBOL_GPL(xen_limit_pages_to_max_mfn); | |
85 | ||
86 | Index: head-2008-12-01/arch/x86/mm/pgtable_32-xen.c | |
87 | =================================================================== | |
88 | --- head-2008-12-01.orig/arch/x86/mm/pgtable_32-xen.c 2007-10-09 11:48:25.000000000 +0200 | |
89 | +++ head-2008-12-01/arch/x86/mm/pgtable_32-xen.c 2008-12-01 11:25:57.000000000 +0100 | |
90 | @@ -152,6 +152,12 @@ pte_t *pte_alloc_one_kernel(struct mm_st | |
91 | return pte; | |
92 | } | |
93 | ||
94 | +static void _pte_free(struct page *page, unsigned int order) | |
95 | +{ | |
96 | + BUG_ON(order); | |
97 | + pte_free(page); | |
98 | +} | |
99 | + | |
100 | struct page *pte_alloc_one(struct mm_struct *mm, unsigned long address) | |
101 | { | |
102 | struct page *pte; | |
103 | @@ -162,7 +168,7 @@ struct page *pte_alloc_one(struct mm_str | |
104 | pte = alloc_pages(GFP_KERNEL|__GFP_REPEAT|__GFP_ZERO, 0); | |
105 | #endif | |
106 | if (pte) { | |
107 | - SetPageForeign(pte, pte_free); | |
108 | + SetPageForeign(pte, _pte_free); | |
109 | init_page_count(pte); | |
110 | } | |
111 | return pte; | |
112 | Index: head-2008-12-01/arch/x86/mm/pageattr_64-xen.c | |
113 | =================================================================== | |
114 | --- head-2008-12-01.orig/arch/x86/mm/pageattr_64-xen.c 2008-07-21 11:00:32.000000000 +0200 | |
115 | +++ head-2008-12-01/arch/x86/mm/pageattr_64-xen.c 2008-12-01 11:25:57.000000000 +0100 | |
116 | @@ -248,13 +248,19 @@ void _arch_exit_mmap(struct mm_struct *m | |
117 | mm_unpin(mm); | |
118 | } | |
119 | ||
120 | +static void _pte_free(struct page *page, unsigned int order) | |
121 | +{ | |
122 | + BUG_ON(order); | |
123 | + pte_free(page); | |
124 | +} | |
125 | + | |
126 | struct page *pte_alloc_one(struct mm_struct *mm, unsigned long address) | |
127 | { | |
128 | struct page *pte; | |
129 | ||
130 | pte = alloc_pages(GFP_KERNEL|__GFP_REPEAT|__GFP_ZERO, 0); | |
131 | if (pte) { | |
132 | - SetPageForeign(pte, pte_free); | |
133 | + SetPageForeign(pte, _pte_free); | |
134 | init_page_count(pte); | |
135 | } | |
136 | return pte; | |
137 | Index: head-2008-12-01/drivers/xen/core/gnttab.c | |
138 | =================================================================== | |
139 | --- head-2008-12-01.orig/drivers/xen/core/gnttab.c 2008-12-01 11:23:17.000000000 +0100 | |
140 | +++ head-2008-12-01/drivers/xen/core/gnttab.c 2008-12-01 11:25:57.000000000 +0100 | |
141 | @@ -505,8 +505,9 @@ static int gnttab_map(unsigned int start | |
142 | return 0; | |
143 | } | |
144 | ||
145 | -static void gnttab_page_free(struct page *page) | |
146 | +static void gnttab_page_free(struct page *page, unsigned int order) | |
147 | { | |
148 | + BUG_ON(order); | |
149 | ClearPageForeign(page); | |
150 | gnttab_reset_grant_page(page); | |
151 | put_page(page); | |
152 | Index: head-2008-12-01/drivers/xen/netback/netback.c | |
153 | =================================================================== | |
154 | --- head-2008-12-01.orig/drivers/xen/netback/netback.c 2008-12-01 11:23:17.000000000 +0100 | |
155 | +++ head-2008-12-01/drivers/xen/netback/netback.c 2008-12-01 11:25:57.000000000 +0100 | |
156 | @@ -55,7 +55,6 @@ struct netbk_tx_pending_inuse { | |
157 | }; | |
158 | ||
159 | static void netif_idx_release(u16 pending_idx); | |
160 | -static void netif_page_release(struct page *page); | |
161 | static void make_tx_response(netif_t *netif, | |
162 | netif_tx_request_t *txp, | |
163 | s8 st); | |
164 | @@ -1436,8 +1435,9 @@ static void netif_idx_release(u16 pendin | |
165 | tasklet_schedule(&net_tx_tasklet); | |
166 | } | |
167 | ||
168 | -static void netif_page_release(struct page *page) | |
169 | +static void netif_page_release(struct page *page, unsigned int order) | |
170 | { | |
171 | + BUG_ON(order); | |
172 | netif_idx_release(netif_page_index(page)); | |
173 | } | |
174 | ||
175 | Index: head-2008-12-01/include/linux/page-flags.h | |
176 | =================================================================== | |
177 | --- head-2008-12-01.orig/include/linux/page-flags.h 2008-12-01 11:23:17.000000000 +0100 | |
178 | +++ head-2008-12-01/include/linux/page-flags.h 2008-12-01 11:25:57.000000000 +0100 | |
179 | @@ -275,15 +275,15 @@ CLEARPAGEFLAG(Uptodate, uptodate) | |
180 | #define PageForeign(page) test_bit(PG_foreign, &(page)->flags) | |
181 | #define SetPageForeign(_page, dtor) do { \ | |
182 | set_bit(PG_foreign, &(_page)->flags); \ | |
183 | - BUG_ON((dtor) == (void (*)(struct page *))0); \ | |
184 | + BUG_ON((dtor) == (void (*)(struct page *, unsigned int))0); \ | |
185 | (_page)->index = (long)(dtor); \ | |
186 | } while (0) | |
187 | #define ClearPageForeign(page) do { \ | |
188 | clear_bit(PG_foreign, &(page)->flags); \ | |
189 | (page)->index = 0; \ | |
190 | } while (0) | |
191 | -#define PageForeignDestructor(_page) \ | |
192 | - ((void (*)(struct page *))(_page)->index)(_page) | |
193 | +#define PageForeignDestructor(_page, order) \ | |
194 | + ((void (*)(struct page *, unsigned int))(_page)->index)(_page, order) | |
195 | ||
196 | extern void cancel_dirty_page(struct page *page, unsigned int account_size); | |
197 | ||
198 | Index: head-2008-12-01/mm/page_alloc.c | |
199 | =================================================================== | |
200 | --- head-2008-12-01.orig/mm/page_alloc.c 2008-12-01 11:23:17.000000000 +0100 | |
201 | +++ head-2008-12-01/mm/page_alloc.c 2008-12-01 11:25:57.000000000 +0100 | |
202 | @@ -535,7 +535,7 @@ static void __free_pages_ok(struct page | |
203 | ||
204 | #ifdef CONFIG_XEN | |
205 | if (PageForeign(page)) { | |
206 | - PageForeignDestructor(page); | |
207 | + PageForeignDestructor(page, order); | |
208 | return; | |
209 | } | |
210 | #endif | |
211 | @@ -1003,7 +1003,7 @@ static void free_hot_cold_page(struct pa | |
212 | ||
213 | #ifdef CONFIG_XEN | |
214 | if (PageForeign(page)) { | |
215 | - PageForeignDestructor(page); | |
216 | + PageForeignDestructor(page, 0); | |
217 | return; | |
218 | } | |
219 | #endif |