On 10/10/2019 10:29 PM, Dave Hansen wrote:> On 10/10/19 12:28 AM, lantianyu1986@xxxxxxxxx wrote: >> When release mem region, old mem region may be splited to >> two regions. Current allocate new struct resource for high >> end mem region but not move child resources whose ranges are >> in the high end range to new resource. When adjust old mem >> region's range, adjust_resource() detects child region's range >> is out of new range and return error. Move child resources to >> high end resource before adjusting old mem range. > > From the comment, it appears the old code intended to have the behavior > that you are changing. Could you explain _why_ this has become a > problem for you? Hi Dave: Thanks for your review. current code assumes that all children remain in the lower address entry for simplicity. For memory hot-remove, selecting remove region via scanning system memory may hit case of child in the higher address entry. For example, the following output from /proc/iomem shows kernel code, data and bss locate from 3a000000 to 3b5fffff and these resources are the system ram resource's children. If the 39800000-39ffffff was selected as remove range, the resource will be split into two ranges 00100000-397fffff and 39800000-b87f1fff. Current code move kernel image related resources under 00100000-397fffff resource. This will cause adjust_resource() return error because children are not in the parent's range. 00100000-b87f1fff : System RAM 3a000000-3ac00e80 : Kernel code 3ac00e81-3b33883f : Kernel data 3b4d3000-3b5fffff : Kernel bss