Dan Williams <[email protected]> writes:
> Dave Jiang wrote:
>> Add a CXL bus type, and detect whether a 'dimm' is backed by the CXL
>> subsystem.
>>
>> Reviewed-by: Alison Schofield <[email protected]>
>> Signed-off-by: Dave Jiang <[email protected]>
>>
>> ---
>> v2:
>> - Improve commit log. (Vishal)
>> ---
>> ndctl/lib/libndctl.c | 53
>> ++++++++++++++++++++++++++++++++++++++++++++++++
>> ndctl/lib/libndctl.sym | 1 +
>> ndctl/lib/private.h | 1 +
>> ndctl/libndctl.h | 1 +
>> 4 files changed, 56 insertions(+)
>>
>> diff --git a/ndctl/lib/libndctl.c b/ndctl/lib/libndctl.c
>> index ad54f0626510..10422e24d38b 100644
>> --- a/ndctl/lib/libndctl.c
>> +++ b/ndctl/lib/libndctl.c
>> @@ -12,6 +12,7 @@
>> #include <ctype.h>
>> #include <fcntl.h>
>> #include <dirent.h>
>> +#include <libgen.h>
>
> This new include had me looking for why below...
man 3 basename
>> #include <sys/stat.h>
>> #include <sys/types.h>
>> #include <sys/ioctl.h>
>> @@ -876,6 +877,48 @@ static enum ndctl_fwa_method fwa_method_to_method(const
>> char *fwa_method)
>> return NDCTL_FWA_METHOD_RESET;
>> }
>>
>> +static int is_ndbus_cxl(const char *ctl_base)
>> +{
>> + char *path, *ppath, *subsys;
>> + char tmp_path[PATH_MAX];
>> + int rc;
>> +
>> + /* get the real path of ctl_base */
>> + path = realpath(ctl_base, NULL);
>> + if (!path)
>> + return -errno;
>> +
>> + /* setup to get the nd bridge device backing the ctl */
>> + sprintf(tmp_path, "%s/device", path);
>> + free(path);
>> +
>> + path = realpath(tmp_path, NULL);
>> + if (!path)
>> + return -errno;
>> +
>> + /* get the parent dir of the ndbus, which should be the nvdimm-bridge */
>> + ppath = dirname(path);
>> +
>> + /* setup to get the subsystem of the nvdimm-bridge */
>> + sprintf(tmp_path, "%s/%s", ppath, "subsystem");
>> + free(path);
>> +
>> + path = realpath(tmp_path, NULL);
>> + if (!path)
>> + return -errno;
>> +
>> + subsys = basename(path);
>> +
>> + /* check if subsystem is cxl */
>> + if (!strcmp(subsys, "cxl"))
>> + rc = 1;
>> + else
>> + rc = 0;
>> +
>> + free(path);
>> + return rc;
>> +}
>> +
>> static void *add_bus(void *parent, int id, const char *ctl_base)
>> {
>> char buf[SYSFS_ATTR_SIZE];
>> @@ -919,6 +962,11 @@ static void *add_bus(void *parent, int id, const char
>> *ctl_base)
>> else
>> bus->has_of_node = 1;
>>
>> + if (is_ndbus_cxl(ctl_base))
>> + bus->has_cxl = 1;
>> + else
>> + bus->has_cxl = 0;
>> +
>
> I think you can drop is_ndbus_cxl() and just do this:
>
> @@ -981,6 +976,11 @@ static void *add_bus(void *parent, int id, const char
> *ctl_base)
> if (!bus->provider)
> goto err_read;
>
> + if (strcasestr("cxl", provider))
> + bus->has_cxl = 1;
> + else
> + bus->has_cxl = 0;
> +
Can you explain why this is preferred?
Cheers,
Jeff