21 hotfixes. 8 are cc:stable and the remainder address post-6.13 issues.
13 are for MM and 8 are for non-MM. All are singletons, please see the changelogs for details. -----BEGIN PGP SIGNATURE----- iHUEABYKAB0WIQTTMBEPP41GrTpTJgfdBJ7gKXxAjgUCZ54MEgAKCRDdBJ7gKXxA jlhdAP0evTQ9JX+22DDWSVdWFBbnQ74c5ddFXVQc1LO2G2FhFgD+OXhH8E65Nez5 qGWjb4xgjoQTHS7AL4pYEFYqx/cpbAQ= =rN+l -----END PGP SIGNATURE----- Merge tag 'mm-hotfixes-stable-2025-02-01-03-56' of git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm Pull misc fixes from Andrew Morton: "21 hotfixes. 8 are cc:stable and the remainder address post-6.13 issues. 13 are for MM and 8 are for non-MM. All are singletons, please see the changelogs for details" * tag 'mm-hotfixes-stable-2025-02-01-03-56' of git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm: (21 commits) MAINTAINERS: include linux-mm for xarray maintenance revert "xarray: port tests to kunit" MAINTAINERS: add lib/test_xarray.c mailmap, MAINTAINERS, docs: update Carlos's email address mm/hugetlb: fix hugepage allocation for interleaved memory nodes mm: gup: fix infinite loop within __get_longterm_locked mm, swap: fix reclaim offset calculation error during allocation .mailmap: update email address for Christopher Obbard kfence: skip __GFP_THISNODE allocations on NUMA systems nilfs2: fix possible int overflows in nilfs_fiemap() mm: compaction: use the proper flag to determine watermarks kernel: be more careful about dup_mmap() failures and uprobe registering mm/fake-numa: handle cases with no SRAT info mm: kmemleak: fix upper boundary check for physical address objects mailmap: add an entry for Hamza Mahfooz MAINTAINERS: mailmap: update Yosry Ahmed's email address scripts/gdb: fix aarch64 userspace detection in get_current_task mm/vmscan: accumulate nr_demoted for accurate demotion statistics ocfs2: fix incorrect CPU endianness conversion causing mount failure mm/zsmalloc: add __maybe_unused attribute for is_first_zpdesc() ...
This commit is contained in:
commit
03cc3579bc
34 changed files with 379 additions and 441 deletions
7
.mailmap
7
.mailmap
|
@ -150,7 +150,9 @@ Bryan Tan <bryan-bt.tan@broadcom.com> <bryantan@vmware.com>
|
|||
Cai Huoqing <cai.huoqing@linux.dev> <caihuoqing@baidu.com>
|
||||
Can Guo <quic_cang@quicinc.com> <cang@codeaurora.org>
|
||||
Carl Huang <quic_cjhuang@quicinc.com> <cjhuang@codeaurora.org>
|
||||
Carlos Bilbao <carlos.bilbao.osdev@gmail.com> <carlos.bilbao@amd.com>
|
||||
Carlos Bilbao <carlos.bilbao@kernel.org> <carlos.bilbao@amd.com>
|
||||
Carlos Bilbao <carlos.bilbao@kernel.org> <carlos.bilbao.osdev@gmail.com>
|
||||
Carlos Bilbao <carlos.bilbao@kernel.org> <bilbao@vt.edu>
|
||||
Changbin Du <changbin.du@intel.com> <changbin.du@gmail.com>
|
||||
Changbin Du <changbin.du@intel.com> <changbin.du@intel.com>
|
||||
Chao Yu <chao@kernel.org> <chao2.yu@samsung.com>
|
||||
|
@ -167,6 +169,7 @@ Christian Brauner <brauner@kernel.org> <christian.brauner@canonical.com>
|
|||
Christian Brauner <brauner@kernel.org> <christian.brauner@ubuntu.com>
|
||||
Christian Marangi <ansuelsmth@gmail.com>
|
||||
Christophe Ricard <christophe.ricard@gmail.com>
|
||||
Christopher Obbard <christopher.obbard@linaro.org> <chris.obbard@collabora.com>
|
||||
Christoph Hellwig <hch@lst.de>
|
||||
Chuck Lever <chuck.lever@oracle.com> <cel@kernel.org>
|
||||
Chuck Lever <chuck.lever@oracle.com> <cel@netapp.com>
|
||||
|
@ -263,6 +266,7 @@ Guo Ren <guoren@kernel.org> <ren_guo@c-sky.com>
|
|||
Guru Das Srinagesh <quic_gurus@quicinc.com> <gurus@codeaurora.org>
|
||||
Gustavo Padovan <gustavo@las.ic.unicamp.br>
|
||||
Gustavo Padovan <padovan@profusion.mobi>
|
||||
Hamza Mahfooz <hamzamahfooz@linux.microsoft.com> <hamza.mahfooz@amd.com>
|
||||
Hanjun Guo <guohanjun@huawei.com> <hanjun.guo@linaro.org>
|
||||
Hans Verkuil <hverkuil@xs4all.nl> <hansverk@cisco.com>
|
||||
Hans Verkuil <hverkuil@xs4all.nl> <hverkuil-cisco@xs4all.nl>
|
||||
|
@ -763,6 +767,7 @@ Wolfram Sang <wsa@kernel.org> <wsa@the-dreams.de>
|
|||
Yakir Yang <kuankuan.y@gmail.com> <ykk@rock-chips.com>
|
||||
Yanteng Si <si.yanteng@linux.dev> <siyanteng@loongson.cn>
|
||||
Ying Huang <huang.ying.caritas@gmail.com> <ying.huang@intel.com>
|
||||
Yosry Ahmed <yosry.ahmed@linux.dev> <yosryahmed@google.com>
|
||||
Yusuke Goda <goda.yusuke@renesas.com>
|
||||
Zack Rusin <zack.rusin@broadcom.com> <zackr@vmware.com>
|
||||
Zhu Yanjun <zyjzyj2000@gmail.com> <yanjunz@nvidia.com>
|
||||
|
|
|
@ -7,7 +7,7 @@ Traducción al español
|
|||
|
||||
\kerneldocCJKoff
|
||||
|
||||
:maintainer: Carlos Bilbao <carlos.bilbao.osdev@gmail.com>
|
||||
:maintainer: Carlos Bilbao <carlos.bilbao@kernel.org>
|
||||
|
||||
.. _sp_disclaimer:
|
||||
|
||||
|
|
12
MAINTAINERS
12
MAINTAINERS
|
@ -1090,7 +1090,7 @@ F: drivers/video/fbdev/geode/
|
|||
|
||||
AMD HSMP DRIVER
|
||||
M: Naveen Krishna Chatradhi <naveenkrishna.chatradhi@amd.com>
|
||||
R: Carlos Bilbao <carlos.bilbao.osdev@gmail.com>
|
||||
R: Carlos Bilbao <carlos.bilbao@kernel.org>
|
||||
L: platform-driver-x86@vger.kernel.org
|
||||
S: Maintained
|
||||
F: Documentation/arch/x86/amd_hsmp.rst
|
||||
|
@ -5857,7 +5857,7 @@ F: drivers/usb/atm/cxacru.c
|
|||
|
||||
CONFIDENTIAL COMPUTING THREAT MODEL FOR X86 VIRTUALIZATION (SNP/TDX)
|
||||
M: Elena Reshetova <elena.reshetova@intel.com>
|
||||
M: Carlos Bilbao <carlos.bilbao.osdev@gmail.com>
|
||||
M: Carlos Bilbao <carlos.bilbao@kernel.org>
|
||||
S: Maintained
|
||||
F: Documentation/security/snp-tdx-threat-model.rst
|
||||
|
||||
|
@ -11331,7 +11331,7 @@ S: Orphan
|
|||
F: drivers/video/fbdev/imsttfb.c
|
||||
|
||||
INDEX OF FURTHER KERNEL DOCUMENTATION
|
||||
M: Carlos Bilbao <carlos.bilbao.osdev@gmail.com>
|
||||
M: Carlos Bilbao <carlos.bilbao@kernel.org>
|
||||
S: Maintained
|
||||
F: Documentation/process/kernel-docs.rst
|
||||
|
||||
|
@ -22215,7 +22215,7 @@ Q: http://patchwork.linuxtv.org/project/linux-media/list/
|
|||
F: drivers/media/dvb-frontends/sp2*
|
||||
|
||||
SPANISH DOCUMENTATION
|
||||
M: Carlos Bilbao <carlos.bilbao.osdev@gmail.com>
|
||||
M: Carlos Bilbao <carlos.bilbao@kernel.org>
|
||||
R: Avadhut Naik <avadhut.naik@amd.com>
|
||||
S: Maintained
|
||||
F: Documentation/translations/sp_SP/
|
||||
|
@ -25739,11 +25739,13 @@ F: arch/x86/entry/vdso/
|
|||
XARRAY
|
||||
M: Matthew Wilcox <willy@infradead.org>
|
||||
L: linux-fsdevel@vger.kernel.org
|
||||
L: linux-mm@kvack.org
|
||||
S: Supported
|
||||
F: Documentation/core-api/xarray.rst
|
||||
F: include/linux/idr.h
|
||||
F: include/linux/xarray.h
|
||||
F: lib/idr.c
|
||||
F: lib/test_xarray.c
|
||||
F: lib/xarray.c
|
||||
F: tools/testing/radix-tree
|
||||
|
||||
|
@ -26223,7 +26225,7 @@ K: zstd
|
|||
|
||||
ZSWAP COMPRESSED SWAP CACHING
|
||||
M: Johannes Weiner <hannes@cmpxchg.org>
|
||||
M: Yosry Ahmed <yosryahmed@google.com>
|
||||
M: Yosry Ahmed <yosry.ahmed@linux.dev>
|
||||
M: Nhat Pham <nphamcs@gmail.com>
|
||||
R: Chengming Zhou <chengming.zhou@linux.dev>
|
||||
L: linux-mm@kvack.org
|
||||
|
|
|
@ -626,6 +626,7 @@ CONFIG_TEST_PRINTF=m
|
|||
CONFIG_TEST_SCANF=m
|
||||
CONFIG_TEST_BITMAP=m
|
||||
CONFIG_TEST_UUID=m
|
||||
CONFIG_TEST_XARRAY=m
|
||||
CONFIG_TEST_MAPLE_TREE=m
|
||||
CONFIG_TEST_RHASHTABLE=m
|
||||
CONFIG_TEST_IDA=m
|
||||
|
|
|
@ -583,6 +583,7 @@ CONFIG_TEST_PRINTF=m
|
|||
CONFIG_TEST_SCANF=m
|
||||
CONFIG_TEST_BITMAP=m
|
||||
CONFIG_TEST_UUID=m
|
||||
CONFIG_TEST_XARRAY=m
|
||||
CONFIG_TEST_MAPLE_TREE=m
|
||||
CONFIG_TEST_RHASHTABLE=m
|
||||
CONFIG_TEST_IDA=m
|
||||
|
|
|
@ -603,6 +603,7 @@ CONFIG_TEST_PRINTF=m
|
|||
CONFIG_TEST_SCANF=m
|
||||
CONFIG_TEST_BITMAP=m
|
||||
CONFIG_TEST_UUID=m
|
||||
CONFIG_TEST_XARRAY=m
|
||||
CONFIG_TEST_MAPLE_TREE=m
|
||||
CONFIG_TEST_RHASHTABLE=m
|
||||
CONFIG_TEST_IDA=m
|
||||
|
|
|
@ -575,6 +575,7 @@ CONFIG_TEST_PRINTF=m
|
|||
CONFIG_TEST_SCANF=m
|
||||
CONFIG_TEST_BITMAP=m
|
||||
CONFIG_TEST_UUID=m
|
||||
CONFIG_TEST_XARRAY=m
|
||||
CONFIG_TEST_MAPLE_TREE=m
|
||||
CONFIG_TEST_RHASHTABLE=m
|
||||
CONFIG_TEST_IDA=m
|
||||
|
|
|
@ -585,6 +585,7 @@ CONFIG_TEST_PRINTF=m
|
|||
CONFIG_TEST_SCANF=m
|
||||
CONFIG_TEST_BITMAP=m
|
||||
CONFIG_TEST_UUID=m
|
||||
CONFIG_TEST_XARRAY=m
|
||||
CONFIG_TEST_MAPLE_TREE=m
|
||||
CONFIG_TEST_RHASHTABLE=m
|
||||
CONFIG_TEST_IDA=m
|
||||
|
|
|
@ -602,6 +602,7 @@ CONFIG_TEST_PRINTF=m
|
|||
CONFIG_TEST_SCANF=m
|
||||
CONFIG_TEST_BITMAP=m
|
||||
CONFIG_TEST_UUID=m
|
||||
CONFIG_TEST_XARRAY=m
|
||||
CONFIG_TEST_MAPLE_TREE=m
|
||||
CONFIG_TEST_RHASHTABLE=m
|
||||
CONFIG_TEST_IDA=m
|
||||
|
|
|
@ -689,6 +689,7 @@ CONFIG_TEST_PRINTF=m
|
|||
CONFIG_TEST_SCANF=m
|
||||
CONFIG_TEST_BITMAP=m
|
||||
CONFIG_TEST_UUID=m
|
||||
CONFIG_TEST_XARRAY=m
|
||||
CONFIG_TEST_MAPLE_TREE=m
|
||||
CONFIG_TEST_RHASHTABLE=m
|
||||
CONFIG_TEST_IDA=m
|
||||
|
|
|
@ -575,6 +575,7 @@ CONFIG_TEST_PRINTF=m
|
|||
CONFIG_TEST_SCANF=m
|
||||
CONFIG_TEST_BITMAP=m
|
||||
CONFIG_TEST_UUID=m
|
||||
CONFIG_TEST_XARRAY=m
|
||||
CONFIG_TEST_MAPLE_TREE=m
|
||||
CONFIG_TEST_RHASHTABLE=m
|
||||
CONFIG_TEST_IDA=m
|
||||
|
|
|
@ -576,6 +576,7 @@ CONFIG_TEST_PRINTF=m
|
|||
CONFIG_TEST_SCANF=m
|
||||
CONFIG_TEST_BITMAP=m
|
||||
CONFIG_TEST_UUID=m
|
||||
CONFIG_TEST_XARRAY=m
|
||||
CONFIG_TEST_MAPLE_TREE=m
|
||||
CONFIG_TEST_RHASHTABLE=m
|
||||
CONFIG_TEST_IDA=m
|
||||
|
|
|
@ -592,6 +592,7 @@ CONFIG_TEST_PRINTF=m
|
|||
CONFIG_TEST_SCANF=m
|
||||
CONFIG_TEST_BITMAP=m
|
||||
CONFIG_TEST_UUID=m
|
||||
CONFIG_TEST_XARRAY=m
|
||||
CONFIG_TEST_MAPLE_TREE=m
|
||||
CONFIG_TEST_RHASHTABLE=m
|
||||
CONFIG_TEST_IDA=m
|
||||
|
|
|
@ -572,6 +572,7 @@ CONFIG_TEST_PRINTF=m
|
|||
CONFIG_TEST_SCANF=m
|
||||
CONFIG_TEST_BITMAP=m
|
||||
CONFIG_TEST_UUID=m
|
||||
CONFIG_TEST_XARRAY=m
|
||||
CONFIG_TEST_MAPLE_TREE=m
|
||||
CONFIG_TEST_RHASHTABLE=m
|
||||
CONFIG_TEST_IDA=m
|
||||
|
|
|
@ -573,6 +573,7 @@ CONFIG_TEST_PRINTF=m
|
|||
CONFIG_TEST_SCANF=m
|
||||
CONFIG_TEST_BITMAP=m
|
||||
CONFIG_TEST_UUID=m
|
||||
CONFIG_TEST_XARRAY=m
|
||||
CONFIG_TEST_MAPLE_TREE=m
|
||||
CONFIG_TEST_RHASHTABLE=m
|
||||
CONFIG_TEST_IDA=m
|
||||
|
|
|
@ -448,6 +448,7 @@ CONFIG_TEST_PRINTF=m
|
|||
CONFIG_TEST_SCANF=m
|
||||
CONFIG_TEST_BITMAP=m
|
||||
CONFIG_TEST_UUID=m
|
||||
CONFIG_TEST_XARRAY=m
|
||||
CONFIG_TEST_MAPLE_TREE=m
|
||||
CONFIG_TEST_RHASHTABLE=m
|
||||
CONFIG_TEST_IDA=m
|
||||
|
|
|
@ -95,9 +95,13 @@ int __init fix_pxm_node_maps(int max_nid)
|
|||
int i, j, index = -1, count = 0;
|
||||
nodemask_t nodes_to_enable;
|
||||
|
||||
if (numa_off || srat_disabled())
|
||||
if (numa_off)
|
||||
return -1;
|
||||
|
||||
/* no or incomplete node/PXM mapping set, nothing to do */
|
||||
if (srat_disabled())
|
||||
return 0;
|
||||
|
||||
/* find fake nodes PXM mapping */
|
||||
for (i = 0; i < MAX_NUMNODES; i++) {
|
||||
if (node_to_pxm_map[i] != PXM_INVAL) {
|
||||
|
@ -117,6 +121,11 @@ int __init fix_pxm_node_maps(int max_nid)
|
|||
}
|
||||
}
|
||||
}
|
||||
if (index == -1) {
|
||||
pr_debug("No node/PXM mapping has been set\n");
|
||||
/* nothing more to be done */
|
||||
return 0;
|
||||
}
|
||||
if (WARN(index != max_nid, "%d max nid when expected %d\n",
|
||||
index, max_nid))
|
||||
return -1;
|
||||
|
|
|
@ -1186,7 +1186,7 @@ int nilfs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
|
|||
if (size) {
|
||||
if (phys && blkphy << blkbits == phys + size) {
|
||||
/* The current extent goes on */
|
||||
size += n << blkbits;
|
||||
size += (u64)n << blkbits;
|
||||
} else {
|
||||
/* Terminate the current extent */
|
||||
ret = fiemap_fill_next_extent(
|
||||
|
@ -1199,14 +1199,14 @@ int nilfs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
|
|||
flags = FIEMAP_EXTENT_MERGED;
|
||||
logical = blkoff << blkbits;
|
||||
phys = blkphy << blkbits;
|
||||
size = n << blkbits;
|
||||
size = (u64)n << blkbits;
|
||||
}
|
||||
} else {
|
||||
/* Start a new extent */
|
||||
flags = FIEMAP_EXTENT_MERGED;
|
||||
logical = blkoff << blkbits;
|
||||
phys = blkphy << blkbits;
|
||||
size = n << blkbits;
|
||||
size = (u64)n << blkbits;
|
||||
}
|
||||
blkoff += n;
|
||||
}
|
||||
|
|
|
@ -2285,7 +2285,7 @@ static int ocfs2_verify_volume(struct ocfs2_dinode *di,
|
|||
mlog(ML_ERROR, "found superblock with incorrect block "
|
||||
"size bits: found %u, should be 9, 10, 11, or 12\n",
|
||||
blksz_bits);
|
||||
} else if ((1 << le32_to_cpu(blksz_bits)) != blksz) {
|
||||
} else if ((1 << blksz_bits) != blksz) {
|
||||
mlog(ML_ERROR, "found superblock with incorrect block "
|
||||
"size: found %u, should be %u\n", 1 << blksz_bits, blksz);
|
||||
} else if (le16_to_cpu(di->id2.i_super.s_major_rev_level) !=
|
||||
|
|
|
@ -222,6 +222,7 @@ enum {
|
|||
};
|
||||
|
||||
#define SWAP_CLUSTER_MAX 32UL
|
||||
#define SWAP_CLUSTER_MAX_SKIPPED (SWAP_CLUSTER_MAX << 10)
|
||||
#define COMPACT_CLUSTER_MAX SWAP_CLUSTER_MAX
|
||||
|
||||
/* Bit flag in swap_map */
|
||||
|
|
|
@ -28,6 +28,7 @@
|
|||
#include <linux/rcupdate_trace.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/srcu.h>
|
||||
#include <linux/oom.h> /* check_stable_address_space */
|
||||
|
||||
#include <linux/uprobes.h>
|
||||
|
||||
|
@ -1260,6 +1261,9 @@ register_for_each_vma(struct uprobe *uprobe, struct uprobe_consumer *new)
|
|||
* returns NULL in find_active_uprobe_rcu().
|
||||
*/
|
||||
mmap_write_lock(mm);
|
||||
if (check_stable_address_space(mm))
|
||||
goto unlock;
|
||||
|
||||
vma = find_vma(mm, info->vaddr);
|
||||
if (!vma || !valid_vma(vma, is_register) ||
|
||||
file_inode(vma->vm_file) != uprobe->inode)
|
||||
|
|
|
@ -760,7 +760,8 @@ loop_out:
|
|||
mt_set_in_rcu(vmi.mas.tree);
|
||||
ksm_fork(mm, oldmm);
|
||||
khugepaged_fork(mm, oldmm);
|
||||
} else if (mpnt) {
|
||||
} else {
|
||||
|
||||
/*
|
||||
* The entire maple tree has already been duplicated. If the
|
||||
* mmap duplication fails, mark the failure point with
|
||||
|
@ -768,8 +769,18 @@ loop_out:
|
|||
* stop releasing VMAs that have not been duplicated after this
|
||||
* point.
|
||||
*/
|
||||
mas_set_range(&vmi.mas, mpnt->vm_start, mpnt->vm_end - 1);
|
||||
mas_store(&vmi.mas, XA_ZERO_ENTRY);
|
||||
if (mpnt) {
|
||||
mas_set_range(&vmi.mas, mpnt->vm_start, mpnt->vm_end - 1);
|
||||
mas_store(&vmi.mas, XA_ZERO_ENTRY);
|
||||
/* Avoid OOM iterating a broken tree */
|
||||
set_bit(MMF_OOM_SKIP, &mm->flags);
|
||||
}
|
||||
/*
|
||||
* The mm_struct is going to exit, but the locks will be dropped
|
||||
* first. Set the mm_struct as unstable is advisable as it is
|
||||
* not fully initialised.
|
||||
*/
|
||||
set_bit(MMF_UNSTABLE, &mm->flags);
|
||||
}
|
||||
out:
|
||||
mmap_write_unlock(mm);
|
||||
|
|
|
@ -2456,22 +2456,8 @@ config TEST_BITMAP
|
|||
config TEST_UUID
|
||||
tristate "Test functions located in the uuid module at runtime"
|
||||
|
||||
config XARRAY_KUNIT
|
||||
tristate "KUnit test XArray code at runtime" if !KUNIT_ALL_TESTS
|
||||
depends on KUNIT
|
||||
default KUNIT_ALL_TESTS
|
||||
help
|
||||
Enable this option to test the Xarray code at boot.
|
||||
|
||||
KUnit tests run during boot and output the results to the debug log
|
||||
in TAP format (http://testanything.org/). Only useful for kernel devs
|
||||
running the KUnit test harness, and not intended for inclusion into a
|
||||
production build.
|
||||
|
||||
For more information on KUnit and unit tests in general please refer
|
||||
to the KUnit documentation in Documentation/dev-tools/kunit/.
|
||||
|
||||
If unsure, say N.
|
||||
config TEST_XARRAY
|
||||
tristate "Test the XArray code at runtime"
|
||||
|
||||
config TEST_MAPLE_TREE
|
||||
tristate "Test the Maple Tree code at runtime or module load"
|
||||
|
|
|
@ -94,6 +94,7 @@ GCOV_PROFILE_test_bitmap.o := n
|
|||
endif
|
||||
|
||||
obj-$(CONFIG_TEST_UUID) += test_uuid.o
|
||||
obj-$(CONFIG_TEST_XARRAY) += test_xarray.o
|
||||
obj-$(CONFIG_TEST_MAPLE_TREE) += test_maple_tree.o
|
||||
obj-$(CONFIG_TEST_PARMAN) += test_parman.o
|
||||
obj-$(CONFIG_TEST_KMOD) += test_kmod.o
|
||||
|
@ -372,7 +373,6 @@ CFLAGS_bitfield_kunit.o := $(DISABLE_STRUCTLEAK_PLUGIN)
|
|||
obj-$(CONFIG_BITFIELD_KUNIT) += bitfield_kunit.o
|
||||
obj-$(CONFIG_CHECKSUM_KUNIT) += checksum_kunit.o
|
||||
obj-$(CONFIG_UTIL_MACROS_KUNIT) += util_macros_kunit.o
|
||||
obj-$(CONFIG_XARRAY_KUNIT) += test_xarray.o
|
||||
obj-$(CONFIG_LIST_KUNIT_TEST) += list-test.o
|
||||
obj-$(CONFIG_HASHTABLE_KUNIT_TEST) += hashtable_test.o
|
||||
obj-$(CONFIG_LINEAR_RANGES_TEST) += test_linear_ranges.o
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -2491,7 +2491,8 @@ bool compaction_zonelist_suitable(struct alloc_context *ac, int order,
|
|||
*/
|
||||
static enum compact_result
|
||||
compaction_suit_allocation_order(struct zone *zone, unsigned int order,
|
||||
int highest_zoneidx, unsigned int alloc_flags)
|
||||
int highest_zoneidx, unsigned int alloc_flags,
|
||||
bool async)
|
||||
{
|
||||
unsigned long watermark;
|
||||
|
||||
|
@ -2500,6 +2501,23 @@ compaction_suit_allocation_order(struct zone *zone, unsigned int order,
|
|||
alloc_flags))
|
||||
return COMPACT_SUCCESS;
|
||||
|
||||
/*
|
||||
* For unmovable allocations (without ALLOC_CMA), check if there is enough
|
||||
* free memory in the non-CMA pageblocks. Otherwise compaction could form
|
||||
* the high-order page in CMA pageblocks, which would not help the
|
||||
* allocation to succeed. However, limit the check to costly order async
|
||||
* compaction (such as opportunistic THP attempts) because there is the
|
||||
* possibility that compaction would migrate pages from non-CMA to CMA
|
||||
* pageblock.
|
||||
*/
|
||||
if (order > PAGE_ALLOC_COSTLY_ORDER && async &&
|
||||
!(alloc_flags & ALLOC_CMA)) {
|
||||
watermark = low_wmark_pages(zone) + compact_gap(order);
|
||||
if (!__zone_watermark_ok(zone, 0, watermark, highest_zoneidx,
|
||||
0, zone_page_state(zone, NR_FREE_PAGES)))
|
||||
return COMPACT_SKIPPED;
|
||||
}
|
||||
|
||||
if (!compaction_suitable(zone, order, highest_zoneidx))
|
||||
return COMPACT_SKIPPED;
|
||||
|
||||
|
@ -2535,7 +2553,8 @@ compact_zone(struct compact_control *cc, struct capture_control *capc)
|
|||
if (!is_via_compact_memory(cc->order)) {
|
||||
ret = compaction_suit_allocation_order(cc->zone, cc->order,
|
||||
cc->highest_zoneidx,
|
||||
cc->alloc_flags);
|
||||
cc->alloc_flags,
|
||||
cc->mode == MIGRATE_ASYNC);
|
||||
if (ret != COMPACT_CONTINUE)
|
||||
return ret;
|
||||
}
|
||||
|
@ -3038,7 +3057,8 @@ static bool kcompactd_node_suitable(pg_data_t *pgdat)
|
|||
|
||||
ret = compaction_suit_allocation_order(zone,
|
||||
pgdat->kcompactd_max_order,
|
||||
highest_zoneidx, ALLOC_WMARK_MIN);
|
||||
highest_zoneidx, ALLOC_WMARK_MIN,
|
||||
false);
|
||||
if (ret == COMPACT_CONTINUE)
|
||||
return true;
|
||||
}
|
||||
|
@ -3079,7 +3099,8 @@ static void kcompactd_do_work(pg_data_t *pgdat)
|
|||
continue;
|
||||
|
||||
ret = compaction_suit_allocation_order(zone,
|
||||
cc.order, zoneid, ALLOC_WMARK_MIN);
|
||||
cc.order, zoneid, ALLOC_WMARK_MIN,
|
||||
false);
|
||||
if (ret != COMPACT_CONTINUE)
|
||||
continue;
|
||||
|
||||
|
|
14
mm/gup.c
14
mm/gup.c
|
@ -2320,13 +2320,13 @@ static void pofs_unpin(struct pages_or_folios *pofs)
|
|||
/*
|
||||
* Returns the number of collected folios. Return value is always >= 0.
|
||||
*/
|
||||
static unsigned long collect_longterm_unpinnable_folios(
|
||||
static void collect_longterm_unpinnable_folios(
|
||||
struct list_head *movable_folio_list,
|
||||
struct pages_or_folios *pofs)
|
||||
{
|
||||
unsigned long i, collected = 0;
|
||||
struct folio *prev_folio = NULL;
|
||||
bool drain_allow = true;
|
||||
unsigned long i;
|
||||
|
||||
for (i = 0; i < pofs->nr_entries; i++) {
|
||||
struct folio *folio = pofs_get_folio(pofs, i);
|
||||
|
@ -2338,8 +2338,6 @@ static unsigned long collect_longterm_unpinnable_folios(
|
|||
if (folio_is_longterm_pinnable(folio))
|
||||
continue;
|
||||
|
||||
collected++;
|
||||
|
||||
if (folio_is_device_coherent(folio))
|
||||
continue;
|
||||
|
||||
|
@ -2361,8 +2359,6 @@ static unsigned long collect_longterm_unpinnable_folios(
|
|||
NR_ISOLATED_ANON + folio_is_file_lru(folio),
|
||||
folio_nr_pages(folio));
|
||||
}
|
||||
|
||||
return collected;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -2439,11 +2435,9 @@ static long
|
|||
check_and_migrate_movable_pages_or_folios(struct pages_or_folios *pofs)
|
||||
{
|
||||
LIST_HEAD(movable_folio_list);
|
||||
unsigned long collected;
|
||||
|
||||
collected = collect_longterm_unpinnable_folios(&movable_folio_list,
|
||||
pofs);
|
||||
if (!collected)
|
||||
collect_longterm_unpinnable_folios(&movable_folio_list, pofs);
|
||||
if (list_empty(&movable_folio_list))
|
||||
return 0;
|
||||
|
||||
return migrate_longterm_unpinnable_folios(&movable_folio_list, pofs);
|
||||
|
|
|
@ -3309,7 +3309,7 @@ static void __init gather_bootmem_prealloc(void)
|
|||
.thread_fn = gather_bootmem_prealloc_parallel,
|
||||
.fn_arg = NULL,
|
||||
.start = 0,
|
||||
.size = num_node_state(N_MEMORY),
|
||||
.size = nr_node_ids,
|
||||
.align = 1,
|
||||
.min_chunk = 1,
|
||||
.max_threads = num_node_state(N_MEMORY),
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
#include <linux/log2.h>
|
||||
#include <linux/memblock.h>
|
||||
#include <linux/moduleparam.h>
|
||||
#include <linux/nodemask.h>
|
||||
#include <linux/notifier.h>
|
||||
#include <linux/panic_notifier.h>
|
||||
#include <linux/random.h>
|
||||
|
@ -1084,6 +1085,7 @@ void *__kfence_alloc(struct kmem_cache *s, size_t size, gfp_t flags)
|
|||
* properties (e.g. reside in DMAable memory).
|
||||
*/
|
||||
if ((flags & GFP_ZONEMASK) ||
|
||||
((flags & __GFP_THISNODE) && num_online_nodes() > 1) ||
|
||||
(s->flags & (SLAB_CACHE_DMA | SLAB_CACHE_DMA32))) {
|
||||
atomic_long_inc(&counters[KFENCE_COUNTER_SKIP_INCOMPAT]);
|
||||
return NULL;
|
||||
|
|
|
@ -1689,7 +1689,7 @@ static void kmemleak_scan(void)
|
|||
unsigned long phys = object->pointer;
|
||||
|
||||
if (PHYS_PFN(phys) < min_low_pfn ||
|
||||
PHYS_PFN(phys + object->size) >= max_low_pfn)
|
||||
PHYS_PFN(phys + object->size) > max_low_pfn)
|
||||
__paint_it(object, KMEMLEAK_BLACK);
|
||||
}
|
||||
|
||||
|
|
|
@ -794,7 +794,7 @@ static unsigned int alloc_swap_scan_cluster(struct swap_info_struct *si,
|
|||
if (!cluster_scan_range(si, ci, offset, nr_pages, &need_reclaim))
|
||||
continue;
|
||||
if (need_reclaim) {
|
||||
ret = cluster_reclaim_range(si, ci, start, end);
|
||||
ret = cluster_reclaim_range(si, ci, offset, offset + nr_pages);
|
||||
/*
|
||||
* Reclaim drops ci->lock and cluster could be used
|
||||
* by another order. Not checking flag as off-list
|
||||
|
|
13
mm/vmscan.c
13
mm/vmscan.c
|
@ -1086,7 +1086,7 @@ static unsigned int shrink_folio_list(struct list_head *folio_list,
|
|||
struct folio_batch free_folios;
|
||||
LIST_HEAD(ret_folios);
|
||||
LIST_HEAD(demote_folios);
|
||||
unsigned int nr_reclaimed = 0;
|
||||
unsigned int nr_reclaimed = 0, nr_demoted = 0;
|
||||
unsigned int pgactivate = 0;
|
||||
bool do_demote_pass;
|
||||
struct swap_iocb *plug = NULL;
|
||||
|
@ -1550,8 +1550,9 @@ keep:
|
|||
/* 'folio_list' is always empty here */
|
||||
|
||||
/* Migrate folios selected for demotion */
|
||||
stat->nr_demoted = demote_folio_list(&demote_folios, pgdat);
|
||||
nr_reclaimed += stat->nr_demoted;
|
||||
nr_demoted = demote_folio_list(&demote_folios, pgdat);
|
||||
nr_reclaimed += nr_demoted;
|
||||
stat->nr_demoted += nr_demoted;
|
||||
/* Folios that could not be demoted are still in @demote_folios */
|
||||
if (!list_empty(&demote_folios)) {
|
||||
/* Folios which weren't demoted go back on @folio_list */
|
||||
|
@ -1692,6 +1693,7 @@ static unsigned long isolate_lru_folios(unsigned long nr_to_scan,
|
|||
unsigned long nr_skipped[MAX_NR_ZONES] = { 0, };
|
||||
unsigned long skipped = 0;
|
||||
unsigned long scan, total_scan, nr_pages;
|
||||
unsigned long max_nr_skipped = 0;
|
||||
LIST_HEAD(folios_skipped);
|
||||
|
||||
total_scan = 0;
|
||||
|
@ -1706,9 +1708,12 @@ static unsigned long isolate_lru_folios(unsigned long nr_to_scan,
|
|||
nr_pages = folio_nr_pages(folio);
|
||||
total_scan += nr_pages;
|
||||
|
||||
if (folio_zonenum(folio) > sc->reclaim_idx) {
|
||||
/* Using max_nr_skipped to prevent hard LOCKUP*/
|
||||
if (max_nr_skipped < SWAP_CLUSTER_MAX_SKIPPED &&
|
||||
(folio_zonenum(folio) > sc->reclaim_idx)) {
|
||||
nr_skipped[folio_zonenum(folio)] += nr_pages;
|
||||
move_to = &folios_skipped;
|
||||
max_nr_skipped++;
|
||||
goto move;
|
||||
}
|
||||
|
||||
|
|
|
@ -452,7 +452,7 @@ static DEFINE_PER_CPU(struct mapping_area, zs_map_area) = {
|
|||
.lock = INIT_LOCAL_LOCK(lock),
|
||||
};
|
||||
|
||||
static inline bool is_first_zpdesc(struct zpdesc *zpdesc)
|
||||
static inline bool __maybe_unused is_first_zpdesc(struct zpdesc *zpdesc)
|
||||
{
|
||||
return PagePrivate(zpdesc_page(zpdesc));
|
||||
}
|
||||
|
|
|
@ -167,7 +167,7 @@ def get_current_task(cpu):
|
|||
var_ptr = gdb.parse_and_eval("&pcpu_hot.current_task")
|
||||
return per_cpu(var_ptr, cpu).dereference()
|
||||
elif utils.is_target_arch("aarch64"):
|
||||
current_task_addr = gdb.parse_and_eval("$SP_EL0")
|
||||
current_task_addr = gdb.parse_and_eval("(unsigned long)$SP_EL0")
|
||||
if (current_task_addr >> 63) != 0:
|
||||
current_task = current_task_addr.cast(task_ptr_type)
|
||||
return current_task.dereference()
|
||||
|
|
Loading…
Add table
Reference in a new issue