Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bc32df00 authored by Heiko Carstens's avatar Heiko Carstens Committed by Linus Torvalds
Browse files

memory hotplug: allow setting of phys_device



/sys/devices/system/memory/memoryX/phys_device is supposed to contain the
number of the physical device that the corresponding piece of memory
belongs to.

In case a physical device should be replaced or taken offline for whatever
reason it is necessary to set all corresponding memory pieces offline.
The current implementation always sets phys_device to '0' and there is no
way or hook to change that.  Seems like there was a plan to implement that
but it wasn't finished for whatever reason.

So add a weak function which architectures can override to actually set
the phys_device from within add_memory_block().

Signed-off-by: default avatarHeiko Carstens <heiko.carstens@de.ibm.com>
Cc: Dave Hansen <haveblue@us.ibm.com>
Cc: Gerald Schaefer <gerald.schaefer@de.ibm.com>
Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent e5d61511
Loading
Loading
Loading
Loading
+10 −5
Original line number Diff line number Diff line
@@ -429,12 +429,16 @@ static inline int memory_fail_init(void)
 * differentiation between which *physical* devices each
 * section belongs to...
 */
int __weak arch_get_memory_phys_device(unsigned long start_pfn)
{
	return 0;
}

static int add_memory_block(int nid, struct mem_section *section,
			unsigned long state, int phys_device,
			enum mem_add_context context)
			unsigned long state, enum mem_add_context context)
{
	struct memory_block *mem = kzalloc(sizeof(*mem), GFP_KERNEL);
	unsigned long start_pfn;
	int ret = 0;

	if (!mem)
@@ -443,7 +447,8 @@ static int add_memory_block(int nid, struct mem_section *section,
	mem->phys_index = __section_nr(section);
	mem->state = state;
	mutex_init(&mem->state_mutex);
	mem->phys_device = phys_device;
	start_pfn = section_nr_to_pfn(mem->phys_index);
	mem->phys_device = arch_get_memory_phys_device(start_pfn);

	ret = register_memory(mem, section);
	if (!ret)
@@ -515,7 +520,7 @@ int remove_memory_block(unsigned long node_id, struct mem_section *section,
 */
int register_new_memory(int nid, struct mem_section *section)
{
	return add_memory_block(nid, section, MEM_OFFLINE, 0, HOTPLUG);
	return add_memory_block(nid, section, MEM_OFFLINE, HOTPLUG);
}

int unregister_memory_section(struct mem_section *section)
@@ -548,7 +553,7 @@ int __init memory_dev_init(void)
		if (!present_section_nr(i))
			continue;
		err = add_memory_block(0, __nr_to_section(i), MEM_ONLINE,
					0, BOOT);
				       BOOT);
		if (!ret)
			ret = err;
	}
+2 −0
Original line number Diff line number Diff line
@@ -36,6 +36,8 @@ struct memory_block {
	struct sys_device sysdev;
};

int arch_get_memory_phys_device(unsigned long start_pfn);

/* These states are exposed to userspace as text strings in sysfs */
#define	MEM_ONLINE		(1<<0) /* exposed to userspace */
#define	MEM_GOING_OFFLINE	(1<<1) /* exposed to userspace */