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


Reply via email to