On 25.09.20 21:11, Dan Williams wrote: > Towards removing the mode specific @dax_kmem_res attribute from the > generic 'struct dev_dax', and preparing for multi-range support, teach > the driver to calculate the hotplug range from the device range. The > hotplug range is the trivially calculated memory-block-size aligned > version of the device range. > > Cc: David Hildenbrand <david@xxxxxxxxxx> > Cc: Vishal Verma <vishal.l.verma@xxxxxxxxx> > Cc: Dave Hansen <dave.hansen@xxxxxxxxxxxxxxx> > Cc: Pavel Tatashin <pasha.tatashin@xxxxxxxxxx> > Cc: Brice Goglin <Brice.Goglin@xxxxxxxx> > Cc: Dave Jiang <dave.jiang@xxxxxxxxx> > Cc: David Hildenbrand <david@xxxxxxxxxx> > Cc: Ira Weiny <ira.weiny@xxxxxxxxx> > Cc: Jia He <justin.he@xxxxxxx> > Cc: Joao Martins <joao.m.martins@xxxxxxxxxx> > Cc: Jonathan Cameron <Jonathan.Cameron@xxxxxxxxxx> > Signed-off-by: Dan Williams <dan.j.williams@xxxxxxxxx> > --- > drivers/dax/kmem.c | 40 +++++++++++++++++----------------------- > 1 file changed, 17 insertions(+), 23 deletions(-) > > diff --git a/drivers/dax/kmem.c b/drivers/dax/kmem.c > index 5bb133df147d..b0d6a99cf12d 100644 > --- a/drivers/dax/kmem.c > +++ b/drivers/dax/kmem.c > @@ -19,13 +19,20 @@ static const char *kmem_name; > /* Set if any memory will remain added when the driver will be unloaded. */ > static bool any_hotremove_failed; > > +static struct range dax_kmem_range(struct dev_dax *dev_dax) > +{ > + struct range range; > + > + /* memory-block align the hotplug range */ > + range.start = ALIGN(dev_dax->range.start, memory_block_size_bytes()); > + range.end = ALIGN_DOWN(dev_dax->range.end + 1, memory_block_size_bytes()) - 1; > + return range; > +} > + > int dev_dax_kmem_probe(struct device *dev) > { > struct dev_dax *dev_dax = to_dev_dax(dev); > - struct range *range = &dev_dax->range; > - resource_size_t kmem_start; > - resource_size_t kmem_size; > - resource_size_t kmem_end; > + struct range range = dax_kmem_range(dev_dax); > struct resource *new_res; > const char *new_res_name; > int numa_node; > @@ -44,25 +51,14 @@ int dev_dax_kmem_probe(struct device *dev) > return -EINVAL; > } > > - /* Hotplug starting at the beginning of the next block: */ > - kmem_start = ALIGN(range->start, memory_block_size_bytes()); > - > - kmem_size = range_len(range); > - /* Adjust the size down to compensate for moving up kmem_start: */ > - kmem_size -= kmem_start - range->start; > - /* Align the size down to cover only complete blocks: */ > - kmem_size &= ~(memory_block_size_bytes() - 1); > - kmem_end = kmem_start + kmem_size; > - > new_res_name = kstrdup(dev_name(dev), GFP_KERNEL); > if (!new_res_name) > return -ENOMEM; > > /* Region is permanently reserved if hotremove fails. */ > - new_res = request_mem_region(kmem_start, kmem_size, new_res_name); > + new_res = request_mem_region(range.start, range_len(&range), new_res_name); > if (!new_res) { > - dev_warn(dev, "could not reserve region [%pa-%pa]\n", > - &kmem_start, &kmem_end); > + dev_warn(dev, "could not reserve region [%#llx-%#llx]\n", range.start, range.end); > kfree(new_res_name); > return -EBUSY; > } > @@ -96,9 +92,8 @@ int dev_dax_kmem_probe(struct device *dev) > static int dev_dax_kmem_remove(struct device *dev) > { > struct dev_dax *dev_dax = to_dev_dax(dev); > + struct range range = dax_kmem_range(dev_dax); > struct resource *res = dev_dax->dax_kmem_res; > - resource_size_t kmem_start = res->start; > - resource_size_t kmem_size = resource_size(res); > const char *res_name = res->name; > int rc; > > @@ -108,12 +103,11 @@ static int dev_dax_kmem_remove(struct device *dev) > * there is no way to hotremove this memory until reboot because device > * unbind will succeed even if we return failure. > */ > - rc = remove_memory(dev_dax->target_node, kmem_start, kmem_size); > + rc = remove_memory(dev_dax->target_node, range.start, range_len(&range)); > if (rc) { > any_hotremove_failed = true; > - dev_err(dev, > - "DAX region %pR cannot be hotremoved until the next reboot\n", > - res); > + dev_err(dev, "%#llx-%#llx cannot be hotremoved until the next reboot\n", > + range.start, range.end); > return rc; > } > > Reviewed-by: David Hildenbrand <david@xxxxxxxxxx> -- Thanks, David / dhildenb