mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2026-05-26 11:40:24 +02:00
mm/shmem, swap: simplify swapin path and result handling
Slightly tidy up the different handling of swap in and error handling for SWP_SYNCHRONOUS_IO and non-SWP_SYNCHRONOUS_IO devices. Now swapin will always use either shmem_swap_alloc_folio or shmem_swapin_cluster, then check the result. Simplify the control flow and avoid a redundant goto label. Link: https://lkml.kernel.org/r/20250728075306.12704-7-ryncsn@gmail.com Signed-off-by: Kairui Song <kasong@tencent.com> Reviewed-by: Baolin Wang <baolin.wang@linux.alibaba.com> Cc: Baoquan He <bhe@redhat.com> Cc: Barry Song <baohua@kernel.org> Cc: Chris Li <chrisl@kernel.org> Cc: Dev Jain <dev.jain@arm.com> Cc: Hugh Dickins <hughd@google.com> Cc: Kemeng Shi <shikemeng@huaweicloud.com> Cc: Matthew Wilcox (Oracle) <willy@infradead.org> Cc: Nhat Pham <nphamcs@gmail.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
committed by
Andrew Morton
parent
69805ea79d
commit
1326359f22
+21
-28
@@ -2357,40 +2357,33 @@ static int shmem_swapin_folio(struct inode *inode, pgoff_t index,
|
||||
count_memcg_event_mm(fault_mm, PGMAJFAULT);
|
||||
}
|
||||
|
||||
/* Skip swapcache for synchronous device. */
|
||||
if (data_race(si->flags & SWP_SYNCHRONOUS_IO)) {
|
||||
/* Direct swapin skipping swap cache & readahead */
|
||||
folio = shmem_swap_alloc_folio(inode, vma, index, swap, order, gfp);
|
||||
if (!IS_ERR(folio)) {
|
||||
skip_swapcache = true;
|
||||
goto alloced;
|
||||
if (IS_ERR(folio)) {
|
||||
error = PTR_ERR(folio);
|
||||
folio = NULL;
|
||||
goto failed;
|
||||
}
|
||||
skip_swapcache = true;
|
||||
} else {
|
||||
/*
|
||||
* Cached swapin only supports order 0 folio, it is
|
||||
* necessary to recalculate the new swap entry based on
|
||||
* the offset, as the swapin index might be unalgined.
|
||||
*/
|
||||
if (order) {
|
||||
offset = index - round_down(index, 1 << order);
|
||||
swap = swp_entry(swp_type(swap), swp_offset(swap) + offset);
|
||||
}
|
||||
|
||||
/*
|
||||
* Direct swapin handled order 0 fallback already,
|
||||
* if it failed, abort.
|
||||
*/
|
||||
error = PTR_ERR(folio);
|
||||
folio = NULL;
|
||||
goto failed;
|
||||
}
|
||||
|
||||
/*
|
||||
* Now swap device can only swap in order 0 folio, it is
|
||||
* necessary to recalculate the new swap entry based on
|
||||
* the offset, as the swapin index might be unalgined.
|
||||
*/
|
||||
if (order) {
|
||||
offset = index - round_down(index, 1 << order);
|
||||
swap = swp_entry(swp_type(swap), swp_offset(swap) + offset);
|
||||
}
|
||||
|
||||
folio = shmem_swapin_cluster(swap, gfp, info, index);
|
||||
if (!folio) {
|
||||
error = -ENOMEM;
|
||||
goto failed;
|
||||
folio = shmem_swapin_cluster(swap, gfp, info, index);
|
||||
if (!folio) {
|
||||
error = -ENOMEM;
|
||||
goto failed;
|
||||
}
|
||||
}
|
||||
}
|
||||
alloced:
|
||||
if (order > folio_order(folio)) {
|
||||
/*
|
||||
* Swapin may get smaller folios due to various reasons:
|
||||
|
||||
Reference in New Issue
Block a user