* So PF_MEMALLOC is dropped here.  This causes the slab * allocations to fail earlier, so radix-tree nodes will * then be allocated from the mempool reserves. * * We're still using __GFP_HIGH for radix-tree node * allocations, so some of the emergency pools are available, * just not all of them.
* TODO: this could cause a theoretical memory reclaim * deadlock in the swap out path.
int add_to_swap(struct page * page){	swp_entry_t entry;	int pf_flags;	int err;	if (!PageLocked(page))		BUG();	for (;;) {		entry = get_swap_page();		if (!entry.val)			return 0;		/* Radix-tree node allocations are performing		 * GFP_ATOMIC allocations under PF_MEMALLOC.  		 * They can completely exhaust the page allocator.  		 *		 * So PF_MEMALLOC is dropped here.  This causes the slab 		 * allocations to fail earlier, so radix-tree nodes will 		 * then be allocated from the mempool reserves.		 *		 * We're still using __GFP_HIGH for radix-tree node		 * allocations, so some of the emergency pools are available,		 * just not all of them.		 */		pf_flags = current->flags;		current->flags &= ~PF_MEMALLOC;		/*		 * Add it to the swap cache and mark it dirty		 */		err = __add_to_swap_cache(page, entry, GFP_ATOMIC|__GFP_NOWARN);		if (pf_flags & PF_MEMALLOC)			current->flags |= PF_MEMALLOC;		switch (err) {		case 0:				/* Success */			SetPageUptodate(page);			SetPageDirty(page);			INC_CACHE_INFO(add_total);			return 1;		case -EEXIST:			/* Raced with "speculative" read_swap_cache_async */			INC_CACHE_INFO(exist_race);			swap_free(entry);			continue;		default:			/* -ENOMEM radix-tree allocation failure */			swap_free(entry);			return 0;		}	}}