Commit bc32df00894f0e1dbf583cc3dab210d2969b078a
Committed by
Linus Torvalds
1 parent
e5d6151115
Exists in
master
and in
7 other branches
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: Heiko 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: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Showing 2 changed files with 12 additions and 5 deletions Side-by-side Diff
drivers/base/memory.c
... | ... | @@ -429,12 +429,16 @@ |
429 | 429 | * differentiation between which *physical* devices each |
430 | 430 | * section belongs to... |
431 | 431 | */ |
432 | +int __weak arch_get_memory_phys_device(unsigned long start_pfn) | |
433 | +{ | |
434 | + return 0; | |
435 | +} | |
432 | 436 | |
433 | 437 | static int add_memory_block(int nid, struct mem_section *section, |
434 | - unsigned long state, int phys_device, | |
435 | - enum mem_add_context context) | |
438 | + unsigned long state, enum mem_add_context context) | |
436 | 439 | { |
437 | 440 | struct memory_block *mem = kzalloc(sizeof(*mem), GFP_KERNEL); |
441 | + unsigned long start_pfn; | |
438 | 442 | int ret = 0; |
439 | 443 | |
440 | 444 | if (!mem) |
... | ... | @@ -443,7 +447,8 @@ |
443 | 447 | mem->phys_index = __section_nr(section); |
444 | 448 | mem->state = state; |
445 | 449 | mutex_init(&mem->state_mutex); |
446 | - mem->phys_device = phys_device; | |
450 | + start_pfn = section_nr_to_pfn(mem->phys_index); | |
451 | + mem->phys_device = arch_get_memory_phys_device(start_pfn); | |
447 | 452 | |
448 | 453 | ret = register_memory(mem, section); |
449 | 454 | if (!ret) |
... | ... | @@ -515,7 +520,7 @@ |
515 | 520 | */ |
516 | 521 | int register_new_memory(int nid, struct mem_section *section) |
517 | 522 | { |
518 | - return add_memory_block(nid, section, MEM_OFFLINE, 0, HOTPLUG); | |
523 | + return add_memory_block(nid, section, MEM_OFFLINE, HOTPLUG); | |
519 | 524 | } |
520 | 525 | |
521 | 526 | int unregister_memory_section(struct mem_section *section) |
... | ... | @@ -548,7 +553,7 @@ |
548 | 553 | if (!present_section_nr(i)) |
549 | 554 | continue; |
550 | 555 | err = add_memory_block(0, __nr_to_section(i), MEM_ONLINE, |
551 | - 0, BOOT); | |
556 | + BOOT); | |
552 | 557 | if (!ret) |
553 | 558 | ret = err; |
554 | 559 | } |
include/linux/memory.h
... | ... | @@ -36,6 +36,8 @@ |
36 | 36 | struct sys_device sysdev; |
37 | 37 | }; |
38 | 38 | |
39 | +int arch_get_memory_phys_device(unsigned long start_pfn); | |
40 | + | |
39 | 41 | /* These states are exposed to userspace as text strings in sysfs */ |
40 | 42 | #define MEM_ONLINE (1<<0) /* exposed to userspace */ |
41 | 43 | #define MEM_GOING_OFFLINE (1<<1) /* exposed to userspace */ |