Message ID | 168592154692.1948938.3074738916245299862.stgit@dwillia2-xfh.jf.intel.com |
---|---|
State | Accepted |
Commit | 516b300c4ca86aa7953b75ce79b5c5eea5779b22 |
Headers | show |
Series | cxl: Device memory setup | expand |
On Sun, 04 Jun 2023 16:32:27 -0700 Dan Williams <dan.j.williams@intel.com> wrote: > Move the endpoint port that the cxl_mem driver establishes from drvdata > to a first class attribute. This is in preparation for device-memory > drivers reusing the CXL core for memory region management. Those drivers > need a type-safe method to retrieve their CXL port linkage. Leave > drvdata for private usage of the cxl_mem driver not external consumers > of a 'struct cxl_memdev' object. > > Signed-off-by: Dan Williams <dan.j.williams@intel.com> Good. I never liked this being 'hidden' and un-typed. Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
On Sun, Jun 04, 2023 at 04:32:27PM -0700, Dan Williams wrote: > Move the endpoint port that the cxl_mem driver establishes from drvdata > to a first class attribute. This is in preparation for device-memory > drivers reusing the CXL core for memory region management. Those drivers > need a type-safe method to retrieve their CXL port linkage. Leave > drvdata for private usage of the cxl_mem driver not external consumers > of a 'struct cxl_memdev' object. > > Signed-off-by: Dan Williams <dan.j.williams@intel.com> > --- Reviewed-by: Fan Ni <fan.ni@samsung.com> > drivers/cxl/core/memdev.c | 4 ++-- > drivers/cxl/core/pmem.c | 2 +- > drivers/cxl/core/port.c | 5 +++-- > drivers/cxl/cxlmem.h | 2 ++ > 4 files changed, 8 insertions(+), 5 deletions(-) > > diff --git a/drivers/cxl/core/memdev.c b/drivers/cxl/core/memdev.c > index 3f2d54f30548..65a685e5616f 100644 > --- a/drivers/cxl/core/memdev.c > +++ b/drivers/cxl/core/memdev.c > @@ -149,7 +149,7 @@ int cxl_trigger_poison_list(struct cxl_memdev *cxlmd) > struct cxl_port *port; > int rc; > > - port = dev_get_drvdata(&cxlmd->dev); > + port = cxlmd->endpoint; > if (!port || !is_cxl_endpoint(port)) > return -EINVAL; > > @@ -207,7 +207,7 @@ static struct cxl_region *cxl_dpa_to_region(struct cxl_memdev *cxlmd, u64 dpa) > ctx = (struct cxl_dpa_to_region_context) { > .dpa = dpa, > }; > - port = dev_get_drvdata(&cxlmd->dev); > + port = cxlmd->endpoint; > if (port && is_cxl_endpoint(port) && port->commit_end != -1) > device_for_each_child(&port->dev, &ctx, __cxl_dpa_to_region); > > diff --git a/drivers/cxl/core/pmem.c b/drivers/cxl/core/pmem.c > index f8c38d997252..fc94f5240327 100644 > --- a/drivers/cxl/core/pmem.c > +++ b/drivers/cxl/core/pmem.c > @@ -64,7 +64,7 @@ static int match_nvdimm_bridge(struct device *dev, void *data) > > struct cxl_nvdimm_bridge *cxl_find_nvdimm_bridge(struct cxl_memdev *cxlmd) > { > - struct cxl_port *port = find_cxl_root(dev_get_drvdata(&cxlmd->dev)); > + struct cxl_port *port = find_cxl_root(cxlmd->endpoint); > struct device *dev; > > if (!port) > diff --git a/drivers/cxl/core/port.c b/drivers/cxl/core/port.c > index 71a7547a8d6f..6720ab22a494 100644 > --- a/drivers/cxl/core/port.c > +++ b/drivers/cxl/core/port.c > @@ -1167,7 +1167,7 @@ static struct device *grandparent(struct device *dev) > static void delete_endpoint(void *data) > { > struct cxl_memdev *cxlmd = data; > - struct cxl_port *endpoint = dev_get_drvdata(&cxlmd->dev); > + struct cxl_port *endpoint = cxlmd->endpoint; > struct cxl_port *parent_port; > struct device *parent; > > @@ -1182,6 +1182,7 @@ static void delete_endpoint(void *data) > devm_release_action(parent, cxl_unlink_uport, endpoint); > devm_release_action(parent, unregister_port, endpoint); > } > + cxlmd->endpoint = NULL; > device_unlock(parent); > put_device(parent); > out: > @@ -1193,7 +1194,7 @@ int cxl_endpoint_autoremove(struct cxl_memdev *cxlmd, struct cxl_port *endpoint) > struct device *dev = &cxlmd->dev; > > get_device(&endpoint->dev); > - dev_set_drvdata(dev, endpoint); > + cxlmd->endpoint = endpoint; > cxlmd->depth = endpoint->depth; > return devm_add_action_or_reset(dev, delete_endpoint, cxlmd); > } > diff --git a/drivers/cxl/cxlmem.h b/drivers/cxl/cxlmem.h > index b8bdf7490d2c..7ee78e79933c 100644 > --- a/drivers/cxl/cxlmem.h > +++ b/drivers/cxl/cxlmem.h > @@ -38,6 +38,7 @@ > * @detach_work: active memdev lost a port in its ancestry > * @cxl_nvb: coordinate removal of @cxl_nvd if present > * @cxl_nvd: optional bridge to an nvdimm if the device supports pmem > + * @endpoint: connection to the CXL port topology for this memory device > * @id: id number of this memdev instance. > * @depth: endpoint port depth > */ > @@ -48,6 +49,7 @@ struct cxl_memdev { > struct work_struct detach_work; > struct cxl_nvdimm_bridge *cxl_nvb; > struct cxl_nvdimm *cxl_nvd; > + struct cxl_port *endpoint; > int id; > int depth; > }; > >
On 6/4/23 16:32, Dan Williams wrote: > Move the endpoint port that the cxl_mem driver establishes from drvdata > to a first class attribute. This is in preparation for device-memory > drivers reusing the CXL core for memory region management. Those drivers > need a type-safe method to retrieve their CXL port linkage. Leave > drvdata for private usage of the cxl_mem driver not external consumers > of a 'struct cxl_memdev' object. > > Signed-off-by: Dan Williams <dan.j.williams@intel.com> Reviewed-by: Dave Jiang <dave.jiang@intel.com> > --- > drivers/cxl/core/memdev.c | 4 ++-- > drivers/cxl/core/pmem.c | 2 +- > drivers/cxl/core/port.c | 5 +++-- > drivers/cxl/cxlmem.h | 2 ++ > 4 files changed, 8 insertions(+), 5 deletions(-) > > diff --git a/drivers/cxl/core/memdev.c b/drivers/cxl/core/memdev.c > index 3f2d54f30548..65a685e5616f 100644 > --- a/drivers/cxl/core/memdev.c > +++ b/drivers/cxl/core/memdev.c > @@ -149,7 +149,7 @@ int cxl_trigger_poison_list(struct cxl_memdev *cxlmd) > struct cxl_port *port; > int rc; > > - port = dev_get_drvdata(&cxlmd->dev); > + port = cxlmd->endpoint; > if (!port || !is_cxl_endpoint(port)) > return -EINVAL; > > @@ -207,7 +207,7 @@ static struct cxl_region *cxl_dpa_to_region(struct cxl_memdev *cxlmd, u64 dpa) > ctx = (struct cxl_dpa_to_region_context) { > .dpa = dpa, > }; > - port = dev_get_drvdata(&cxlmd->dev); > + port = cxlmd->endpoint; > if (port && is_cxl_endpoint(port) && port->commit_end != -1) > device_for_each_child(&port->dev, &ctx, __cxl_dpa_to_region); > > diff --git a/drivers/cxl/core/pmem.c b/drivers/cxl/core/pmem.c > index f8c38d997252..fc94f5240327 100644 > --- a/drivers/cxl/core/pmem.c > +++ b/drivers/cxl/core/pmem.c > @@ -64,7 +64,7 @@ static int match_nvdimm_bridge(struct device *dev, void *data) > > struct cxl_nvdimm_bridge *cxl_find_nvdimm_bridge(struct cxl_memdev *cxlmd) > { > - struct cxl_port *port = find_cxl_root(dev_get_drvdata(&cxlmd->dev)); > + struct cxl_port *port = find_cxl_root(cxlmd->endpoint); > struct device *dev; > > if (!port) > diff --git a/drivers/cxl/core/port.c b/drivers/cxl/core/port.c > index 71a7547a8d6f..6720ab22a494 100644 > --- a/drivers/cxl/core/port.c > +++ b/drivers/cxl/core/port.c > @@ -1167,7 +1167,7 @@ static struct device *grandparent(struct device *dev) > static void delete_endpoint(void *data) > { > struct cxl_memdev *cxlmd = data; > - struct cxl_port *endpoint = dev_get_drvdata(&cxlmd->dev); > + struct cxl_port *endpoint = cxlmd->endpoint; > struct cxl_port *parent_port; > struct device *parent; > > @@ -1182,6 +1182,7 @@ static void delete_endpoint(void *data) > devm_release_action(parent, cxl_unlink_uport, endpoint); > devm_release_action(parent, unregister_port, endpoint); > } > + cxlmd->endpoint = NULL; > device_unlock(parent); > put_device(parent); > out: > @@ -1193,7 +1194,7 @@ int cxl_endpoint_autoremove(struct cxl_memdev *cxlmd, struct cxl_port *endpoint) > struct device *dev = &cxlmd->dev; > > get_device(&endpoint->dev); > - dev_set_drvdata(dev, endpoint); > + cxlmd->endpoint = endpoint; > cxlmd->depth = endpoint->depth; > return devm_add_action_or_reset(dev, delete_endpoint, cxlmd); > } > diff --git a/drivers/cxl/cxlmem.h b/drivers/cxl/cxlmem.h > index b8bdf7490d2c..7ee78e79933c 100644 > --- a/drivers/cxl/cxlmem.h > +++ b/drivers/cxl/cxlmem.h > @@ -38,6 +38,7 @@ > * @detach_work: active memdev lost a port in its ancestry > * @cxl_nvb: coordinate removal of @cxl_nvd if present > * @cxl_nvd: optional bridge to an nvdimm if the device supports pmem > + * @endpoint: connection to the CXL port topology for this memory device > * @id: id number of this memdev instance. > * @depth: endpoint port depth > */ > @@ -48,6 +49,7 @@ struct cxl_memdev { > struct work_struct detach_work; > struct cxl_nvdimm_bridge *cxl_nvb; > struct cxl_nvdimm *cxl_nvd; > + struct cxl_port *endpoint; > int id; > int depth; > }; >
diff --git a/drivers/cxl/core/memdev.c b/drivers/cxl/core/memdev.c index 3f2d54f30548..65a685e5616f 100644 --- a/drivers/cxl/core/memdev.c +++ b/drivers/cxl/core/memdev.c @@ -149,7 +149,7 @@ int cxl_trigger_poison_list(struct cxl_memdev *cxlmd) struct cxl_port *port; int rc; - port = dev_get_drvdata(&cxlmd->dev); + port = cxlmd->endpoint; if (!port || !is_cxl_endpoint(port)) return -EINVAL; @@ -207,7 +207,7 @@ static struct cxl_region *cxl_dpa_to_region(struct cxl_memdev *cxlmd, u64 dpa) ctx = (struct cxl_dpa_to_region_context) { .dpa = dpa, }; - port = dev_get_drvdata(&cxlmd->dev); + port = cxlmd->endpoint; if (port && is_cxl_endpoint(port) && port->commit_end != -1) device_for_each_child(&port->dev, &ctx, __cxl_dpa_to_region); diff --git a/drivers/cxl/core/pmem.c b/drivers/cxl/core/pmem.c index f8c38d997252..fc94f5240327 100644 --- a/drivers/cxl/core/pmem.c +++ b/drivers/cxl/core/pmem.c @@ -64,7 +64,7 @@ static int match_nvdimm_bridge(struct device *dev, void *data) struct cxl_nvdimm_bridge *cxl_find_nvdimm_bridge(struct cxl_memdev *cxlmd) { - struct cxl_port *port = find_cxl_root(dev_get_drvdata(&cxlmd->dev)); + struct cxl_port *port = find_cxl_root(cxlmd->endpoint); struct device *dev; if (!port) diff --git a/drivers/cxl/core/port.c b/drivers/cxl/core/port.c index 71a7547a8d6f..6720ab22a494 100644 --- a/drivers/cxl/core/port.c +++ b/drivers/cxl/core/port.c @@ -1167,7 +1167,7 @@ static struct device *grandparent(struct device *dev) static void delete_endpoint(void *data) { struct cxl_memdev *cxlmd = data; - struct cxl_port *endpoint = dev_get_drvdata(&cxlmd->dev); + struct cxl_port *endpoint = cxlmd->endpoint; struct cxl_port *parent_port; struct device *parent; @@ -1182,6 +1182,7 @@ static void delete_endpoint(void *data) devm_release_action(parent, cxl_unlink_uport, endpoint); devm_release_action(parent, unregister_port, endpoint); } + cxlmd->endpoint = NULL; device_unlock(parent); put_device(parent); out: @@ -1193,7 +1194,7 @@ int cxl_endpoint_autoremove(struct cxl_memdev *cxlmd, struct cxl_port *endpoint) struct device *dev = &cxlmd->dev; get_device(&endpoint->dev); - dev_set_drvdata(dev, endpoint); + cxlmd->endpoint = endpoint; cxlmd->depth = endpoint->depth; return devm_add_action_or_reset(dev, delete_endpoint, cxlmd); } diff --git a/drivers/cxl/cxlmem.h b/drivers/cxl/cxlmem.h index b8bdf7490d2c..7ee78e79933c 100644 --- a/drivers/cxl/cxlmem.h +++ b/drivers/cxl/cxlmem.h @@ -38,6 +38,7 @@ * @detach_work: active memdev lost a port in its ancestry * @cxl_nvb: coordinate removal of @cxl_nvd if present * @cxl_nvd: optional bridge to an nvdimm if the device supports pmem + * @endpoint: connection to the CXL port topology for this memory device * @id: id number of this memdev instance. * @depth: endpoint port depth */ @@ -48,6 +49,7 @@ struct cxl_memdev { struct work_struct detach_work; struct cxl_nvdimm_bridge *cxl_nvb; struct cxl_nvdimm *cxl_nvd; + struct cxl_port *endpoint; int id; int depth; };
Move the endpoint port that the cxl_mem driver establishes from drvdata to a first class attribute. This is in preparation for device-memory drivers reusing the CXL core for memory region management. Those drivers need a type-safe method to retrieve their CXL port linkage. Leave drvdata for private usage of the cxl_mem driver not external consumers of a 'struct cxl_memdev' object. Signed-off-by: Dan Williams <dan.j.williams@intel.com> --- drivers/cxl/core/memdev.c | 4 ++-- drivers/cxl/core/pmem.c | 2 +- drivers/cxl/core/port.c | 5 +++-- drivers/cxl/cxlmem.h | 2 ++ 4 files changed, 8 insertions(+), 5 deletions(-)