mirror of https://github.com/torvalds/linux.git
Merge branch 'for-6.19/cxl-elc' into cxl-for-next
- Add extended linear cache size sysfs attribute. - Adjust failure emission of extended linear cache detection in cxl_acpi.
This commit is contained in:
commit
482dc84e91
|
|
@ -496,8 +496,17 @@ Description:
|
|||
changed, only freed by writing 0. The kernel makes no guarantees
|
||||
that data is maintained over an address space freeing event, and
|
||||
there is no guarantee that a free followed by an allocate
|
||||
results in the same address being allocated.
|
||||
results in the same address being allocated. If extended linear
|
||||
cache is present, the size indicates extended linear cache size
|
||||
plus the CXL region size.
|
||||
|
||||
What: /sys/bus/cxl/devices/regionZ/extended_linear_cache_size
|
||||
Date: October, 2025
|
||||
KernelVersion: v6.19
|
||||
Contact: linux-cxl@vger.kernel.org
|
||||
Description:
|
||||
(RO) The size of extended linear cache, if there is an extended
|
||||
linear cache. Otherwise the attribute will not be visible.
|
||||
|
||||
What: /sys/bus/cxl/devices/regionZ/mode
|
||||
Date: January, 2023
|
||||
|
|
|
|||
|
|
@ -372,7 +372,7 @@ static int cxl_acpi_set_cache_size(struct cxl_root_decoder *cxlrd)
|
|||
|
||||
rc = hmat_get_extended_linear_cache_size(&res, nid, &cache_size);
|
||||
if (rc)
|
||||
return rc;
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* The cache range is expected to be within the CFMWS.
|
||||
|
|
@ -397,21 +397,18 @@ static void cxl_setup_extended_linear_cache(struct cxl_root_decoder *cxlrd)
|
|||
int rc;
|
||||
|
||||
rc = cxl_acpi_set_cache_size(cxlrd);
|
||||
if (!rc)
|
||||
return;
|
||||
|
||||
if (rc != -EOPNOTSUPP) {
|
||||
if (rc) {
|
||||
/*
|
||||
* Failing to support extended linear cache region resize does not
|
||||
* Failing to retrieve extended linear cache region resize does not
|
||||
* prevent the region from functioning. Only causes cxl list showing
|
||||
* incorrect region size.
|
||||
*/
|
||||
dev_warn(cxlrd->cxlsd.cxld.dev.parent,
|
||||
"Extended linear cache calculation failed rc:%d\n", rc);
|
||||
}
|
||||
"Extended linear cache retrieval failed rc:%d\n", rc);
|
||||
|
||||
/* Ignoring return code */
|
||||
cxlrd->cache_size = 0;
|
||||
/* Ignoring return code */
|
||||
cxlrd->cache_size = 0;
|
||||
}
|
||||
}
|
||||
|
||||
DEFINE_FREE(put_cxlrd, struct cxl_root_decoder *,
|
||||
|
|
|
|||
|
|
@ -467,21 +467,6 @@ static ssize_t commit_show(struct device *dev, struct device_attribute *attr,
|
|||
}
|
||||
static DEVICE_ATTR_RW(commit);
|
||||
|
||||
static umode_t cxl_region_visible(struct kobject *kobj, struct attribute *a,
|
||||
int n)
|
||||
{
|
||||
struct device *dev = kobj_to_dev(kobj);
|
||||
struct cxl_region *cxlr = to_cxl_region(dev);
|
||||
|
||||
/*
|
||||
* Support tooling that expects to find a 'uuid' attribute for all
|
||||
* regions regardless of mode.
|
||||
*/
|
||||
if (a == &dev_attr_uuid.attr && cxlr->mode != CXL_PARTMODE_PMEM)
|
||||
return 0444;
|
||||
return a->mode;
|
||||
}
|
||||
|
||||
static ssize_t interleave_ways_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
|
|
@ -760,6 +745,21 @@ static ssize_t size_show(struct device *dev, struct device_attribute *attr,
|
|||
}
|
||||
static DEVICE_ATTR_RW(size);
|
||||
|
||||
static ssize_t extended_linear_cache_size_show(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct cxl_region *cxlr = to_cxl_region(dev);
|
||||
struct cxl_region_params *p = &cxlr->params;
|
||||
ssize_t rc;
|
||||
|
||||
ACQUIRE(rwsem_read_intr, rwsem)(&cxl_rwsem.region);
|
||||
if ((rc = ACQUIRE_ERR(rwsem_read_intr, &rwsem)))
|
||||
return rc;
|
||||
return sysfs_emit(buf, "%#llx\n", p->cache_size);
|
||||
}
|
||||
static DEVICE_ATTR_RO(extended_linear_cache_size);
|
||||
|
||||
static struct attribute *cxl_region_attrs[] = {
|
||||
&dev_attr_uuid.attr,
|
||||
&dev_attr_commit.attr,
|
||||
|
|
@ -768,9 +768,34 @@ static struct attribute *cxl_region_attrs[] = {
|
|||
&dev_attr_resource.attr,
|
||||
&dev_attr_size.attr,
|
||||
&dev_attr_mode.attr,
|
||||
&dev_attr_extended_linear_cache_size.attr,
|
||||
NULL,
|
||||
};
|
||||
|
||||
static umode_t cxl_region_visible(struct kobject *kobj, struct attribute *a,
|
||||
int n)
|
||||
{
|
||||
struct device *dev = kobj_to_dev(kobj);
|
||||
struct cxl_region *cxlr = to_cxl_region(dev);
|
||||
|
||||
/*
|
||||
* Support tooling that expects to find a 'uuid' attribute for all
|
||||
* regions regardless of mode.
|
||||
*/
|
||||
if (a == &dev_attr_uuid.attr && cxlr->mode != CXL_PARTMODE_PMEM)
|
||||
return 0444;
|
||||
|
||||
/*
|
||||
* Don't display extended linear cache attribute if there is no
|
||||
* extended linear cache.
|
||||
*/
|
||||
if (a == &dev_attr_extended_linear_cache_size.attr &&
|
||||
cxlr->params.cache_size == 0)
|
||||
return 0;
|
||||
|
||||
return a->mode;
|
||||
}
|
||||
|
||||
static const struct attribute_group cxl_region_group = {
|
||||
.attrs = cxl_region_attrs,
|
||||
.is_visible = cxl_region_visible,
|
||||
|
|
@ -3580,6 +3605,10 @@ static int __construct_region(struct cxl_region *cxlr,
|
|||
"Extended linear cache calculation failed rc:%d\n", rc);
|
||||
}
|
||||
|
||||
rc = sysfs_update_group(&cxlr->dev.kobj, &cxl_region_group);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
rc = insert_resource(cxlrd->res, res);
|
||||
if (rc) {
|
||||
/*
|
||||
|
|
|
|||
Loading…
Reference in New Issue