]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blame - 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
CommitLineData
cc90b958
BS
1From: 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
7Subject: linux/x86: revert the effect of xen_limit_pages_to_max_mfn()
8Patch-mainline: obsolete
9
10Signed-off-by: Jan Beulich <jbeulich@novell.com>
11
12Index: 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
86Index: 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;
112Index: 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;
137Index: 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);
152Index: 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
175Index: 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
198Index: 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