Commit 4e17ec25 authored by Matthew Wilcox's avatar Matthew Wilcox
Browse files

mm: Convert delete_from_swap_cache to XArray



Both callers of __delete_from_swap_cache have the swp_entry_t already,
so pass that in to make constructing the XA_STATE easier.

Signed-off-by: default avatarMatthew Wilcox <willy@infradead.org>
parent 8d93b41c
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -403,7 +403,7 @@ extern void show_swap_cache_info(void);
extern int add_to_swap(struct page *page);
extern int add_to_swap_cache(struct page *, swp_entry_t, gfp_t);
extern int __add_to_swap_cache(struct page *page, swp_entry_t entry);
extern void __delete_from_swap_cache(struct page *);
extern void __delete_from_swap_cache(struct page *, swp_entry_t entry);
extern void delete_from_swap_cache(struct page *);
extern void free_page_and_swap_cache(struct page *);
extern void free_pages_and_swap_cache(struct page **, int);
@@ -557,7 +557,8 @@ static inline int add_to_swap_cache(struct page *page, swp_entry_t entry,
	return -1;
}

static inline void __delete_from_swap_cache(struct page *page)
static inline void __delete_from_swap_cache(struct page *page,
							swp_entry_t entry)
{
}

+10 −14
Original line number Diff line number Diff line
@@ -154,23 +154,22 @@ unlock:
 * This must be called only on pages that have
 * been verified to be in the swap cache.
 */
void __delete_from_swap_cache(struct page *page)
void __delete_from_swap_cache(struct page *page, swp_entry_t entry)
{
	struct address_space *address_space;
	struct address_space *address_space = swap_address_space(entry);
	int i, nr = hpage_nr_pages(page);
	swp_entry_t entry;
	pgoff_t idx;
	pgoff_t idx = swp_offset(entry);
	XA_STATE(xas, &address_space->i_pages, idx);

	VM_BUG_ON_PAGE(!PageLocked(page), page);
	VM_BUG_ON_PAGE(!PageSwapCache(page), page);
	VM_BUG_ON_PAGE(PageWriteback(page), page);

	entry.val = page_private(page);
	address_space = swap_address_space(entry);
	idx = swp_offset(entry);
	for (i = 0; i < nr; i++) {
		radix_tree_delete(&address_space->i_pages, idx + i);
		void *entry = xas_store(&xas, NULL);
		VM_BUG_ON_PAGE(entry != page + i, entry);
		set_page_private(page + i, 0);
		xas_next(&xas);
	}
	ClearPageSwapCache(page);
	address_space->nrpages -= nr;
@@ -243,14 +242,11 @@ fail:
 */
void delete_from_swap_cache(struct page *page)
{
	swp_entry_t entry;
	struct address_space *address_space;

	entry.val = page_private(page);
	swp_entry_t entry = { .val = page_private(page) };
	struct address_space *address_space = swap_address_space(entry);

	address_space = swap_address_space(entry);
	xa_lock_irq(&address_space->i_pages);
	__delete_from_swap_cache(page);
	__delete_from_swap_cache(page, entry);
	xa_unlock_irq(&address_space->i_pages);

	put_swap_page(page, entry);
+1 −1
Original line number Diff line number Diff line
@@ -923,7 +923,7 @@ static int __remove_mapping(struct address_space *mapping, struct page *page,
	if (PageSwapCache(page)) {
		swp_entry_t swap = { .val = page_private(page) };
		mem_cgroup_swapout(page, swap);
		__delete_from_swap_cache(page);
		__delete_from_swap_cache(page, swap);
		xa_unlock_irqrestore(&mapping->i_pages, flags);
		put_swap_page(page, swap);
	} else {