diff options
Diffstat (limited to 'mm/memory.c')
| -rw-r--r-- | mm/memory.c | 47 |
1 files changed, 14 insertions, 33 deletions
diff --git a/mm/memory.c b/mm/memory.c index 1b8ca160f1d0..1d803c2d0184 100644 --- a/mm/memory.c +++ b/mm/memory.c | |||
| @@ -1998,45 +1998,26 @@ int vmtruncate_range(struct inode *inode, loff_t offset, loff_t end) | |||
| 1998 | */ | 1998 | */ |
| 1999 | void swapin_readahead(swp_entry_t entry, unsigned long addr,struct vm_area_struct *vma) | 1999 | void swapin_readahead(swp_entry_t entry, unsigned long addr,struct vm_area_struct *vma) |
| 2000 | { | 2000 | { |
| 2001 | #ifdef CONFIG_NUMA | 2001 | int nr_pages; |
| 2002 | struct vm_area_struct *next_vma = vma ? vma->vm_next : NULL; | 2002 | struct page *page; |
| 2003 | #endif | ||
| 2004 | int i, num; | ||
| 2005 | struct page *new_page; | ||
| 2006 | unsigned long offset; | 2003 | unsigned long offset; |
| 2004 | unsigned long end_offset; | ||
| 2007 | 2005 | ||
| 2008 | /* | 2006 | /* |
| 2009 | * Get the number of handles we should do readahead io to. | 2007 | * Get starting offset for readaround, and number of pages to read. |
| 2008 | * Adjust starting address by readbehind (for NUMA interleave case)? | ||
| 2009 | * No, it's very unlikely that swap layout would follow vma layout, | ||
| 2010 | * more likely that neighbouring swap pages came from the same node: | ||
| 2011 | * so use the same "addr" to choose the same node for each swap read. | ||
| 2010 | */ | 2012 | */ |
| 2011 | num = valid_swaphandles(entry, &offset); | 2013 | nr_pages = valid_swaphandles(entry, &offset); |
| 2012 | for (i = 0; i < num; offset++, i++) { | 2014 | for (end_offset = offset + nr_pages; offset < end_offset; offset++) { |
| 2013 | /* Ok, do the async read-ahead now */ | 2015 | /* Ok, do the async read-ahead now */ |
| 2014 | new_page = read_swap_cache_async(swp_entry(swp_type(entry), | 2016 | page = read_swap_cache_async(swp_entry(swp_type(entry), offset), |
| 2015 | offset), vma, addr); | 2017 | vma, addr); |
| 2016 | if (!new_page) | 2018 | if (!page) |
| 2017 | break; | 2019 | break; |
| 2018 | page_cache_release(new_page); | 2020 | page_cache_release(page); |
| 2019 | #ifdef CONFIG_NUMA | ||
| 2020 | /* | ||
| 2021 | * Find the next applicable VMA for the NUMA policy. | ||
| 2022 | */ | ||
| 2023 | addr += PAGE_SIZE; | ||
| 2024 | if (addr == 0) | ||
| 2025 | vma = NULL; | ||
| 2026 | if (vma) { | ||
| 2027 | if (addr >= vma->vm_end) { | ||
| 2028 | vma = next_vma; | ||
| 2029 | next_vma = vma ? vma->vm_next : NULL; | ||
| 2030 | } | ||
| 2031 | if (vma && addr < vma->vm_start) | ||
| 2032 | vma = NULL; | ||
| 2033 | } else { | ||
| 2034 | if (next_vma && addr >= next_vma->vm_start) { | ||
| 2035 | vma = next_vma; | ||
| 2036 | next_vma = vma->vm_next; | ||
| 2037 | } | ||
| 2038 | } | ||
| 2039 | #endif | ||
| 2040 | } | 2021 | } |
| 2041 | lru_add_drain(); /* Push any new pages onto the LRU now */ | 2022 | lru_add_drain(); /* Push any new pages onto the LRU now */ |
| 2042 | } | 2023 | } |
