diff options
Diffstat (limited to 'mm/rmap.c')
-rw-r--r-- | mm/rmap.c | 29 |
1 files changed, 29 insertions, 0 deletions
@@ -206,6 +206,35 @@ out: | |||
206 | return anon_vma; | 206 | return anon_vma; |
207 | } | 207 | } |
208 | 208 | ||
209 | #ifdef CONFIG_MIGRATION | ||
210 | /* | ||
211 | * Remove an anonymous page from swap replacing the swap pte's | ||
212 | * through real pte's pointing to valid pages and then releasing | ||
213 | * the page from the swap cache. | ||
214 | * | ||
215 | * Must hold page lock on page. | ||
216 | */ | ||
217 | void remove_from_swap(struct page *page) | ||
218 | { | ||
219 | struct anon_vma *anon_vma; | ||
220 | struct vm_area_struct *vma; | ||
221 | |||
222 | if (!PageAnon(page) || !PageSwapCache(page)) | ||
223 | return; | ||
224 | |||
225 | anon_vma = page_lock_anon_vma(page); | ||
226 | if (!anon_vma) | ||
227 | return; | ||
228 | |||
229 | list_for_each_entry(vma, &anon_vma->head, anon_vma_node) | ||
230 | remove_vma_swap(vma, page); | ||
231 | |||
232 | spin_unlock(&anon_vma->lock); | ||
233 | |||
234 | delete_from_swap_cache(page); | ||
235 | } | ||
236 | #endif | ||
237 | |||
209 | /* | 238 | /* |
210 | * At what user virtual address is page expected in vma? | 239 | * At what user virtual address is page expected in vma? |
211 | */ | 240 | */ |