Lines 87-94
static void vunmap_page_range(unsigned long addr, unsigned long end)
Link Here
|
87 |
} while (pgd++, addr = next, addr != end); |
87 |
} while (pgd++, addr = next, addr != end); |
88 |
} |
88 |
} |
89 |
|
89 |
|
90 |
static int vmap_pte_range(pmd_t *pmd, unsigned long addr, |
90 |
static int vmap_pte_range(pmd_t *pmd, unsigned long addr, unsigned long end, |
91 |
unsigned long end, pgprot_t prot, struct page **pages, int *nr) |
91 |
pgprot_t prot, struct page **pages, int *nr, gfp_t gfp_mask) |
92 |
{ |
92 |
{ |
93 |
pte_t *pte; |
93 |
pte_t *pte; |
94 |
|
94 |
|
Lines 97-103
static int vmap_pte_range(pmd_t *pmd, unsigned long addr,
Link Here
|
97 |
* callers keep track of where we're up to. |
97 |
* callers keep track of where we're up to. |
98 |
*/ |
98 |
*/ |
99 |
|
99 |
|
100 |
pte = pte_alloc_kernel(pmd, addr); |
100 |
pte = pte_alloc_kernel_with_mask(pmd, addr, gfp_mask); |
101 |
if (!pte) |
101 |
if (!pte) |
102 |
return -ENOMEM; |
102 |
return -ENOMEM; |
103 |
do { |
103 |
do { |
Lines 114-147
static int vmap_pte_range(pmd_t *pmd, unsigned long addr,
Link Here
|
114 |
} |
114 |
} |
115 |
|
115 |
|
116 |
static int vmap_pmd_range(pud_t *pud, unsigned long addr, |
116 |
static int vmap_pmd_range(pud_t *pud, unsigned long addr, |
117 |
unsigned long end, pgprot_t prot, struct page **pages, int *nr) |
117 |
unsigned long end, pgprot_t prot, struct page **pages, int *nr, gfp_t gfp_mask) |
118 |
{ |
118 |
{ |
119 |
pmd_t *pmd; |
119 |
pmd_t *pmd; |
120 |
unsigned long next; |
120 |
unsigned long next; |
121 |
|
121 |
|
122 |
pmd = pmd_alloc(&init_mm, pud, addr); |
122 |
pmd = pmd_alloc_with_mask(&init_mm, pud, addr, gfp_mask); |
123 |
if (!pmd) |
123 |
if (!pmd) |
124 |
return -ENOMEM; |
124 |
return -ENOMEM; |
125 |
do { |
125 |
do { |
126 |
next = pmd_addr_end(addr, end); |
126 |
next = pmd_addr_end(addr, end); |
127 |
if (vmap_pte_range(pmd, addr, next, prot, pages, nr)) |
127 |
if (vmap_pte_range(pmd, addr, next, prot, pages, nr, gfp_mask)) |
128 |
return -ENOMEM; |
128 |
return -ENOMEM; |
129 |
} while (pmd++, addr = next, addr != end); |
129 |
} while (pmd++, addr = next, addr != end); |
130 |
return 0; |
130 |
return 0; |
131 |
} |
131 |
} |
132 |
|
132 |
|
133 |
static int vmap_pud_range(pgd_t *pgd, unsigned long addr, |
133 |
static int vmap_pud_range(pgd_t *pgd, unsigned long addr, unsigned long end, |
134 |
unsigned long end, pgprot_t prot, struct page **pages, int *nr) |
134 |
pgprot_t prot, struct page **pages, int *nr, gfp_t gfp_mask) |
135 |
{ |
135 |
{ |
136 |
pud_t *pud; |
136 |
pud_t *pud; |
137 |
unsigned long next; |
137 |
unsigned long next; |
138 |
|
138 |
|
139 |
pud = pud_alloc(&init_mm, pgd, addr); |
139 |
pud = pud_alloc_with_mask(&init_mm, pgd, addr, gfp_mask); |
140 |
if (!pud) |
140 |
if (!pud) |
141 |
return -ENOMEM; |
141 |
return -ENOMEM; |
142 |
do { |
142 |
do { |
143 |
next = pud_addr_end(addr, end); |
143 |
next = pud_addr_end(addr, end); |
144 |
if (vmap_pmd_range(pud, addr, next, prot, pages, nr)) |
144 |
if (vmap_pmd_range(pud, addr, next, prot, pages, nr, gfp_mask)) |
145 |
return -ENOMEM; |
145 |
return -ENOMEM; |
146 |
} while (pud++, addr = next, addr != end); |
146 |
} while (pud++, addr = next, addr != end); |
147 |
return 0; |
147 |
return 0; |
Lines 153-160
static int vmap_pud_range(pgd_t *pgd, unsigned long addr,
Link Here
|
153 |
* |
153 |
* |
154 |
* Ie. pte at addr+N*PAGE_SIZE shall point to pfn corresponding to pages[N] |
154 |
* Ie. pte at addr+N*PAGE_SIZE shall point to pfn corresponding to pages[N] |
155 |
*/ |
155 |
*/ |
156 |
static int vmap_page_range_noflush(unsigned long start, unsigned long end, |
156 |
static int __vmap_page_range_noflush(unsigned long start, unsigned long end, |
157 |
pgprot_t prot, struct page **pages) |
157 |
pgprot_t prot, struct page **pages, gfp_t gfp_mask) |
158 |
{ |
158 |
{ |
159 |
pgd_t *pgd; |
159 |
pgd_t *pgd; |
160 |
unsigned long next; |
160 |
unsigned long next; |
Lines 166-172
static int vmap_page_range_noflush(unsigned long start, unsigned long end,
Link Here
|
166 |
pgd = pgd_offset_k(addr); |
166 |
pgd = pgd_offset_k(addr); |
167 |
do { |
167 |
do { |
168 |
next = pgd_addr_end(addr, end); |
168 |
next = pgd_addr_end(addr, end); |
169 |
err = vmap_pud_range(pgd, addr, next, prot, pages, &nr); |
169 |
err = vmap_pud_range(pgd, addr, next, prot, pages, &nr, gfp_mask); |
170 |
if (err) |
170 |
if (err) |
171 |
return err; |
171 |
return err; |
172 |
} while (pgd++, addr = next, addr != end); |
172 |
} while (pgd++, addr = next, addr != end); |
Lines 174-189
static int vmap_page_range_noflush(unsigned long start, unsigned long end,
Link Here
|
174 |
return nr; |
174 |
return nr; |
175 |
} |
175 |
} |
176 |
|
176 |
|
177 |
static int vmap_page_range(unsigned long start, unsigned long end, |
177 |
|
178 |
pgprot_t prot, struct page **pages) |
178 |
static int vmap_page_range_noflush(unsigned long start, unsigned long end, |
|
|
179 |
pgprot_t prot, struct page **pages) |
180 |
{ |
181 |
return __vmap_page_range_noflush(start, end, prot, pages, GFP_KERNEL); |
182 |
} |
183 |
|
184 |
static int __vmap_page_range(unsigned long start, unsigned long end, |
185 |
pgprot_t prot, struct page **pages, gfp_t gfp_mask) |
179 |
{ |
186 |
{ |
180 |
int ret; |
187 |
int ret; |
181 |
|
188 |
|
182 |
ret = vmap_page_range_noflush(start, end, prot, pages); |
189 |
ret = __vmap_page_range_noflush(start, end, prot, pages, gfp_mask); |
183 |
flush_cache_vmap(start, end); |
190 |
flush_cache_vmap(start, end); |
184 |
return ret; |
191 |
return ret; |
185 |
} |
192 |
} |
186 |
|
193 |
|
|
|
194 |
static int vmap_page_range(unsigned long start, unsigned long end, |
195 |
pgprot_t prot, struct page **pages) |
196 |
{ |
197 |
return __vmap_page_range(start, end, prot, pages, GFP_KERNEL); |
198 |
} |
199 |
|
187 |
int is_vmalloc_or_module_addr(const void *x) |
200 |
int is_vmalloc_or_module_addr(const void *x) |
188 |
{ |
201 |
{ |
189 |
/* |
202 |
/* |
Lines 1259-1271
void unmap_kernel_range(unsigned long addr, unsigned long size)
Link Here
|
1259 |
flush_tlb_kernel_range(addr, end); |
1272 |
flush_tlb_kernel_range(addr, end); |
1260 |
} |
1273 |
} |
1261 |
|
1274 |
|
1262 |
int map_vm_area(struct vm_struct *area, pgprot_t prot, struct page ***pages) |
1275 |
int __map_vm_area(struct vm_struct *area, pgprot_t prot, |
|
|
1276 |
struct page ***pages, gfp_t gfp_mask) |
1263 |
{ |
1277 |
{ |
1264 |
unsigned long addr = (unsigned long)area->addr; |
1278 |
unsigned long addr = (unsigned long)area->addr; |
1265 |
unsigned long end = addr + area->size - PAGE_SIZE; |
1279 |
unsigned long end = addr + area->size - PAGE_SIZE; |
1266 |
int err; |
1280 |
int err; |
1267 |
|
1281 |
|
1268 |
err = vmap_page_range(addr, end, prot, *pages); |
1282 |
err = __vmap_page_range(addr, end, prot, *pages, gfp_mask); |
1269 |
if (err > 0) { |
1283 |
if (err > 0) { |
1270 |
*pages += err; |
1284 |
*pages += err; |
1271 |
err = 0; |
1285 |
err = 0; |
Lines 1273-1278
int map_vm_area(struct vm_struct *area, pgprot_t prot, struct page ***pages)
Link Here
|
1273 |
|
1287 |
|
1274 |
return err; |
1288 |
return err; |
1275 |
} |
1289 |
} |
|
|
1290 |
|
1291 |
int map_vm_area(struct vm_struct *area, pgprot_t prot, struct page ***pages) |
1292 |
{ |
1293 |
return __map_vm_area(area, prot, pages, GFP_KERNEL); |
1294 |
} |
1276 |
EXPORT_SYMBOL_GPL(map_vm_area); |
1295 |
EXPORT_SYMBOL_GPL(map_vm_area); |
1277 |
|
1296 |
|
1278 |
/*** Old vmalloc interfaces ***/ |
1297 |
/*** Old vmalloc interfaces ***/ |
Lines 1614-1620
static void *__vmalloc_area_node(struct vm_struct *area, gfp_t gfp_mask,
Link Here
|
1614 |
area->pages[i] = page; |
1633 |
area->pages[i] = page; |
1615 |
} |
1634 |
} |
1616 |
|
1635 |
|
1617 |
if (map_vm_area(area, prot, &pages)) |
1636 |
if (__map_vm_area(area, prot, &pages, gfp_mask)) |
1618 |
goto fail; |
1637 |
goto fail; |
1619 |
return area->addr; |
1638 |
return area->addr; |
1620 |
|
1639 |
|