From: Dave Jiang <dave.jiang@intel.com>
To: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Cc: linux-cxl@vger.kernel.org, linux-acpi@vger.kernel.org,
linux-kernel@vger.kernel.org, gregkh@linuxfoundation.org,
rafael@kernel.org, dakr@kernel.org, dave@stgolabs.net,
alison.schofield@intel.com, vishal.l.verma@intel.com,
ira.weiny@intel.com, dan.j.williams@intel.com,
marc.herbert@linux.intel.com, akpm@linux-foundation.org,
david@redhat.com
Subject: Re: [PATCH 3/4] cxl, acpi/hmat: Update CXL access coordinates directly instead of through HMAT
Date: Fri, 15 Aug 2025 08:35:31 -0700 [thread overview]
Message-ID: <01108362-8273-4291-bebe-379006e7908d@intel.com> (raw)
In-Reply-To: <20250815143125.000074d5@huawei.com>
On 8/15/25 6:31 AM, Jonathan Cameron wrote:
> On Thu, 14 Aug 2025 10:16:49 -0700
> Dave Jiang <dave.jiang@intel.com> wrote:
>
>> The current implementation of CXL memory hotplug notifier gets called
>> before the HMAT memory hotplug notifier. The CXL driver calculates the
>> access coordinates (bandwidth and latency values) for the CXL end to
>> end path (i.e. CPU to endpoint). When the CXL region is onlined, the CXL
>> memory hotplug notifier writes the access coordinates to the HMAT target
>> structs. Then the HMAT memory hotplug notifier is called and it creates
>> the access coordinates for the node sysfs attributes.
>>
>> The original intent of the 'ext_updated' flag in HMAT handling code was to
>> stop HMAT memory hotplug callback from clobbering the access coordinates
>> after CXL has injected its calculated coordinates and replaced the generic
>> target access coordinates provided by the HMAT table in the HMAT target
>> structs. However the flag is hacky at best and blocks the updates from
>> other CXL regions that are onlined in the same node later on.
>
> After all removed, or when a second region onlined in that node whilst the
> first is still online? In that second case I think we should not update
> the access properties as that would surprise anything already using the
> earlier one.
Are you thinking we'll need some sort of ref counting on the node?
DJ
>
> Jonathan
>
>> Remove the
>> 'ext_updated' flag usage and just update the access coordinates for the
>> nodes directly without touching HMAT target data.
>>
>> The hotplug memory callback ordering is changed. Instead of changing CXL,
>> move HMAT back so there's room for the levels rather than have CXL share
>> the same level as SLAB_CALLBACK_PRI. The change will resulting in the CXL
>> callback to be executed after the HMAT callback.
>>
>> With the change, the CXL hotplug memory notifier runs after the HMAT
>> callback. The HMAT callback will create the node sysfs attributes for
>> access coordinates. The CXL callback will write the access coordinates to
>> the now created node sysfs attributes directly and will not pollute the
>> HMAT target values.
>>
>> Fixes: debdce20c4f2 ("cxl/region: Deal with numa nodes not enumerated by SRAT")
>> Tested-by: Marc Herbert <marc.herbert@linux.intel.com>
>> Signed-off-by: Dave Jiang <dave.jiang@intel.com>
>> ---
>> drivers/acpi/numa/hmat.c | 6 ------
>> drivers/cxl/core/cdat.c | 5 -----
>> drivers/cxl/core/core.h | 1 -
>> drivers/cxl/core/region.c | 10 ++--------
>> include/linux/memory.h | 2 +-
>> 5 files changed, 3 insertions(+), 21 deletions(-)
>>
>> diff --git a/drivers/acpi/numa/hmat.c b/drivers/acpi/numa/hmat.c
>> index 4958301f5417..5d32490dc4ab 100644
>> --- a/drivers/acpi/numa/hmat.c
>> +++ b/drivers/acpi/numa/hmat.c
>> @@ -74,7 +74,6 @@ struct memory_target {
>> struct node_cache_attrs cache_attrs;
>> u8 gen_port_device_handle[ACPI_SRAT_DEVICE_HANDLE_SIZE];
>> bool registered;
>> - bool ext_updated; /* externally updated */
>> };
>>
>> struct memory_initiator {
>> @@ -391,7 +390,6 @@ int hmat_update_target_coordinates(int nid, struct access_coordinate *coord,
>> coord->read_bandwidth, access);
>> hmat_update_target_access(target, ACPI_HMAT_WRITE_BANDWIDTH,
>> coord->write_bandwidth, access);
>> - target->ext_updated = true;
>>
>> return 0;
>> }
>> @@ -773,10 +771,6 @@ static void hmat_update_target_attrs(struct memory_target *target,
>> u32 best = 0;
>> int i;
>>
>> - /* Don't update if an external agent has changed the data. */
>> - if (target->ext_updated)
>> - return;
>> -
>> /* Don't update for generic port if there's no device handle */
>> if ((access == NODE_ACCESS_CLASS_GENPORT_SINK_LOCAL ||
>> access == NODE_ACCESS_CLASS_GENPORT_SINK_CPU) &&
>> diff --git a/drivers/cxl/core/cdat.c b/drivers/cxl/core/cdat.c
>> index c0af645425f4..c891fd618cfd 100644
>> --- a/drivers/cxl/core/cdat.c
>> +++ b/drivers/cxl/core/cdat.c
>> @@ -1081,8 +1081,3 @@ int cxl_update_hmat_access_coordinates(int nid, struct cxl_region *cxlr,
>> {
>> return hmat_update_target_coordinates(nid, &cxlr->coord[access], access);
>> }
>> -
>> -bool cxl_need_node_perf_attrs_update(int nid)
>> -{
>> - return !acpi_node_backed_by_real_pxm(nid);
>> -}
>> diff --git a/drivers/cxl/core/core.h b/drivers/cxl/core/core.h
>> index 2669f251d677..a253d308f3c9 100644
>> --- a/drivers/cxl/core/core.h
>> +++ b/drivers/cxl/core/core.h
>> @@ -139,7 +139,6 @@ long cxl_pci_get_latency(struct pci_dev *pdev);
>> int cxl_pci_get_bandwidth(struct pci_dev *pdev, struct access_coordinate *c);
>> int cxl_update_hmat_access_coordinates(int nid, struct cxl_region *cxlr,
>> enum access_coordinate_class access);
>> -bool cxl_need_node_perf_attrs_update(int nid);
>> int cxl_port_get_switch_dport_bandwidth(struct cxl_port *port,
>> struct access_coordinate *c);
>>
>> diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c
>> index 71cc42d05248..1580e19f13a5 100644
>> --- a/drivers/cxl/core/region.c
>> +++ b/drivers/cxl/core/region.c
>> @@ -2442,14 +2442,8 @@ static bool cxl_region_update_coordinates(struct cxl_region *cxlr, int nid)
>>
>> for (int i = 0; i < ACCESS_COORDINATE_MAX; i++) {
>> if (cxlr->coord[i].read_bandwidth) {
>> - rc = 0;
>> - if (cxl_need_node_perf_attrs_update(nid))
>> - node_set_perf_attrs(nid, &cxlr->coord[i], i);
>> - else
>> - rc = cxl_update_hmat_access_coordinates(nid, cxlr, i);
>> -
>> - if (rc == 0)
>> - cset++;
>> + node_update_perf_attrs(nid, &cxlr->coord[i], i);
>> + cset++;
>> }
>> }
>>
>> diff --git a/include/linux/memory.h b/include/linux/memory.h
>> index 02314723e5bd..b41872c478e3 100644
>> --- a/include/linux/memory.h
>> +++ b/include/linux/memory.h
>> @@ -120,8 +120,8 @@ struct mem_section;
>> */
>> #define DEFAULT_CALLBACK_PRI 0
>> #define SLAB_CALLBACK_PRI 1
>> -#define HMAT_CALLBACK_PRI 2
>> #define CXL_CALLBACK_PRI 5
>> +#define HMAT_CALLBACK_PRI 6
>> #define MM_COMPUTE_BATCH_PRI 10
>> #define CPUSET_CALLBACK_PRI 10
>> #define MEMTIER_HOTPLUG_PRI 100
>
next prev parent reply other threads:[~2025-08-15 15:35 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-08-14 17:16 [PATCH 0/4] cxl, acpi/hmat, node: Update CXL access coordinates to node directly Dave Jiang
2025-08-14 17:16 ` [PATCH 1/4] mm/memory_hotplug: Update comment for hotplug memory callback priorities Dave Jiang
2025-08-16 7:29 ` David Hildenbrand
2025-08-18 14:08 ` Dave Jiang
2025-08-19 3:14 ` Marc Herbert
2025-08-19 9:18 ` David Hildenbrand
2025-08-19 15:39 ` Dave Jiang
2025-08-19 19:08 ` David Hildenbrand
2025-08-14 17:16 ` [PATCH 2/4] drivers/base/node: Add a helper function node_update_perf_attrs() Dave Jiang
2025-08-15 13:28 ` Jonathan Cameron
2025-08-18 9:49 ` David Hildenbrand
2025-08-19 17:00 ` Dave Jiang
2025-08-14 17:16 ` [PATCH 3/4] cxl, acpi/hmat: Update CXL access coordinates directly instead of through HMAT Dave Jiang
2025-08-14 22:33 ` dan.j.williams
2025-08-14 22:59 ` Dave Jiang
2025-08-14 23:09 ` Marc Herbert
2025-08-15 13:31 ` Jonathan Cameron
2025-08-15 15:35 ` Dave Jiang [this message]
2025-08-15 15:56 ` Jonathan Cameron
2025-08-14 17:16 ` [PATCH 4/4] acpi/hmat: Remove now unused hmat_update_target_coordinates() Dave Jiang
2025-08-15 13:31 ` Jonathan Cameron
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=01108362-8273-4291-bebe-379006e7908d@intel.com \
--to=dave.jiang@intel.com \
--cc=Jonathan.Cameron@huawei.com \
--cc=akpm@linux-foundation.org \
--cc=alison.schofield@intel.com \
--cc=dakr@kernel.org \
--cc=dan.j.williams@intel.com \
--cc=dave@stgolabs.net \
--cc=david@redhat.com \
--cc=gregkh@linuxfoundation.org \
--cc=ira.weiny@intel.com \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-cxl@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=marc.herbert@linux.intel.com \
--cc=rafael@kernel.org \
--cc=vishal.l.verma@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®