drivers/base/memory.c: Don't store end_section_nr in memory blocks
Subsystems (4)
PATCH v2 1/1 drivers/base/memory.c: Don't store end_section_nr in memory blocks
Each memory block spans the same amount of sections/pages/bytes. The size is determined before the first memory block is created. No need to store what we can easily calculate - and the calculations even look simpler now.
Michal brought up the idea of variable-sized memory blocks. However, if we ever implement something like this, we will need an API compatibility switch and reworks at various places (most code assumes a fixed memory block size). So let's cleanup what we have right now.
While at it, fix the variable naming in register_mem_sect_under_node() - we no longer talk about a single section.
---
v1 -> v2:
- Drop the macro for calculating the pfns per memory block
--- drivers/base/memory.c | 1 - drivers/base/node.c | 10 +++++----- include/linux/memory.h | 1 - mm/memory_hotplug.c | 2 +- 4 files changed, 6 insertions(+), 8 deletions(-)
drivers/base/memory.c +0 -1
@@ -670,7 +670,6 @@ static int init_memory_block(struct memory_block **memory,return -ENOMEM ; mem->start_section_nr = block_id * sections_per_block; - mem->end_section_nr = mem->start_section_nr + sections_per_block -1 ; mem->state = state; start_pfn =section_nr_to_pfn (mem->start_section_nr); mem->phys_device =arch_get_memory_phys_device (start_pfn);
drivers/base/node.c +5 -5
@@ -756,13 +756,13 @@ static int __ref get_nid_for_pfn(unsigned long pfn)static int register_mem_sect_under_node (struct memory_block *mem_blk,void *arg) { +unsigned long memory_block_pfns =memory_block_size_bytes () /PAGE_SIZE ; +unsigned long start_pfn =section_nr_to_pfn (mem_blk->start_section_nr); +unsigned long end_pfn = start_pfn + memory_block_pfns -1 ;int ret, nid = *(int *)arg; -unsigned long pfn, sect_start_pfn, sect_end_pfn; +unsigned long pfn; - sect_start_pfn =section_nr_to_pfn (mem_blk->start_section_nr); - sect_end_pfn =section_nr_to_pfn (mem_blk->end_section_nr); - sect_end_pfn +=PAGES_PER_SECTION -1 ; -for (pfn = sect_start_pfn; pfn <= sect_end_pfn; pfn++) { +for (pfn = start_pfn; pfn <= end_pfn; pfn++) {int page_nid;/*
include/linux/memory.h +0 -1
@@ -25,7 +25,6 @@struct memory_block {unsigned long start_section_nr; -unsigned long end_section_nr;unsigned long state;/* serialized by the dev->lock */ int section_count;/* serialized by mem_sysfs_mutex */ int online_type;/* for passing data to online routine */
mm/memory_hotplug.c +1 -1
@@ -1650,7 +1650,7 @@ static int check_memblock_offlined_cb(struct memory_block *mem, void *arg)phys_addr_t beginpa, endpa; beginpa =PFN_PHYS (section_nr_to_pfn (mem->start_section_nr)); - endpa =PFN_PHYS (section_nr_to_pfn (mem->end_section_nr +1 ))-1 ; + endpa = beginpa +memory_block_size_bytes () -1 ;pr_warn ("removing memory fails, because memory [%pa-%pa] is onlined\n" , &beginpa, &endpa);
Signature · 1 line
2.21.0