mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/herbert/cryptodev-2.6.git
synced 2026-04-18 03:23:53 -04:00
Merge tag 'mm-stable-2022-10-08' of git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm
Pull MM updates from Andrew Morton: - Yu Zhao's Multi-Gen LRU patches are here. They've been under test in linux-next for a couple of months without, to my knowledge, any negative reports (or any positive ones, come to that). - Also the Maple Tree from Liam Howlett. An overlapping range-based tree for vmas. It it apparently slightly more efficient in its own right, but is mainly targeted at enabling work to reduce mmap_lock contention. Liam has identified a number of other tree users in the kernel which could be beneficially onverted to mapletrees. Yu Zhao has identified a hard-to-hit but "easy to fix" lockdep splat at [1]. This has yet to be addressed due to Liam's unfortunately timed vacation. He is now back and we'll get this fixed up. - Dmitry Vyukov introduces KMSAN: the Kernel Memory Sanitizer. It uses clang-generated instrumentation to detect used-unintialized bugs down to the single bit level. KMSAN keeps finding bugs. New ones, as well as the legacy ones. - Yang Shi adds a userspace mechanism (madvise) to induce a collapse of memory into THPs. - Zach O'Keefe has expanded Yang Shi's madvise(MADV_COLLAPSE) to support file/shmem-backed pages. - userfaultfd updates from Axel Rasmussen - zsmalloc cleanups from Alexey Romanov - cleanups from Miaohe Lin: vmscan, hugetlb_cgroup, hugetlb and memory-failure - Huang Ying adds enhancements to NUMA balancing memory tiering mode's page promotion, with a new way of detecting hot pages. - memcg updates from Shakeel Butt: charging optimizations and reduced memory consumption. - memcg cleanups from Kairui Song. - memcg fixes and cleanups from Johannes Weiner. - Vishal Moola provides more folio conversions - Zhang Yi removed ll_rw_block() :( - migration enhancements from Peter Xu - migration error-path bugfixes from Huang Ying - Aneesh Kumar added ability for a device driver to alter the memory tiering promotion paths. For optimizations by PMEM drivers, DRM drivers, etc. - vma merging improvements from Jakub Matěn. - NUMA hinting cleanups from David Hildenbrand. - xu xin added aditional userspace visibility into KSM merging activity. - THP & KSM code consolidation from Qi Zheng. - more folio work from Matthew Wilcox. - KASAN updates from Andrey Konovalov. - DAMON cleanups from Kaixu Xia. - DAMON work from SeongJae Park: fixes, cleanups. - hugetlb sysfs cleanups from Muchun Song. - Mike Kravetz fixes locking issues in hugetlbfs and in hugetlb core. Link: https://lkml.kernel.org/r/CAOUHufZabH85CeUN-MEMgL8gJGzJEWUrkiM58JkTbBhh-jew0Q@mail.gmail.com [1] * tag 'mm-stable-2022-10-08' of git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm: (555 commits) hugetlb: allocate vma lock for all sharable vmas hugetlb: take hugetlb vma_lock when clearing vma_lock->vma pointer hugetlb: fix vma lock handling during split vma and range unmapping mglru: mm/vmscan.c: fix imprecise comments mm/mglru: don't sync disk for each aging cycle mm: memcontrol: drop dead CONFIG_MEMCG_SWAP config symbol mm: memcontrol: use do_memsw_account() in a few more places mm: memcontrol: deprecate swapaccounting=0 mode mm: memcontrol: don't allocate cgroup swap arrays when memcg is disabled mm/secretmem: remove reduntant return value mm/hugetlb: add available_huge_pages() func mm: remove unused inline functions from include/linux/mm_inline.h selftests/vm: add selftest for MADV_COLLAPSE of uffd-minor memory selftests/vm: add file/shmem MADV_COLLAPSE selftest for cleared pmd selftests/vm: add thp collapse shmem testing selftests/vm: add thp collapse file and tmpfs testing selftests/vm: modularize thp collapse memory operations selftests/vm: dedup THP helpers mm/khugepaged: add tracepoint to hpage_collapse_scan_file() mm/madvise: add file and shmem support to MADV_COLLAPSE ...
This commit is contained in:
@@ -20,6 +20,7 @@
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <linux/swap.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/hugetlb.h>
|
||||
|
||||
static struct bus_type node_subsys = {
|
||||
.name = "node",
|
||||
@@ -589,64 +590,9 @@ static const struct attribute_group *node_dev_groups[] = {
|
||||
NULL
|
||||
};
|
||||
|
||||
#ifdef CONFIG_HUGETLBFS
|
||||
/*
|
||||
* hugetlbfs per node attributes registration interface:
|
||||
* When/if hugetlb[fs] subsystem initializes [sometime after this module],
|
||||
* it will register its per node attributes for all online nodes with
|
||||
* memory. It will also call register_hugetlbfs_with_node(), below, to
|
||||
* register its attribute registration functions with this node driver.
|
||||
* Once these hooks have been initialized, the node driver will call into
|
||||
* the hugetlb module to [un]register attributes for hot-plugged nodes.
|
||||
*/
|
||||
static node_registration_func_t __hugetlb_register_node;
|
||||
static node_registration_func_t __hugetlb_unregister_node;
|
||||
|
||||
static inline bool hugetlb_register_node(struct node *node)
|
||||
{
|
||||
if (__hugetlb_register_node &&
|
||||
node_state(node->dev.id, N_MEMORY)) {
|
||||
__hugetlb_register_node(node);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline void hugetlb_unregister_node(struct node *node)
|
||||
{
|
||||
if (__hugetlb_unregister_node)
|
||||
__hugetlb_unregister_node(node);
|
||||
}
|
||||
|
||||
void register_hugetlbfs_with_node(node_registration_func_t doregister,
|
||||
node_registration_func_t unregister)
|
||||
{
|
||||
__hugetlb_register_node = doregister;
|
||||
__hugetlb_unregister_node = unregister;
|
||||
}
|
||||
#else
|
||||
static inline void hugetlb_register_node(struct node *node) {}
|
||||
|
||||
static inline void hugetlb_unregister_node(struct node *node) {}
|
||||
#endif
|
||||
|
||||
static void node_device_release(struct device *dev)
|
||||
{
|
||||
struct node *node = to_node(dev);
|
||||
|
||||
#if defined(CONFIG_MEMORY_HOTPLUG) && defined(CONFIG_HUGETLBFS)
|
||||
/*
|
||||
* We schedule the work only when a memory section is
|
||||
* onlined/offlined on this node. When we come here,
|
||||
* all the memory on this node has been offlined,
|
||||
* so we won't enqueue new work to this work.
|
||||
*
|
||||
* The work is using node->node_work, so we should
|
||||
* flush work before freeing the memory.
|
||||
*/
|
||||
flush_work(&node->node_work);
|
||||
#endif
|
||||
kfree(node);
|
||||
kfree(to_node(dev));
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -665,13 +611,13 @@ static int register_node(struct node *node, int num)
|
||||
node->dev.groups = node_dev_groups;
|
||||
error = device_register(&node->dev);
|
||||
|
||||
if (error)
|
||||
if (error) {
|
||||
put_device(&node->dev);
|
||||
else {
|
||||
} else {
|
||||
hugetlb_register_node(node);
|
||||
|
||||
compaction_register_node(node);
|
||||
}
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
@@ -684,8 +630,8 @@ static int register_node(struct node *node, int num)
|
||||
*/
|
||||
void unregister_node(struct node *node)
|
||||
{
|
||||
hugetlb_unregister_node(node);
|
||||
compaction_unregister_node(node);
|
||||
hugetlb_unregister_node(node); /* no-op, if memoryless node */
|
||||
node_remove_accesses(node);
|
||||
node_remove_caches(node);
|
||||
device_unregister(&node->dev);
|
||||
@@ -907,74 +853,8 @@ void register_memory_blocks_under_node(int nid, unsigned long start_pfn,
|
||||
(void *)&nid, func);
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_HUGETLBFS
|
||||
/*
|
||||
* Handle per node hstate attribute [un]registration on transistions
|
||||
* to/from memoryless state.
|
||||
*/
|
||||
static void node_hugetlb_work(struct work_struct *work)
|
||||
{
|
||||
struct node *node = container_of(work, struct node, node_work);
|
||||
|
||||
/*
|
||||
* We only get here when a node transitions to/from memoryless state.
|
||||
* We can detect which transition occurred by examining whether the
|
||||
* node has memory now. hugetlb_register_node() already check this
|
||||
* so we try to register the attributes. If that fails, then the
|
||||
* node has transitioned to memoryless, try to unregister the
|
||||
* attributes.
|
||||
*/
|
||||
if (!hugetlb_register_node(node))
|
||||
hugetlb_unregister_node(node);
|
||||
}
|
||||
|
||||
static void init_node_hugetlb_work(int nid)
|
||||
{
|
||||
INIT_WORK(&node_devices[nid]->node_work, node_hugetlb_work);
|
||||
}
|
||||
|
||||
static int node_memory_callback(struct notifier_block *self,
|
||||
unsigned long action, void *arg)
|
||||
{
|
||||
struct memory_notify *mnb = arg;
|
||||
int nid = mnb->status_change_nid;
|
||||
|
||||
switch (action) {
|
||||
case MEM_ONLINE:
|
||||
case MEM_OFFLINE:
|
||||
/*
|
||||
* offload per node hstate [un]registration to a work thread
|
||||
* when transitioning to/from memoryless state.
|
||||
*/
|
||||
if (nid != NUMA_NO_NODE)
|
||||
schedule_work(&node_devices[nid]->node_work);
|
||||
break;
|
||||
|
||||
case MEM_GOING_ONLINE:
|
||||
case MEM_GOING_OFFLINE:
|
||||
case MEM_CANCEL_ONLINE:
|
||||
case MEM_CANCEL_OFFLINE:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return NOTIFY_OK;
|
||||
}
|
||||
#endif /* CONFIG_HUGETLBFS */
|
||||
#endif /* CONFIG_MEMORY_HOTPLUG */
|
||||
|
||||
#if !defined(CONFIG_MEMORY_HOTPLUG) || !defined(CONFIG_HUGETLBFS)
|
||||
static inline int node_memory_callback(struct notifier_block *self,
|
||||
unsigned long action, void *arg)
|
||||
{
|
||||
return NOTIFY_OK;
|
||||
}
|
||||
|
||||
static void init_node_hugetlb_work(int nid) { }
|
||||
|
||||
#endif
|
||||
|
||||
int __register_one_node(int nid)
|
||||
{
|
||||
int error;
|
||||
@@ -993,8 +873,6 @@ int __register_one_node(int nid)
|
||||
}
|
||||
|
||||
INIT_LIST_HEAD(&node_devices[nid]->access_list);
|
||||
/* initialize work queue for memory hot plug */
|
||||
init_node_hugetlb_work(nid);
|
||||
node_init_caches(nid);
|
||||
|
||||
return error;
|
||||
@@ -1065,13 +943,8 @@ static const struct attribute_group *cpu_root_attr_groups[] = {
|
||||
NULL,
|
||||
};
|
||||
|
||||
#define NODE_CALLBACK_PRI 2 /* lower than SLAB */
|
||||
void __init node_dev_init(void)
|
||||
{
|
||||
static struct notifier_block node_memory_callback_nb = {
|
||||
.notifier_call = node_memory_callback,
|
||||
.priority = NODE_CALLBACK_PRI,
|
||||
};
|
||||
int ret, i;
|
||||
|
||||
BUILD_BUG_ON(ARRAY_SIZE(node_state_attr) != NR_NODE_STATES);
|
||||
@@ -1081,8 +954,6 @@ void __init node_dev_init(void)
|
||||
if (ret)
|
||||
panic("%s() failed to register subsystem: %d\n", __func__, ret);
|
||||
|
||||
register_hotmemory_notifier(&node_memory_callback_nb);
|
||||
|
||||
/*
|
||||
* Create all node devices, which will properly link the node
|
||||
* to applicable memory block devices and already created cpu devices.
|
||||
|
||||
Reference in New Issue
Block a user