Message ID | 20240618084639.1419629-3-ying.huang@intel.com |
---|---|
State | Accepted |
Commit | 643e8e3e65290fdfe507bb23fa524c77e1345af3 |
Headers | show |
Series | cxl/region: Support to calculate memory tier abstract distance | expand |
On Tue, 18 Jun 2024 16:46:38 +0800 Huang Ying <ying.huang@intel.com> wrote: > An abstract distance value must be assigned by the driver that makes > the memory available to the system. It reflects relative performance > and is used to place memory nodes backed by CXL regions in the appropriate > memory tiers allowing promotion/demotion within the existing memory tiering > mechanism. > > The abstract distance is calculated based on the memory access latency > and bandwidth of CXL regions. > > Signed-off-by: "Huang, Ying" <ying.huang@intel.com> > Acked-by: Dan Williams <dan.j.williams@intel.com> LGTM Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
On Tue, Jun 18, 2024 at 04:46:38PM +0800, Huang Ying wrote: > An abstract distance value must be assigned by the driver that makes > the memory available to the system. It reflects relative performance > and is used to place memory nodes backed by CXL regions in the appropriate > memory tiers allowing promotion/demotion within the existing memory tiering > mechanism. > > The abstract distance is calculated based on the memory access latency > and bandwidth of CXL regions. > > Signed-off-by: "Huang, Ying" <ying.huang@intel.com> > Acked-by: Dan Williams <dan.j.williams@intel.com> Reviewed-by: Gregory Price <gourry@gourry.net>
On Tue, Jun 18, 2024 at 04:46:38PM +0800, Huang Ying wrote: > An abstract distance value must be assigned by the driver that makes > the memory available to the system. It reflects relative performance > and is used to place memory nodes backed by CXL regions in the appropriate > memory tiers allowing promotion/demotion within the existing memory tiering > mechanism. > > The abstract distance is calculated based on the memory access latency > and bandwidth of CXL regions. > > Signed-off-by: "Huang, Ying" <ying.huang@intel.com> > Acked-by: Dan Williams <dan.j.williams@intel.com> > Cc: Alison Schofield <alison.schofield@intel.com> > Cc: Andrew Morton <akpm@linux-foundation.org> > Cc: Jonathan Cameron <Jonathan.Cameron@huawei.com> > Cc: Dave Jiang <dave.jiang@intel.com> > Cc: Bharata B Rao <bharata@amd.com> > Cc: Alistair Popple <apopple@nvidia.com> > Cc: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com> > Cc: Davidlohr Bueso <dave@stgolabs.net> > Cc: Vishal Verma <vishal.l.verma@intel.com> > Cc: Ira Weiny <ira.weiny@intel.com> > --- Reviewed-by: Fan Ni <fan.ni@samsung.com> > drivers/cxl/core/region.c | 27 +++++++++++++++++++++++++++ > drivers/cxl/cxl.h | 2 ++ > 2 files changed, 29 insertions(+) > > diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c > index 51aeef2c012c..dc15ceba7ab7 100644 > --- a/drivers/cxl/core/region.c > +++ b/drivers/cxl/core/region.c > @@ -9,6 +9,7 @@ > #include <linux/uuid.h> > #include <linux/sort.h> > #include <linux/idr.h> > +#include <linux/memory-tiers.h> > #include <cxlmem.h> > #include <cxl.h> > #include "core.h" > @@ -2228,6 +2229,7 @@ static void unregister_region(void *_cxlr) > int i; > > unregister_memory_notifier(&cxlr->memory_notifier); > + unregister_mt_adistance_algorithm(&cxlr->adist_notifier); > device_del(&cxlr->dev); > > /* > @@ -2340,6 +2342,27 @@ static int cxl_region_perf_attrs_callback(struct notifier_block *nb, > return NOTIFY_OK; > } > > +static int cxl_region_calculate_adistance(struct notifier_block *nb, > + unsigned long nid, void *data) > +{ > + struct cxl_region *cxlr = container_of(nb, struct cxl_region, > + adist_notifier); > + struct access_coordinate *perf; > + int *adist = data; > + int region_nid; > + > + region_nid = cxl_region_nid(cxlr); > + if (nid != region_nid) > + return NOTIFY_OK; > + > + perf = &cxlr->coord[ACCESS_COORDINATE_CPU]; > + > + if (mt_perf_to_adistance(perf, adist)) > + return NOTIFY_OK; > + > + return NOTIFY_STOP; > +} > + > /** > * devm_cxl_add_region - Adds a region to a decoder > * @cxlrd: root decoder > @@ -2382,6 +2405,10 @@ static struct cxl_region *devm_cxl_add_region(struct cxl_root_decoder *cxlrd, > cxlr->memory_notifier.priority = CXL_CALLBACK_PRI; > register_memory_notifier(&cxlr->memory_notifier); > > + cxlr->adist_notifier.notifier_call = cxl_region_calculate_adistance; > + cxlr->adist_notifier.priority = 100; > + register_mt_adistance_algorithm(&cxlr->adist_notifier); > + > rc = devm_add_action_or_reset(port->uport_dev, unregister_region, cxlr); > if (rc) > return ERR_PTR(rc); > diff --git a/drivers/cxl/cxl.h b/drivers/cxl/cxl.h > index 603c0120cff8..f46252373159 100644 > --- a/drivers/cxl/cxl.h > +++ b/drivers/cxl/cxl.h > @@ -522,6 +522,7 @@ struct cxl_region_params { > * @params: active + config params for the region > * @coord: QoS access coordinates for the region > * @memory_notifier: notifier for setting the access coordinates to node > + * @adist_notifier: notifier for calculating the abstract distance of node > */ > struct cxl_region { > struct device dev; > @@ -534,6 +535,7 @@ struct cxl_region { > struct cxl_region_params params; > struct access_coordinate coord[ACCESS_COORDINATE_MAX]; > struct notifier_block memory_notifier; > + struct notifier_block adist_notifier; > }; > > struct cxl_nvdimm_bridge { > -- > 2.39.2 >
diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c index 51aeef2c012c..dc15ceba7ab7 100644 --- a/drivers/cxl/core/region.c +++ b/drivers/cxl/core/region.c @@ -9,6 +9,7 @@ #include <linux/uuid.h> #include <linux/sort.h> #include <linux/idr.h> +#include <linux/memory-tiers.h> #include <cxlmem.h> #include <cxl.h> #include "core.h" @@ -2228,6 +2229,7 @@ static void unregister_region(void *_cxlr) int i; unregister_memory_notifier(&cxlr->memory_notifier); + unregister_mt_adistance_algorithm(&cxlr->adist_notifier); device_del(&cxlr->dev); /* @@ -2340,6 +2342,27 @@ static int cxl_region_perf_attrs_callback(struct notifier_block *nb, return NOTIFY_OK; } +static int cxl_region_calculate_adistance(struct notifier_block *nb, + unsigned long nid, void *data) +{ + struct cxl_region *cxlr = container_of(nb, struct cxl_region, + adist_notifier); + struct access_coordinate *perf; + int *adist = data; + int region_nid; + + region_nid = cxl_region_nid(cxlr); + if (nid != region_nid) + return NOTIFY_OK; + + perf = &cxlr->coord[ACCESS_COORDINATE_CPU]; + + if (mt_perf_to_adistance(perf, adist)) + return NOTIFY_OK; + + return NOTIFY_STOP; +} + /** * devm_cxl_add_region - Adds a region to a decoder * @cxlrd: root decoder @@ -2382,6 +2405,10 @@ static struct cxl_region *devm_cxl_add_region(struct cxl_root_decoder *cxlrd, cxlr->memory_notifier.priority = CXL_CALLBACK_PRI; register_memory_notifier(&cxlr->memory_notifier); + cxlr->adist_notifier.notifier_call = cxl_region_calculate_adistance; + cxlr->adist_notifier.priority = 100; + register_mt_adistance_algorithm(&cxlr->adist_notifier); + rc = devm_add_action_or_reset(port->uport_dev, unregister_region, cxlr); if (rc) return ERR_PTR(rc); diff --git a/drivers/cxl/cxl.h b/drivers/cxl/cxl.h index 603c0120cff8..f46252373159 100644 --- a/drivers/cxl/cxl.h +++ b/drivers/cxl/cxl.h @@ -522,6 +522,7 @@ struct cxl_region_params { * @params: active + config params for the region * @coord: QoS access coordinates for the region * @memory_notifier: notifier for setting the access coordinates to node + * @adist_notifier: notifier for calculating the abstract distance of node */ struct cxl_region { struct device dev; @@ -534,6 +535,7 @@ struct cxl_region { struct cxl_region_params params; struct access_coordinate coord[ACCESS_COORDINATE_MAX]; struct notifier_block memory_notifier; + struct notifier_block adist_notifier; }; struct cxl_nvdimm_bridge {