On 1/31/24 15:35, Dan Williams wrote:
> Dave Jiang wrote:
>> In order to address the issue with being able to expose qos_class sysfs
>> attributes under 'ram' and 'pmem' sub-directories, the attributes must
>> be defined as static attributes rather than under driver->dev_groups.
>> To avoid implementing locking for accessing the 'struct cxl_dpa_perf`
>> lists, convert the list to a single 'struct cxl_dpa_perf' entry in
>> preparation to move the attributes to statically defined.
>>
>> Link:
>> https://lore.kernel.org/linux-cxl/65b200ba228f_2d43c29...@dwillia2-mobl3.amr.corp.intel.com.notmuch/
>> Suggested-by: Dan Williams <dan.j.willi...@intel.com>
>> Signed-off-by: Dave Jiang <dave.ji...@intel.com>
>> ---
>> drivers/cxl/core/cdat.c | 90 +++++++++++++----------------------------
>> drivers/cxl/core/mbox.c | 4 +-
>> drivers/cxl/cxlmem.h | 10 ++---
>> drivers/cxl/mem.c | 25 ++++--------
>> 4 files changed, 42 insertions(+), 87 deletions(-)
>
> Oh, wow, this looks wonderful!
>
> I was expecting the lists to still be there, just moved out of 'struct
> cxl_dev_state'. Am I reading this right, the work to select and validate
> the "best" performance per partition can be done without list walking?
> If so, great!
I've not encountered more than 1 DSMAS per partition in the CDAT on hardware so
far. I don't see why we can't just have the simple case until we need something
more complex.
DJ
>
> [..]
>> diff --git a/drivers/cxl/mem.c b/drivers/cxl/mem.c
>> index c5c9d8e0d88d..a62099e47d71 100644
>> --- a/drivers/cxl/mem.c
>> +++ b/drivers/cxl/mem.c
>> @@ -221,16 +221,13 @@ static ssize_t ram_qos_class_show(struct device *dev,
>> struct cxl_memdev *cxlmd = to_cxl_memdev(dev);
>> struct cxl_dev_state *cxlds = cxlmd->cxlds;
>> struct cxl_memdev_state *mds = to_cxl_memdev_state(cxlds);
>> - struct cxl_dpa_perf *dpa_perf;
>> + struct cxl_dpa_perf *dpa_perf = &mds->ram_perf;
>>
>> if (!dev->driver)
>> return -ENOENT;
>
> This can be deleted since it is racy being referenced without the
> device_lock(), and nothing in this routine requires the device to be
> locked.
>
>>
>> - if (list_empty(&mds->ram_perf_list))
>> - return -ENOENT;
>> -
>> - dpa_perf = list_first_entry(&mds->ram_perf_list, struct cxl_dpa_perf,
>> - list);
>> + if (dpa_perf->qos_class == CXL_QOS_CLASS_INVALID)
>> + return -ENODATA;
>
> As long as is_visible() checks for CXL_QOS_CLASS_INVALID there is no
> need to add error handling in this _show() routine.
>
>>
>> return sysfs_emit(buf, "%d\n", dpa_perf->qos_class);
>> }
>> @@ -244,16 +241,10 @@ static ssize_t pmem_qos_class_show(struct device *dev,
>> struct cxl_memdev *cxlmd = to_cxl_memdev(dev);
>> struct cxl_dev_state *cxlds = cxlmd->cxlds;
>> struct cxl_memdev_state *mds = to_cxl_memdev_state(cxlds);
>> - struct cxl_dpa_perf *dpa_perf;
>> + struct cxl_dpa_perf *dpa_perf = &mds->pmem_perf;
>>
>> - if (!dev->driver)
>> - return -ENOENT;
>
> Ah, good, you deleted it this time.
>
>> -
>> - if (list_empty(&mds->pmem_perf_list))
>> - return -ENOENT;
>> -
>> - dpa_perf = list_first_entry(&mds->pmem_perf_list, struct cxl_dpa_perf,
>> - list);
>> + if (dpa_perf->qos_class == CXL_QOS_CLASS_INVALID)
>> + return -ENODATA;
>
> This can go.