69
* add_to_swap_cache resembles add_to_page_cache_locked on swapper_space,
69
* __add_to_swap_cache resembles add_to_page_cache_locked on swapper_space,
70
70
* but sets SwapCache flag and private instead of mapping and index.
72
int add_to_swap_cache(struct page *page, swp_entry_t entry, gfp_t gfp_mask)
72
static int __add_to_swap_cache(struct page *page, swp_entry_t entry)
77
77
VM_BUG_ON(PageSwapCache(page));
78
78
VM_BUG_ON(!PageSwapBacked(page));
81
SetPageSwapCache(page);
82
set_page_private(page, entry.val);
84
spin_lock_irq(&swapper_space.tree_lock);
85
error = radix_tree_insert(&swapper_space.page_tree, entry.val, page);
87
total_swapcache_pages++;
88
__inc_zone_page_state(page, NR_FILE_PAGES);
89
INC_CACHE_INFO(add_total);
91
spin_unlock_irq(&swapper_space.tree_lock);
93
if (unlikely(error)) {
94
set_page_private(page, 0UL);
95
ClearPageSwapCache(page);
96
page_cache_release(page);
103
int add_to_swap_cache(struct page *page, swp_entry_t entry, gfp_t gfp_mask)
80
107
error = radix_tree_preload(gfp_mask);
83
SetPageSwapCache(page);
84
set_page_private(page, entry.val);
86
spin_lock_irq(&swapper_space.tree_lock);
87
error = radix_tree_insert(&swapper_space.page_tree,
90
total_swapcache_pages++;
91
__inc_zone_page_state(page, NR_FILE_PAGES);
92
INC_CACHE_INFO(add_total);
94
spin_unlock_irq(&swapper_space.tree_lock);
109
error = __add_to_swap_cache(page, entry);
95
110
radix_tree_preload_end();
97
if (unlikely(error)) {
98
set_page_private(page, 0UL);
99
ClearPageSwapCache(page);
100
page_cache_release(page);
301
* call radix_tree_preload() while we can wait.
303
err = radix_tree_preload(gfp_mask & GFP_KERNEL);
292
308
* Swap entry may have been freed since our caller observed it.
294
310
err = swapcache_prepare(entry);
295
if (err == -EEXIST) /* seems racy */
311
if (err == -EEXIST) { /* seems racy */
312
radix_tree_preload_end();
297
if (err) /* swp entry is obsolete ? */
315
if (err) { /* swp entry is obsolete ? */
316
radix_tree_preload_end();
301
321
* Associate the page with swap entry in the swap cache.
308
328
__set_page_locked(new_page);
309
329
SetPageSwapBacked(new_page);
310
err = add_to_swap_cache(new_page, entry, gfp_mask & GFP_KERNEL);
330
err = __add_to_swap_cache(new_page, entry);
311
331
if (likely(!err)) {
332
radix_tree_preload_end();
313
334
* Initiate read into locked page and return.
316
337
swap_readpage(new_page);
340
radix_tree_preload_end();
319
341
ClearPageSwapBacked(new_page);
320
342
__clear_page_locked(new_page);
321
343
swapcache_free(entry, NULL);