mm, swap: skip swapcache for swapin of synchronous device
With fast swap storage, the platforms want to use swap more aggressively and swap-in is crucial to application latency. The rw_page() based synchronous devices like zram, pmem and btt are such fast storage. When I profile swapin performance with zram lz4 decompress test, S/W overhead is more than 70%. Maybe, it would be bigger in nvdimm. This patch aims to reduce swap-in latency by skipping swapcache if the swap device is synchronous device like rw_page based device. It enhances 45% my swapin test(5G sequential swapin, no readahead, from 2.41sec to 1.64sec). Link: http://lkml.kernel.org/r/1505886205-9671-5-git-send-email-minchan@kernel.org Signed-off-by: Minchan Kim <minchan@kernel.org> Cc: Dan Williams <dan.j.williams@intel.com> Cc: Ross Zwisler <ross.zwisler@linux.intel.com> Cc: Hugh Dickins <hughd@google.com> Cc: Christoph Hellwig <hch@lst.de> Cc: Ilya Dryomov <idryomov@gmail.com> Cc: Jens Axboe <axboe@kernel.dk> Cc: Sergey Senozhatsky <sergey.senozhatsky@gmail.com> Cc: Huang Ying <ying.huang@intel.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:

committed by
Linus Torvalds

parent
539a6fea7f
commit
0bcac06f27
@@ -3455,10 +3455,15 @@ int swapcache_prepare(swp_entry_t entry)
|
||||
return __swap_duplicate(entry, SWAP_HAS_CACHE);
|
||||
}
|
||||
|
||||
struct swap_info_struct *swp_swap_info(swp_entry_t entry)
|
||||
{
|
||||
return swap_info[swp_type(entry)];
|
||||
}
|
||||
|
||||
struct swap_info_struct *page_swap_info(struct page *page)
|
||||
{
|
||||
swp_entry_t swap = { .val = page_private(page) };
|
||||
return swap_info[swp_type(swap)];
|
||||
swp_entry_t entry = { .val = page_private(page) };
|
||||
return swp_swap_info(entry);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -3466,7 +3471,6 @@ struct swap_info_struct *page_swap_info(struct page *page)
|
||||
*/
|
||||
struct address_space *__page_file_mapping(struct page *page)
|
||||
{
|
||||
VM_BUG_ON_PAGE(!PageSwapCache(page), page);
|
||||
return page_swap_info(page)->swap_file->f_mapping;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(__page_file_mapping);
|
||||
@@ -3474,7 +3478,6 @@ EXPORT_SYMBOL_GPL(__page_file_mapping);
|
||||
pgoff_t __page_file_index(struct page *page)
|
||||
{
|
||||
swp_entry_t swap = { .val = page_private(page) };
|
||||
VM_BUG_ON_PAGE(!PageSwapCache(page), page);
|
||||
return swp_offset(swap);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(__page_file_index);
|
||||
|
Reference in New Issue
Block a user