Message ID | 20190409100148.24703-4-david@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | mm/memory_hotplug: Better error handling when removing memory | expand |
On Tue, 2019-04-09 at 12:01 +0200, David Hildenbrand wrote: > Let's just warn in case a section is not valid instead of failing to > remove somewhere in the middle of the process, returning an error > that > will be mostly ignored by callers. > > Cc: Andrew Morton <akpm@linux-foundation.org> > Cc: Oscar Salvador <osalvador@suse.de> > Cc: Michal Hocko <mhocko@suse.com> > Cc: David Hildenbrand <david@redhat.com> > Cc: Pavel Tatashin <pasha.tatashin@soleen.com> > Cc: Qian Cai <cai@lca.pw> > Cc: Wei Yang <richard.weiyang@gmail.com> > Cc: Arun KS <arunks@codeaurora.org> > Cc: Mathieu Malaterre <malat@debian.org> > Signed-off-by: David Hildenbrand <david@redhat.com> Just a nit: I think this could be combined with patch#2. The only reason to fail in here is 1) !valid_section 2) !present_section. As I stated in patch#2, one cannot be without the other, so makes sense to rip present_section check from unregister_mem_section() as well. Then, you could combine both changelogs explaining the whole thing, and why we do not need the present_section check either. But the change looks good to me: Reviewed-by: Oscar Salvador <osalvador@suse.de> > --- > mm/memory_hotplug.c | 22 +++++++++------------- > 1 file changed, 9 insertions(+), 13 deletions(-) > > diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c > index b0cb05748f99..17a60281c36f 100644 > --- a/mm/memory_hotplug.c > +++ b/mm/memory_hotplug.c > @@ -517,15 +517,15 @@ static void __remove_zone(struct zone *zone, > unsigned long start_pfn) > pgdat_resize_unlock(zone->zone_pgdat, &flags); > } > > -static int __remove_section(struct zone *zone, struct mem_section > *ms, > - unsigned long map_offset, struct vmem_altmap > *altmap) > +static void __remove_section(struct zone *zone, struct mem_section > *ms, > + unsigned long map_offset, > + struct vmem_altmap *altmap) > { > unsigned long start_pfn; > int scn_nr; > - int ret = -EINVAL; > > - if (!valid_section(ms)) > - return ret; > + if (WARN_ON_ONCE(!valid_section(ms))) > + return; > > unregister_memory_section(ms); > > @@ -534,7 +534,6 @@ static int __remove_section(struct zone *zone, > struct mem_section *ms, > __remove_zone(zone, start_pfn); > > sparse_remove_one_section(zone, ms, map_offset, altmap); > - return 0; > } > > /** > @@ -554,7 +553,7 @@ int __remove_pages(struct zone *zone, unsigned > long phys_start_pfn, > { > unsigned long i; > unsigned long map_offset = 0; > - int sections_to_remove, ret = 0; > + int sections_to_remove; > > /* In the ZONE_DEVICE case device driver owns the memory > region */ > if (is_dev_zone(zone)) { > @@ -575,16 +574,13 @@ int __remove_pages(struct zone *zone, unsigned > long phys_start_pfn, > unsigned long pfn = phys_start_pfn + > i*PAGES_PER_SECTION; > > cond_resched(); > - ret = __remove_section(zone, __pfn_to_section(pfn), > map_offset, > - altmap); > + __remove_section(zone, __pfn_to_section(pfn), > map_offset, > + altmap); > map_offset = 0; > - if (ret) > - break; > } > > set_zone_contiguous(zone); > - > - return ret; > + return 0; > } > #endif /* CONFIG_MEMORY_HOTREMOVE */ >
On 17.04.19 15:56, Oscar Salvador wrote: > On Tue, 2019-04-09 at 12:01 +0200, David Hildenbrand wrote: >> Let's just warn in case a section is not valid instead of failing to >> remove somewhere in the middle of the process, returning an error >> that >> will be mostly ignored by callers. >> >> Cc: Andrew Morton <akpm@linux-foundation.org> >> Cc: Oscar Salvador <osalvador@suse.de> >> Cc: Michal Hocko <mhocko@suse.com> >> Cc: David Hildenbrand <david@redhat.com> >> Cc: Pavel Tatashin <pasha.tatashin@soleen.com> >> Cc: Qian Cai <cai@lca.pw> >> Cc: Wei Yang <richard.weiyang@gmail.com> >> Cc: Arun KS <arunks@codeaurora.org> >> Cc: Mathieu Malaterre <malat@debian.org> >> Signed-off-by: David Hildenbrand <david@redhat.com> > > Just a nit: > > I think this could be combined with patch#2. > The only reason to fail in here is 1) !valid_section 2) > !present_section. > As I stated in patch#2, one cannot be without the other, so makes sense > to rip present_section check from unregister_mem_section() as well. > Then, you could combine both changelogs explaining the whole thing, and > why we do not need the present_section check either. > If I have to resend the whole thing, I might do that. Otherwise we can drop the present_section() based on your explanation later. Thanks! > But the change looks good to me: > > Reviewed-by: Oscar Salvador <osalvador@suse.de>
diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c index b0cb05748f99..17a60281c36f 100644 --- a/mm/memory_hotplug.c +++ b/mm/memory_hotplug.c @@ -517,15 +517,15 @@ static void __remove_zone(struct zone *zone, unsigned long start_pfn) pgdat_resize_unlock(zone->zone_pgdat, &flags); } -static int __remove_section(struct zone *zone, struct mem_section *ms, - unsigned long map_offset, struct vmem_altmap *altmap) +static void __remove_section(struct zone *zone, struct mem_section *ms, + unsigned long map_offset, + struct vmem_altmap *altmap) { unsigned long start_pfn; int scn_nr; - int ret = -EINVAL; - if (!valid_section(ms)) - return ret; + if (WARN_ON_ONCE(!valid_section(ms))) + return; unregister_memory_section(ms); @@ -534,7 +534,6 @@ static int __remove_section(struct zone *zone, struct mem_section *ms, __remove_zone(zone, start_pfn); sparse_remove_one_section(zone, ms, map_offset, altmap); - return 0; } /** @@ -554,7 +553,7 @@ int __remove_pages(struct zone *zone, unsigned long phys_start_pfn, { unsigned long i; unsigned long map_offset = 0; - int sections_to_remove, ret = 0; + int sections_to_remove; /* In the ZONE_DEVICE case device driver owns the memory region */ if (is_dev_zone(zone)) { @@ -575,16 +574,13 @@ int __remove_pages(struct zone *zone, unsigned long phys_start_pfn, unsigned long pfn = phys_start_pfn + i*PAGES_PER_SECTION; cond_resched(); - ret = __remove_section(zone, __pfn_to_section(pfn), map_offset, - altmap); + __remove_section(zone, __pfn_to_section(pfn), map_offset, + altmap); map_offset = 0; - if (ret) - break; } set_zone_contiguous(zone); - - return ret; + return 0; } #endif /* CONFIG_MEMORY_HOTREMOVE */
Let's just warn in case a section is not valid instead of failing to remove somewhere in the middle of the process, returning an error that will be mostly ignored by callers. Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Oscar Salvador <osalvador@suse.de> Cc: Michal Hocko <mhocko@suse.com> Cc: David Hildenbrand <david@redhat.com> Cc: Pavel Tatashin <pasha.tatashin@soleen.com> Cc: Qian Cai <cai@lca.pw> Cc: Wei Yang <richard.weiyang@gmail.com> Cc: Arun KS <arunks@codeaurora.org> Cc: Mathieu Malaterre <malat@debian.org> Signed-off-by: David Hildenbrand <david@redhat.com> --- mm/memory_hotplug.c | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-)