On Wed, Jun 18, 2025 at 02:58:13PM -0700, Dave Jiang wrote: > > > On 6/18/25 2:54 PM, Alison Schofield wrote: > > On Wed, Jun 18, 2025 at 01:41:17PM -0700, Dave Jiang wrote: > >> 'cxl enable-port -m' uses cxl_port_get_dport_by_memdev() to find the > >> memdevs that are associated with a port in order to enable those > >> associated memdevs. When the kernel switch to delayed dport > >> initialization by enumerating the dports during memdev probe, the > >> dports are no longer valid until the memdev is probed. This means > >> that cxl_port_get_dport_by_memdev() will not find any memdevs under > >> the port. > >> > >> Add a new helper function cxl_port_is_memdev_hierarchy() that checks if a > >> port is in the memdev hierarchy via the memdev->host_path where the sysfs > >> path contains all the devices in the hierarchy. This call is also backward > >> compatible with the old behavior. > > > > I get how this new function works w the delayed dport init that is > > coming soon to the CXL driver. I'm not so clear on why we leave the > > existing function in place when we know it will fail in some use > > cases. (It is a libcxl fcn afterall) > > > > Why not change the behavior of the existing function? > > How come this usage of cxl_port_get_dport_by_memdev() needs to change > > to the new helper and not the other usage in action_disable()? > > > > If the 'sometimes fails to find' function stays, how about libcxl > > docs explaining the limitations. > > > > Just stirring the pot to better understand ;) > > What's the process of retiring API calls? Add deprecated in the doc? Add > warnings when called?
What is wanted here? Should a v2 of the existing cxl_port_get_dport... be replaced with a v2 that can differentiate btw memdev not probed vs NULL for dport not found. I see example of v2 APIs in ndctl/ndctl lib, so doable, but first need to define what is wanted. > > > > > --Alison > > > > > >> > >> Signed-off-by: Dave Jiang <dave.ji...@intel.com> > >> --- > >> cxl/lib/libcxl.c | 31 +++++++++++++++++++++++++++++++ > >> cxl/lib/libcxl.sym | 5 +++++ > >> cxl/libcxl.h | 3 +++ > >> cxl/port.c | 2 +- > >> 4 files changed, 40 insertions(+), 1 deletion(-) > >> > >> diff --git a/cxl/lib/libcxl.c b/cxl/lib/libcxl.c > >> index 5d97023377ec..cafde1cee4e8 100644 > >> --- a/cxl/lib/libcxl.c > >> +++ b/cxl/lib/libcxl.c > >> @@ -2024,6 +2024,37 @@ CXL_EXPORT int > >> cxl_memdev_nvdimm_bridge_active(struct cxl_memdev *memdev) > >> return is_enabled(path); > >> } > >> > >> +CXL_EXPORT bool cxl_memdev_is_port_ancestor(struct cxl_memdev *memdev, > >> + struct cxl_port *port) > >> +{ > >> + const char *uport = cxl_port_get_host(port); > >> + const char *start = "devices"; > >> + const char *pstr = "platform"; > >> + char *host, *pos; > >> + > >> + host = strdup(memdev->host_path); > >> + if (!host) > >> + return false; > >> + > >> + pos = strstr(host, start); > >> + pos += strlen(start) + 1; > >> + if (strncmp(pos, pstr, strlen(pstr)) == 0) > >> + pos += strlen(pstr) + 1; > >> + pos = strtok(pos, "/"); > >> + > >> + while (pos) { > >> + if (strcmp(pos, uport) == 0) { > >> + free(host); > >> + return true; > >> + } > >> + pos = strtok(NULL, "/"); > >> + } > >> + > >> + free(host); > >> + > >> + return false; > >> +} > >> + > >> static int cxl_port_init(struct cxl_port *port, struct cxl_port > >> *parent_port, > >> enum cxl_port_type type, struct cxl_ctx *ctx, int id, > >> const char *cxlport_base) > >> diff --git a/cxl/lib/libcxl.sym b/cxl/lib/libcxl.sym > >> index 3ad0cd06e25a..e01a676cdeb9 100644 > >> --- a/cxl/lib/libcxl.sym > >> +++ b/cxl/lib/libcxl.sym > >> @@ -295,3 +295,8 @@ global: > >> cxl_fwctl_get_major; > >> cxl_fwctl_get_minor; > >> } LIBECXL_8; > >> + > >> +LIBCXL_10 { > >> +global: > >> + cxl_memdev_is_port_ancestor; > >> +} LIBCXL_9; > >> diff --git a/cxl/libcxl.h b/cxl/libcxl.h > >> index 54d97d7bb501..54bc025b121d 100644 > >> --- a/cxl/libcxl.h > >> +++ b/cxl/libcxl.h > >> @@ -179,6 +179,9 @@ bool cxl_dport_maps_memdev(struct cxl_dport *dport, > >> struct cxl_memdev *memdev); > >> struct cxl_dport *cxl_port_get_dport_by_memdev(struct cxl_port *port, > >> struct cxl_memdev *memdev); > >> > >> +bool cxl_memdev_is_port_ancestor(struct cxl_memdev *memdev, > >> + struct cxl_port *port); > >> + > >> #define cxl_dport_foreach(port, dport) > >> \ > >> for (dport = cxl_dport_get_first(port); dport != NULL; \ > >> dport = cxl_dport_get_next(dport)) > >> diff --git a/cxl/port.c b/cxl/port.c > >> index 89f3916d85aa..c951c0c771e8 100644 > >> --- a/cxl/port.c > >> +++ b/cxl/port.c > >> @@ -102,7 +102,7 @@ static int action_enable(struct cxl_port *port) > >> return rc; > >> > >> cxl_memdev_foreach(ctx, memdev) > >> - if (cxl_port_get_dport_by_memdev(port, memdev)) > >> + if (cxl_memdev_is_port_ancestor(memdev, port)) > >> cxl_memdev_enable(memdev); > >> return 0; > >> } > >> > >> base-commit: 74b9e411bf13e87df39a517d10143fafa7e2ea92 > >> -- > >> 2.49.0 > >> > >> >