|
@@ -1025,53 +1025,34 @@ out:
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
-static struct page *shmem_swapin_async(struct shared_policy *p,
|
|
|
+static struct page *shmem_swapin(struct shmem_inode_info *info,
|
|
|
swp_entry_t entry, unsigned long idx)
|
|
|
{
|
|
|
- struct page *page;
|
|
|
struct vm_area_struct pvma;
|
|
|
+ struct page *page;
|
|
|
|
|
|
/* Create a pseudo vma that just contains the policy */
|
|
|
- memset(&pvma, 0, sizeof(struct vm_area_struct));
|
|
|
- pvma.vm_end = PAGE_SIZE;
|
|
|
+ pvma.vm_start = 0;
|
|
|
pvma.vm_pgoff = idx;
|
|
|
- pvma.vm_policy = mpol_shared_policy_lookup(p, idx);
|
|
|
+ pvma.vm_ops = NULL;
|
|
|
+ pvma.vm_policy = mpol_shared_policy_lookup(&info->policy, idx);
|
|
|
+ swapin_readahead(entry, 0, &pvma);
|
|
|
page = read_swap_cache_async(entry, &pvma, 0);
|
|
|
mpol_free(pvma.vm_policy);
|
|
|
return page;
|
|
|
}
|
|
|
|
|
|
-static struct page *shmem_swapin(struct shmem_inode_info *info,
|
|
|
- swp_entry_t entry, unsigned long idx)
|
|
|
-{
|
|
|
- struct shared_policy *p = &info->policy;
|
|
|
- int i, num;
|
|
|
- struct page *page;
|
|
|
- unsigned long offset;
|
|
|
-
|
|
|
- num = valid_swaphandles(entry, &offset);
|
|
|
- for (i = 0; i < num; offset++, i++) {
|
|
|
- page = shmem_swapin_async(p,
|
|
|
- swp_entry(swp_type(entry), offset), idx);
|
|
|
- if (!page)
|
|
|
- break;
|
|
|
- page_cache_release(page);
|
|
|
- }
|
|
|
- lru_add_drain(); /* Push any new pages onto the LRU now */
|
|
|
- return shmem_swapin_async(p, entry, idx);
|
|
|
-}
|
|
|
-
|
|
|
-static struct page *
|
|
|
-shmem_alloc_page(gfp_t gfp, struct shmem_inode_info *info,
|
|
|
- unsigned long idx)
|
|
|
+static struct page *shmem_alloc_page(gfp_t gfp, struct shmem_inode_info *info,
|
|
|
+ unsigned long idx)
|
|
|
{
|
|
|
struct vm_area_struct pvma;
|
|
|
struct page *page;
|
|
|
|
|
|
- memset(&pvma, 0, sizeof(struct vm_area_struct));
|
|
|
- pvma.vm_policy = mpol_shared_policy_lookup(&info->policy, idx);
|
|
|
+ /* Create a pseudo vma that just contains the policy */
|
|
|
+ pvma.vm_start = 0;
|
|
|
pvma.vm_pgoff = idx;
|
|
|
- pvma.vm_end = PAGE_SIZE;
|
|
|
+ pvma.vm_ops = NULL;
|
|
|
+ pvma.vm_policy = mpol_shared_policy_lookup(&info->policy, idx);
|
|
|
page = alloc_page_vma(gfp, &pvma, 0);
|
|
|
mpol_free(pvma.vm_policy);
|
|
|
return page;
|