Commit 7a405dbb authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'mm-stable-2025-10-03-16-49' of git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm

Pull more MM updates from Andrew Morton:
"Only two patch series in this pull request:

   - "mm/memory_hotplug: fixup crash during uevent handling" from Hannes
     Reinecke fixes a race that was causing udev to trigger a crash in
     the memory hotplug code

   - "mm_slot: following fixup for usage of mm_slot_entry()" from Wei
     Yang adds some touchups to the just-merged mm_slot changes"

* tag 'mm-stable-2025-10-03-16-49' of git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm:
  mm/khugepaged: use KMEM_CACHE()
  mm/ksm: cleanup mm_slot_entry() invocation
  Documentation/mm: drop pxx_mkdevmap() descriptions from page table helpers
  mm: clean up is_guard_pte_marker()
  drivers/base: move memory_block_add_nid() into the caller
  mm/memory_hotplug: activate node before adding new memory blocks
  drivers/base/memory: add node id parameter to add_memory_block()
parents cf0e371d c14bdcc9
Loading
Loading
Loading
Loading
+0 −6
Original line number Diff line number Diff line
@@ -52,8 +52,6 @@ PTE Page Table Helpers
+---------------------------+--------------------------------------------------+
| pte_mkspecial             | Creates a special PTE                            |
+---------------------------+--------------------------------------------------+
| pte_mkdevmap              | Creates a ZONE_DEVICE mapped PTE                 |
+---------------------------+--------------------------------------------------+
| pte_mksoft_dirty          | Creates a soft dirty PTE                         |
+---------------------------+--------------------------------------------------+
| pte_clear_soft_dirty      | Clears a soft dirty PTE                          |
@@ -124,8 +122,6 @@ PMD Page Table Helpers
+---------------------------+--------------------------------------------------+
| pmd_mkspecial             | Creates a special PMD                            |
+---------------------------+--------------------------------------------------+
| pmd_mkdevmap              | Creates a ZONE_DEVICE mapped PMD                 |
+---------------------------+--------------------------------------------------+
| pmd_mksoft_dirty          | Creates a soft dirty PMD                         |
+---------------------------+--------------------------------------------------+
| pmd_clear_soft_dirty      | Clears a soft dirty PMD                          |
@@ -185,8 +181,6 @@ PUD Page Table Helpers
+---------------------------+--------------------------------------------------+
| pud_wrprotect             | Creates a write protected PUD                    |
+---------------------------+--------------------------------------------------+
| pud_mkdevmap              | Creates a ZONE_DEVICE mapped PUD                 |
+---------------------------+--------------------------------------------------+
| pud_mkinvalid             | Invalidates a present PUD; do not call for       |
|                           | non-present PUD [1]                              |
+---------------------------+--------------------------------------------------+
+23 −30
Original line number Diff line number Diff line
@@ -769,21 +769,22 @@ static struct zone *early_node_zone_for_memory_block(struct memory_block *mem,

#ifdef CONFIG_NUMA
/**
 * memory_block_add_nid() - Indicate that system RAM falling into this memory
 *			    block device (partially) belongs to the given node.
 * memory_block_add_nid_early() - Indicate that early system RAM falling into
 *				  this memory block device (partially) belongs
 *				  to the given node.
 * @mem: The memory block device.
 * @nid: The node id.
 * @context: The memory initialization context.
 *
 * Indicate that system RAM falling into this memory block (partially) belongs
 * to the given node. If the context indicates ("early") that we are adding the
 * node during node device subsystem initialization, this will also properly
 * set/adjust mem->zone based on the zone ranges of the given node.
 * Indicate that early system RAM falling into this memory block (partially)
 * belongs to the given node. This will also properly set/adjust mem->zone based
 * on the zone ranges of the given node.
 *
 * Memory hotplug handles this on memory block creation, where we can only have
 * a single nid span a memory block.
 */
void memory_block_add_nid(struct memory_block *mem, int nid,
			  enum meminit_context context)
void memory_block_add_nid_early(struct memory_block *mem, int nid)
{
	if (context == MEMINIT_EARLY && mem->nid != nid) {
	if (mem->nid != nid) {
		/*
		 * For early memory we have to determine the zone when setting
		 * the node id and handle multiple nodes spanning a single
@@ -797,8 +798,6 @@ void memory_block_add_nid(struct memory_block *mem, int nid,
			mem->zone = early_node_zone_for_memory_block(mem, nid);
		else
			mem->zone = NULL;
	}

		/*
		 * If this memory block spans multiple nodes, we only indicate
		 * the last processed node. If we span multiple nodes (not applicable
@@ -807,9 +806,10 @@ void memory_block_add_nid(struct memory_block *mem, int nid,
		 */
		mem->nid = nid;
	}
}
#endif

static int add_memory_block(unsigned long block_id, unsigned long state,
static int add_memory_block(unsigned long block_id, int nid, unsigned long state,
			    struct vmem_altmap *altmap,
			    struct memory_group *group)
{
@@ -827,7 +827,7 @@ static int add_memory_block(unsigned long block_id, unsigned long state,

	mem->start_section_nr = block_id * sections_per_block;
	mem->state = state;
	mem->nid = NUMA_NO_NODE;
	mem->nid = nid;
	mem->altmap = altmap;
	INIT_LIST_HEAD(&mem->group_next);

@@ -854,13 +854,6 @@ static int add_memory_block(unsigned long block_id, unsigned long state,
	return 0;
}

static int add_hotplug_memory_block(unsigned long block_id,
				    struct vmem_altmap *altmap,
				    struct memory_group *group)
{
	return add_memory_block(block_id, MEM_OFFLINE, altmap, group);
}

static void remove_memory_block(struct memory_block *memory)
{
	if (WARN_ON_ONCE(memory->dev.bus != &memory_subsys))
@@ -886,7 +879,7 @@ static void remove_memory_block(struct memory_block *memory)
 * Called under device_hotplug_lock.
 */
int create_memory_block_devices(unsigned long start, unsigned long size,
				struct vmem_altmap *altmap,
				int nid, struct vmem_altmap *altmap,
				struct memory_group *group)
{
	const unsigned long start_block_id = pfn_to_block_id(PFN_DOWN(start));
@@ -900,7 +893,7 @@ int create_memory_block_devices(unsigned long start, unsigned long size,
		return -EINVAL;

	for (block_id = start_block_id; block_id != end_block_id; block_id++) {
		ret = add_hotplug_memory_block(block_id, altmap, group);
		ret = add_memory_block(block_id, nid, MEM_OFFLINE, altmap, group);
		if (ret)
			break;
	}
@@ -1005,7 +998,7 @@ void __init memory_dev_init(void)
			continue;

		block_id = memory_block_id(nr);
		ret = add_memory_block(block_id, MEM_ONLINE, NULL, NULL);
		ret = add_memory_block(block_id, NUMA_NO_NODE, MEM_ONLINE, NULL, NULL);
		if (ret) {
			panic("%s() failed to add memory block: %d\n",
			      __func__, ret);
+4 −6
Original line number Diff line number Diff line
@@ -819,13 +819,10 @@ int unregister_cpu_under_node(unsigned int cpu, unsigned int nid)

#ifdef CONFIG_MEMORY_HOTPLUG
static void do_register_memory_block_under_node(int nid,
						struct memory_block *mem_blk,
						enum meminit_context context)
						struct memory_block *mem_blk)
{
	int ret;

	memory_block_add_nid(mem_blk, nid, context);

	ret = sysfs_create_link_nowarn(&node_devices[nid]->dev.kobj,
				       &mem_blk->dev.kobj,
				       kobject_name(&mem_blk->dev.kobj));
@@ -853,7 +850,7 @@ static int register_mem_block_under_node_hotplug(struct memory_block *mem_blk,
{
	int nid = *(int *)arg;

	do_register_memory_block_under_node(nid, mem_blk, MEMINIT_HOTPLUG);
	do_register_memory_block_under_node(nid, mem_blk);
	return 0;
}

@@ -893,7 +890,8 @@ static void register_memory_blocks_under_nodes(void)
			if (!mem)
				continue;

			do_register_memory_block_under_node(nid, mem, MEMINIT_EARLY);
			memory_block_add_nid_early(mem, nid);
			do_register_memory_block_under_node(nid, mem);
			put_device(&mem->dev);
		}

+2 −3
Original line number Diff line number Diff line
@@ -159,7 +159,7 @@ static inline unsigned long memory_block_advised_max_size(void)
extern int register_memory_notifier(struct notifier_block *nb);
extern void unregister_memory_notifier(struct notifier_block *nb);
int create_memory_block_devices(unsigned long start, unsigned long size,
				struct vmem_altmap *altmap,
				int nid, struct vmem_altmap *altmap,
				struct memory_group *group);
void remove_memory_block_devices(unsigned long start, unsigned long size);
extern void memory_dev_init(void);
@@ -202,8 +202,7 @@ static inline unsigned long phys_to_block_id(unsigned long phys)
}

#ifdef CONFIG_NUMA
void memory_block_add_nid(struct memory_block *mem, int nid,
			  enum meminit_context context);
void memory_block_add_nid_early(struct memory_block *mem, int nid);
#endif /* CONFIG_NUMA */
int memory_block_advise_max_size(unsigned long size);
unsigned long memory_block_advised_max_size(void);
+1 −4
Original line number Diff line number Diff line
@@ -376,10 +376,7 @@ int hugepage_madvise(struct vm_area_struct *vma,

int __init khugepaged_init(void)
{
	mm_slot_cache = kmem_cache_create("khugepaged_mm_slot",
					  sizeof(struct mm_slot),
					  __alignof__(struct mm_slot),
					  0, NULL);
	mm_slot_cache = KMEM_CACHE(mm_slot, 0);
	if (!mm_slot_cache)
		return -ENOMEM;

Loading