mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-28 05:12:49 +00:00
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: Matthew Wilcox <willy@infradead.org>
This commit is contained in:
parent
8d93b41c09
commit
4e17ec250f
3 changed files with 14 additions and 17 deletions
|
@ -403,7 +403,7 @@ extern void show_swap_cache_info(void);
|
||||||
extern int add_to_swap(struct page *page);
|
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 *, swp_entry_t, gfp_t);
|
||||||
extern int __add_to_swap_cache(struct page *page, swp_entry_t entry);
|
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 delete_from_swap_cache(struct page *);
|
||||||
extern void free_page_and_swap_cache(struct page *);
|
extern void free_page_and_swap_cache(struct page *);
|
||||||
extern void free_pages_and_swap_cache(struct page **, int);
|
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;
|
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)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -154,23 +154,22 @@ int add_to_swap_cache(struct page *page, swp_entry_t entry, gfp_t gfp)
|
||||||
* This must be called only on pages that have
|
* This must be called only on pages that have
|
||||||
* been verified to be in the swap cache.
|
* 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);
|
int i, nr = hpage_nr_pages(page);
|
||||||
swp_entry_t entry;
|
pgoff_t idx = swp_offset(entry);
|
||||||
pgoff_t idx;
|
XA_STATE(xas, &address_space->i_pages, idx);
|
||||||
|
|
||||||
VM_BUG_ON_PAGE(!PageLocked(page), page);
|
VM_BUG_ON_PAGE(!PageLocked(page), page);
|
||||||
VM_BUG_ON_PAGE(!PageSwapCache(page), page);
|
VM_BUG_ON_PAGE(!PageSwapCache(page), page);
|
||||||
VM_BUG_ON_PAGE(PageWriteback(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++) {
|
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);
|
set_page_private(page + i, 0);
|
||||||
|
xas_next(&xas);
|
||||||
}
|
}
|
||||||
ClearPageSwapCache(page);
|
ClearPageSwapCache(page);
|
||||||
address_space->nrpages -= nr;
|
address_space->nrpages -= nr;
|
||||||
|
@ -243,14 +242,11 @@ int add_to_swap(struct page *page)
|
||||||
*/
|
*/
|
||||||
void delete_from_swap_cache(struct page *page)
|
void delete_from_swap_cache(struct page *page)
|
||||||
{
|
{
|
||||||
swp_entry_t entry;
|
swp_entry_t entry = { .val = page_private(page) };
|
||||||
struct address_space *address_space;
|
struct address_space *address_space = swap_address_space(entry);
|
||||||
|
|
||||||
entry.val = page_private(page);
|
|
||||||
|
|
||||||
address_space = swap_address_space(entry);
|
|
||||||
xa_lock_irq(&address_space->i_pages);
|
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);
|
xa_unlock_irq(&address_space->i_pages);
|
||||||
|
|
||||||
put_swap_page(page, entry);
|
put_swap_page(page, entry);
|
||||||
|
|
|
@ -923,7 +923,7 @@ static int __remove_mapping(struct address_space *mapping, struct page *page,
|
||||||
if (PageSwapCache(page)) {
|
if (PageSwapCache(page)) {
|
||||||
swp_entry_t swap = { .val = page_private(page) };
|
swp_entry_t swap = { .val = page_private(page) };
|
||||||
mem_cgroup_swapout(page, swap);
|
mem_cgroup_swapout(page, swap);
|
||||||
__delete_from_swap_cache(page);
|
__delete_from_swap_cache(page, swap);
|
||||||
xa_unlock_irqrestore(&mapping->i_pages, flags);
|
xa_unlock_irqrestore(&mapping->i_pages, flags);
|
||||||
put_swap_page(page, swap);
|
put_swap_page(page, swap);
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in a new issue