Re: [PATCH v6 03/18] x86/resctrl: Add PLZA configuration definitions and data structures

From: Babu Moger

Date: Thu Oct 15 2026 - 19:08:15 EST


Hi Reinette,

On 10/15/26 09:22, Reinette Chatre wrote:
Hi Babu,

nit: subject claims multiple "definitions" while only adding one #define.
Will change it to:

x86/resctrl: Add PLZA configuration register and data structures



On 10/1/26 8:10 AM, Babu Moger wrote:
Privilege Level Zero Association (PLZA) enables the kernel to switch to
a different CLOSID and/or RMID than those used in user mode when entering
kernel mode. CLOSID and RMID selection are independent and can be
configured separately.

That CLOSID and RMID are independent on x86 is clear to me. That they can be
configured separately is not clear to me in this context. What does this
"separate configuration" refer to? Looking at the later patches kernel
mode allocation and monitoring associations are always configured together
and written to same MSR at the same time?


Good point. Its confusing. What I meant is that allocation (CLOSID) and monitoring (RMID) associations are independent PLZA features and can be enabled independently in hardware. For example, a platform may enable kernel mode CLOSID association without enabling kernel mode RMID association, or vice versa.

Yes. The kernel interface configures both together because they are carried in the same IA32_PQR_ASSOC MSR update.

How about?

Privilege Level Zero Association (PLZA) enables the kernel to use a different CLOSID and/or RMID in kernel mode than in user mode. Allocation (CLOSID) and monitoring (RMID) associations are independent PLZA features and may be enabled independently by hardware.



PLZA associations are programmed on a per-CPU basis through
MSR_IA32_PQR_PLZA_ASSOC (0xc00003fc), which contains the kernel RMID and
CLOSID values along with their corresponding enable bits.

Make the register and its field layout available so kernel mode allocation
and monitoring associations can be configured independently.

Could you please also elaborate what "configured independently" refers to?
At this point it specifically refers to kernel mode and from what I understand
kernel mode of allocation and monitoring are configured together.

Yea. it is not clear. Let me change. Remove the text "independently"(Its already in the earlier text).

Make the register and its field layout available so kernel mode allocation and monitoring associations can be configured.



Signed-off-by: Babu Moger <babu.moger@xxxxxxx>
---

...

---
arch/x86/include/asm/msr-index.h | 1 +
arch/x86/kernel/cpu/resctrl/internal.h | 49 ++++++++++++++++++++++++++
2 files changed, 50 insertions(+)

diff --git a/arch/x86/include/asm/msr-index.h b/arch/x86/include/asm/msr-index.h
index 82ca6356dc62..1331291f7a36 100644
--- a/arch/x86/include/asm/msr-index.h
+++ b/arch/x86/include/asm/msr-index.h
@@ -1304,6 +1304,7 @@
/* - AMD: */
#define MSR_IA32_MBA_BW_BASE 0xc0000200
#define MSR_IA32_SMBA_BW_BASE 0xc0000280
+#define MSR_IA32_PQR_PLZA_ASSOC 0xc00003fc
#define MSR_IA32_L3_QOS_ABMC_CFG 0xc00003fd
#define MSR_IA32_L3_QOS_EXT_CFG 0xc00003ff
#define MSR_IA32_EVT_CFG_BASE 0xc0000400
diff --git a/arch/x86/kernel/cpu/resctrl/internal.h b/arch/x86/kernel/cpu/resctrl/internal.h
index e3cfa0c10e92..44ecde20b1b4 100644
--- a/arch/x86/kernel/cpu/resctrl/internal.h
+++ b/arch/x86/kernel/cpu/resctrl/internal.h
@@ -222,6 +222,55 @@ union l3_qos_abmc_cfg {
unsigned long full;
};
+/*
+ * Privilege Level Zero Association (PLZA) is configured via
+ * MSR_IA32_PQR_PLZA_ASSOC.
+ *
+ * @rmid : RMID programmed for PLZA.
+ * @reserved1 : Reserved.
+ * @rmid_en : Enable RMID for PLZA.
+ * @closid : CLOSID programmed for PLZA.
+ * @reserved2 : Reserved.
+ * @closid_en : Enable CLOSID for PLZA.
+ * @reserved3 : Reserved.
+ * @plza_en : Enable PLZA. When enabled, PLZA applies to the
+ * given CPU.
+ *
+ * The MSR_IA32_PQR_PLZA_ASSOC must be programmed on every CPU in a QoS
+ * domain. Each domain supports a single PLZA CLOSID and/or RMID
+ * association, and all fields except @plza_en must be programmed
+ * identically across the domain to ensure consistent behavior.
+ *
+ * CLOSID and RMID selections are controlled independently. When PLZA is
+ * enabled (@plza_en = 1), CPL0 uses CLOSID and RMID values from
+ * MSR_IA32_PQR_PLZA_ASSOC depending on the corresponding enable bits. When
+ * PLZA is disabled (@plza_en = 0), the CLOSID and RMID are always taken
+ * from MSR_IA32_PQR_ASSOC regardless of privilege level.
+ *
+ * - @rmid_en = 1: use the RMID from MSR_IA32_PQR_PLZA_ASSOC if @plza_en = 1.
+ * - @rmid_en = 0: use the RMID from MSR_IA32_PQR_ASSOC.
+ * - @closid_en = 1: use the CLOSID from MSR_IA32_PQR_PLZA_ASSOC if @plza_en = 1.
+ * - @closid_en = 0: use the CLOSID from MSR_IA32_PQR_ASSOC.
+ *
+ * This allows PLZA to override only RMID, only CLOSID, or both. If both
+ * rmid_en and closid_en are clear, the effective behavior is the same as

nit: rmid_en -> @rmid_en, closid_en -> @closid_en

Sure.

Thanks
Babu