| .. | .. |
|---|
| 93 | 93 | info->fgfn++; |
|---|
| 94 | 94 | } |
|---|
| 95 | 95 | |
|---|
| 96 | | -static int remap_pte_fn(pte_t *ptep, pgtable_t token, unsigned long addr, |
|---|
| 97 | | - void *data) |
|---|
| 96 | +static int remap_pte_fn(pte_t *ptep, unsigned long addr, void *data) |
|---|
| 98 | 97 | { |
|---|
| 99 | 98 | struct remap_data *info = data; |
|---|
| 100 | 99 | struct page *page = info->pages[info->index++]; |
|---|
| .. | .. |
|---|
| 233 | 232 | kfree(pages); |
|---|
| 234 | 233 | return -ENOMEM; |
|---|
| 235 | 234 | } |
|---|
| 236 | | - rc = alloc_xenballooned_pages(nr_pages, pages); |
|---|
| 235 | + rc = xen_alloc_unpopulated_pages(nr_pages, pages); |
|---|
| 237 | 236 | if (rc) { |
|---|
| 238 | 237 | pr_warn("%s Couldn't balloon alloc %ld pages rc:%d\n", __func__, |
|---|
| 239 | 238 | nr_pages, rc); |
|---|
| .. | .. |
|---|
| 250 | 249 | if (!vaddr) { |
|---|
| 251 | 250 | pr_warn("%s Couldn't map %ld pages rc:%d\n", __func__, |
|---|
| 252 | 251 | nr_pages, rc); |
|---|
| 253 | | - free_xenballooned_pages(nr_pages, pages); |
|---|
| 252 | + xen_free_unpopulated_pages(nr_pages, pages); |
|---|
| 254 | 253 | kfree(pages); |
|---|
| 255 | 254 | kfree(pfns); |
|---|
| 256 | 255 | return -ENOMEM; |
|---|
| .. | .. |
|---|
| 262 | 261 | |
|---|
| 263 | 262 | return 0; |
|---|
| 264 | 263 | } |
|---|
| 265 | | -EXPORT_SYMBOL_GPL(xen_xlate_map_ballooned_pages); |
|---|
| 264 | + |
|---|
| 265 | +struct remap_pfn { |
|---|
| 266 | + struct mm_struct *mm; |
|---|
| 267 | + struct page **pages; |
|---|
| 268 | + pgprot_t prot; |
|---|
| 269 | + unsigned long i; |
|---|
| 270 | +}; |
|---|
| 271 | + |
|---|
| 272 | +static int remap_pfn_fn(pte_t *ptep, unsigned long addr, void *data) |
|---|
| 273 | +{ |
|---|
| 274 | + struct remap_pfn *r = data; |
|---|
| 275 | + struct page *page = r->pages[r->i]; |
|---|
| 276 | + pte_t pte = pte_mkspecial(pfn_pte(page_to_pfn(page), r->prot)); |
|---|
| 277 | + |
|---|
| 278 | + set_pte_at(r->mm, addr, ptep, pte); |
|---|
| 279 | + r->i++; |
|---|
| 280 | + |
|---|
| 281 | + return 0; |
|---|
| 282 | +} |
|---|
| 283 | + |
|---|
| 284 | +/* Used by the privcmd module, but has to be built-in on ARM */ |
|---|
| 285 | +int xen_remap_vma_range(struct vm_area_struct *vma, unsigned long addr, unsigned long len) |
|---|
| 286 | +{ |
|---|
| 287 | + struct remap_pfn r = { |
|---|
| 288 | + .mm = vma->vm_mm, |
|---|
| 289 | + .pages = vma->vm_private_data, |
|---|
| 290 | + .prot = vma->vm_page_prot, |
|---|
| 291 | + }; |
|---|
| 292 | + |
|---|
| 293 | + return apply_to_page_range(vma->vm_mm, addr, len, remap_pfn_fn, &r); |
|---|
| 294 | +} |
|---|
| 295 | +EXPORT_SYMBOL_GPL(xen_remap_vma_range); |
|---|