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
|
changed, only freed by writing 0. The kernel makes no guarantees
|
||||||
that data is maintained over an address space freeing event, and
|
that data is maintained over an address space freeing event, and
|
||||||
there is no guarantee that a free followed by an allocate
|
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
|
What: /sys/bus/cxl/devices/regionZ/mode
|
||||||
Date: January, 2023
|
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);
|
rc = hmat_get_extended_linear_cache_size(&res, nid, &cache_size);
|
||||||
if (rc)
|
if (rc)
|
||||||
return rc;
|
return 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The cache range is expected to be within the CFMWS.
|
* 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;
|
int rc;
|
||||||
|
|
||||||
rc = cxl_acpi_set_cache_size(cxlrd);
|
rc = cxl_acpi_set_cache_size(cxlrd);
|
||||||
if (!rc)
|
if (rc) {
|
||||||
return;
|
|
||||||
|
|
||||||
if (rc != -EOPNOTSUPP) {
|
|
||||||
/*
|
/*
|
||||||
* 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
|
* prevent the region from functioning. Only causes cxl list showing
|
||||||
* incorrect region size.
|
* incorrect region size.
|
||||||
*/
|
*/
|
||||||
dev_warn(cxlrd->cxlsd.cxld.dev.parent,
|
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 */
|
/* Ignoring return code */
|
||||||
cxlrd->cache_size = 0;
|
cxlrd->cache_size = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFINE_FREE(put_cxlrd, struct cxl_root_decoder *,
|
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 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,
|
static ssize_t interleave_ways_show(struct device *dev,
|
||||||
struct device_attribute *attr, char *buf)
|
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 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[] = {
|
static struct attribute *cxl_region_attrs[] = {
|
||||||
&dev_attr_uuid.attr,
|
&dev_attr_uuid.attr,
|
||||||
&dev_attr_commit.attr,
|
&dev_attr_commit.attr,
|
||||||
|
|
@ -768,9 +768,34 @@ static struct attribute *cxl_region_attrs[] = {
|
||||||
&dev_attr_resource.attr,
|
&dev_attr_resource.attr,
|
||||||
&dev_attr_size.attr,
|
&dev_attr_size.attr,
|
||||||
&dev_attr_mode.attr,
|
&dev_attr_mode.attr,
|
||||||
|
&dev_attr_extended_linear_cache_size.attr,
|
||||||
NULL,
|
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 = {
|
static const struct attribute_group cxl_region_group = {
|
||||||
.attrs = cxl_region_attrs,
|
.attrs = cxl_region_attrs,
|
||||||
.is_visible = cxl_region_visible,
|
.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);
|
"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);
|
rc = insert_resource(cxlrd->res, res);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
/*
|
/*
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue