Message ID | 168236637746.1027628.14674251843014155022.stgit@dwillia2-xfh.jf.intel.com (mailing list archive) |
---|---|
State | Accepted |
Commit | 3590019d4d3cc07bd5f405d6269c8ffb98c5fe21 |
Headers | show |
Series | cxl list and test fixes | expand |
On 4/24/23 12:59 PM, Dan Williams wrote: > Attempts to filter by memdev fail when the memdev is an RCD (RCH topology): > > # cxl list -BEM -m 11 > Warning: no matching devices found > > [ > ] > > This is caused by VH topology assumption where an intervening host-bridge > port is expected between the root CXL port and the endpoint. In an RCH > topology an endpoint is integrated in the host-bridge. > > Search for endpoints directly attached to the root: > > # cxl list -BEMu -m 11 > { > "bus":"root3", > "provider":"cxl_test", > "endpoints:root3":[ > { > "endpoint":"endpoint22", > "host":"mem11", > "depth":1, > "memdev":{ > "memdev":"mem11", > "ram_size":"2.00 GiB (2.15 GB)", > "serial":"0xa", > "numa_node":0, > "host":"cxl_rcd.10" > } > } > ] > } > > > Signed-off-by: Dan Williams <dan.j.williams@intel.com> Reviewed-by: Dave Jiang <dave.jiang@intel.com> > --- > cxl/lib/libcxl.c | 19 ++++++++++++++++--- > 1 file changed, 16 insertions(+), 3 deletions(-) > > diff --git a/cxl/lib/libcxl.c b/cxl/lib/libcxl.c > index 59e5bdbcc750..e6c94d623303 100644 > --- a/cxl/lib/libcxl.c > +++ b/cxl/lib/libcxl.c > @@ -1457,8 +1457,9 @@ CXL_EXPORT int cxl_memdev_enable(struct cxl_memdev *memdev) > return 0; > } > > -static struct cxl_endpoint *cxl_port_find_endpoint(struct cxl_port *parent_port, > - struct cxl_memdev *memdev) > +static struct cxl_endpoint * > +cxl_port_recurse_endpoint(struct cxl_port *parent_port, > + struct cxl_memdev *memdev) > { > struct cxl_endpoint *endpoint; > struct cxl_port *port; > @@ -1468,7 +1469,7 @@ static struct cxl_endpoint *cxl_port_find_endpoint(struct cxl_port *parent_port, > if (strcmp(cxl_endpoint_get_host(endpoint), > cxl_memdev_get_devname(memdev)) == 0) > return endpoint; > - endpoint = cxl_port_find_endpoint(port, memdev); > + endpoint = cxl_port_recurse_endpoint(port, memdev); > if (endpoint) > return endpoint; > } > @@ -1476,6 +1477,18 @@ static struct cxl_endpoint *cxl_port_find_endpoint(struct cxl_port *parent_port, > return NULL; > } > > +static struct cxl_endpoint *cxl_port_find_endpoint(struct cxl_port *parent_port, > + struct cxl_memdev *memdev) > +{ > + struct cxl_endpoint *endpoint; > + > + cxl_endpoint_foreach(parent_port, endpoint) > + if (strcmp(cxl_endpoint_get_host(endpoint), > + cxl_memdev_get_devname(memdev)) == 0) > + return endpoint; > + return cxl_port_recurse_endpoint(parent_port, memdev); > +} > + > CXL_EXPORT struct cxl_endpoint * > cxl_memdev_get_endpoint(struct cxl_memdev *memdev) > { > >
diff --git a/cxl/lib/libcxl.c b/cxl/lib/libcxl.c index 59e5bdbcc750..e6c94d623303 100644 --- a/cxl/lib/libcxl.c +++ b/cxl/lib/libcxl.c @@ -1457,8 +1457,9 @@ CXL_EXPORT int cxl_memdev_enable(struct cxl_memdev *memdev) return 0; } -static struct cxl_endpoint *cxl_port_find_endpoint(struct cxl_port *parent_port, - struct cxl_memdev *memdev) +static struct cxl_endpoint * +cxl_port_recurse_endpoint(struct cxl_port *parent_port, + struct cxl_memdev *memdev) { struct cxl_endpoint *endpoint; struct cxl_port *port; @@ -1468,7 +1469,7 @@ static struct cxl_endpoint *cxl_port_find_endpoint(struct cxl_port *parent_port, if (strcmp(cxl_endpoint_get_host(endpoint), cxl_memdev_get_devname(memdev)) == 0) return endpoint; - endpoint = cxl_port_find_endpoint(port, memdev); + endpoint = cxl_port_recurse_endpoint(port, memdev); if (endpoint) return endpoint; } @@ -1476,6 +1477,18 @@ static struct cxl_endpoint *cxl_port_find_endpoint(struct cxl_port *parent_port, return NULL; } +static struct cxl_endpoint *cxl_port_find_endpoint(struct cxl_port *parent_port, + struct cxl_memdev *memdev) +{ + struct cxl_endpoint *endpoint; + + cxl_endpoint_foreach(parent_port, endpoint) + if (strcmp(cxl_endpoint_get_host(endpoint), + cxl_memdev_get_devname(memdev)) == 0) + return endpoint; + return cxl_port_recurse_endpoint(parent_port, memdev); +} + CXL_EXPORT struct cxl_endpoint * cxl_memdev_get_endpoint(struct cxl_memdev *memdev) {
Attempts to filter by memdev fail when the memdev is an RCD (RCH topology): # cxl list -BEM -m 11 Warning: no matching devices found [ ] This is caused by VH topology assumption where an intervening host-bridge port is expected between the root CXL port and the endpoint. In an RCH topology an endpoint is integrated in the host-bridge. Search for endpoints directly attached to the root: # cxl list -BEMu -m 11 { "bus":"root3", "provider":"cxl_test", "endpoints:root3":[ { "endpoint":"endpoint22", "host":"mem11", "depth":1, "memdev":{ "memdev":"mem11", "ram_size":"2.00 GiB (2.15 GB)", "serial":"0xa", "numa_node":0, "host":"cxl_rcd.10" } } ] } Signed-off-by: Dan Williams <dan.j.williams@intel.com> --- cxl/lib/libcxl.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-)