]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blob - src/patches/60021_747-x86-undo-mfn-limit.patch1
Fix core28 updater kernel version
[people/pmueller/ipfire-2.x.git] / src / patches / 60021_747-x86-undo-mfn-limit.patch1
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