Message ID | 160106111109.30709.3173462396758431559.stgit@dwillia2-desk3.amr.corp.intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | device-dax: support sub-dividing soft-reserved ranges | expand |
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@redhat.com> > Cc: Vishal Verma <vishal.l.verma@intel.com> > Cc: Dave Hansen <dave.hansen@linux.intel.com> > Cc: Pavel Tatashin <pasha.tatashin@soleen.com> > Cc: Brice Goglin <Brice.Goglin@inria.fr> > Cc: Dave Jiang <dave.jiang@intel.com> > Cc: David Hildenbrand <david@redhat.com> > Cc: Ira Weiny <ira.weiny@intel.com> > Cc: Jia He <justin.he@arm.com> > Cc: Joao Martins <joao.m.martins@oracle.com> > Cc: Jonathan Cameron <Jonathan.Cameron@huawei.com> > Signed-off-by: Dan Williams <dan.j.williams@intel.com> > --- > 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@redhat.com>
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; }
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@redhat.com> Cc: Vishal Verma <vishal.l.verma@intel.com> Cc: Dave Hansen <dave.hansen@linux.intel.com> Cc: Pavel Tatashin <pasha.tatashin@soleen.com> Cc: Brice Goglin <Brice.Goglin@inria.fr> Cc: Dave Jiang <dave.jiang@intel.com> Cc: David Hildenbrand <david@redhat.com> Cc: Ira Weiny <ira.weiny@intel.com> Cc: Jia He <justin.he@arm.com> Cc: Joao Martins <joao.m.martins@oracle.com> Cc: Jonathan Cameron <Jonathan.Cameron@huawei.com> Signed-off-by: Dan Williams <dan.j.williams@intel.com> --- drivers/dax/kmem.c | 40 +++++++++++++++++----------------------- 1 file changed, 17 insertions(+), 23 deletions(-)