On 31.08.2018 00:14, Pasha Tatashin wrote: > Hi David, > > I am not sure this is needed, because we already have a stricter checker: > > check_hotplug_memory_range() > > You could call it from online_pages(), if you think there is a reason to > do it, but other than that it is done from add_memory_resource() and > from remove_memory(). Hi, As offline_pages() is called from a different location for ppc (and I understand why but don't consider this clean) and I used both functions in a prototype, believing they would work with pageblock_nr_pages, I really think that we should at least drop the misleading check from offline_pages() and better also add checks for check_hotplug_memory_range(). Thanks for having a look Pavel! > > Thank you, > Pavel > > On 8/16/18 6:06 AM, David Hildenbrand wrote: >> onlining/offlining code works on whole sections, so let's enforce that. >> Existing code only allows to add memory in memory block size. And only >> whole memory blocks can be onlined/offlined. Memory blocks are always >> aligned to sections, so this should not break anything. >> >> online_pages/offline_pages will implicitly mark whole sections >> online/offline, so the code really can only handle such granularities. >> >> (especially offlining code cannot deal with pageblock_nr_pages but >> theoretically only MAX_ORDER-1) >> >> Signed-off-by: David Hildenbrand <david@xxxxxxxxxx> >> --- >> mm/memory_hotplug.c | 10 +++++++--- >> 1 file changed, 7 insertions(+), 3 deletions(-) >> >> diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c >> index 090cf474de87..30d2fa42b0bb 100644 >> --- a/mm/memory_hotplug.c >> +++ b/mm/memory_hotplug.c >> @@ -897,6 +897,11 @@ int __ref online_pages(unsigned long pfn, unsigned long nr_pages, int online_typ >> struct memory_notify arg; >> struct memory_block *mem; >> >> + if (!IS_ALIGNED(pfn, PAGES_PER_SECTION)) >> + return -EINVAL; >> + if (!IS_ALIGNED(nr_pages, PAGES_PER_SECTION)) >> + return -EINVAL; >> + >> /* >> * We can't use pfn_to_nid() because nid might be stored in struct page >> * which is not yet initialized. Instead, we find nid from memory block. >> @@ -1600,10 +1605,9 @@ int offline_pages(unsigned long start_pfn, unsigned long nr_pages) >> struct zone *zone; >> struct memory_notify arg; >> >> - /* at least, alignment against pageblock is necessary */ >> - if (!IS_ALIGNED(start_pfn, pageblock_nr_pages)) >> + if (!IS_ALIGNED(start_pfn, PAGES_PER_SECTION)) >> return -EINVAL; >> - if (!IS_ALIGNED(end_pfn, pageblock_nr_pages)) >> + if (!IS_ALIGNED(nr_pages, PAGES_PER_SECTION)) >> return -EINVAL; >> /* This makes hotplug much easier...and readable. >> we assume this for now. .*/ -- Thanks, David / dhildenb