Re: [PATCH v4 11/19] x86/resctrl: Introduce mbm_total_cfg and mbm_local_cfg

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Reinette,

On 6/27/2024 3:56 PM, Reinette Chatre wrote:
Hi Babu,

On 6/27/24 11:51 AM, Moger, Babu wrote:
Hi Reinette,

On 6/13/24 20:43, Reinette Chatre wrote:
Hi Babu,

On 5/24/24 5:23 AM, Babu Moger wrote:
If the BMEC (Bandwidth Monitoring Event Configuration) feature is
supported, the bandwidth events can be configured to track specific
events. The event configuration is domain specific. ABMC (Assignable
Bandwidth Monitoring Counters) feature needs event configuration
information to assign hardware counter to an RMID. Event configurations
are not stored in resctrl but instead always read from or written to
hardware directly when prompted by user space.

Read the event configuration from the hardware during the domain
initialization. Save the configuration information in the rdt_hw_domain,
so it can be used for counter assignment.

Signed-off-by: Babu Moger <babu.moger@xxxxxxx>
---
v4: Read the configuration information from the hardware to initialize.
      Added few commit messages.
      Fixed the tab spaces.

v3: Minor changes related to rebase in mbm_config_write_domain.

v2: No changes.
---
   arch/x86/kernel/cpu/resctrl/core.c     |  2 ++
   arch/x86/kernel/cpu/resctrl/internal.h |  5 +++++
   arch/x86/kernel/cpu/resctrl/monitor.c  | 21 +++++++++++++++++++++
   3 files changed, 28 insertions(+)

diff --git a/arch/x86/kernel/cpu/resctrl/core.c
b/arch/x86/kernel/cpu/resctrl/core.c
index ec93f6a50308..856c46d12177 100644
--- a/arch/x86/kernel/cpu/resctrl/core.c
+++ b/arch/x86/kernel/cpu/resctrl/core.c
@@ -542,6 +542,8 @@ static void domain_add_cpu(int cpu, struct
rdt_resource *r)
           return;
       }
   +    arch_domain_mbm_evt_config(hw_dom);
+
       list_add_tail_rcu(&d->list, add_pos);
         err = resctrl_online_domain(r, d);
diff --git a/arch/x86/kernel/cpu/resctrl/internal.h
b/arch/x86/kernel/cpu/resctrl/internal.h
index 5e7e76cd512f..60a1ca0a11a7 100644
--- a/arch/x86/kernel/cpu/resctrl/internal.h
+++ b/arch/x86/kernel/cpu/resctrl/internal.h
@@ -373,6 +373,8 @@ struct arch_mbm_state {
    * @ctrl_val:    array of cache or mem ctrl values (indexed by CLOSID)
    * @arch_mbm_total:    arch private state for MBM total bandwidth
    * @arch_mbm_local:    arch private state for MBM local bandwidth
+ * @mbm_total_cfg:    MBM total bandwidth configuration
+ * @mbm_local_cfg:    MBM local bandwidth configuration
    *
    * Members of this structure are accessed via helpers that provide
abstraction.
    */
@@ -381,6 +383,8 @@ struct rdt_hw_domain {
       u32                *ctrl_val;
       struct arch_mbm_state        *arch_mbm_total;
       struct arch_mbm_state        *arch_mbm_local;
+    u32                mbm_total_cfg;
+    u32                mbm_local_cfg;
   };

Similar to the abmc_enabled member of rdt_hw_resource, these new
members of rdt_hw_domain are architecture specific and should never be
touched directly by resctrl fs code, for example, from mbm_config_show().

Need some clarification here.

I am thinking you want to introduce architecture specific routines to get
and set mbm_total_config/mbm_local_config for the domain.
Something like this.

+int arch_get_mbm_evt_cfg(struct rdt_domain *d, enum resctrl_event_id eventid)

The prefix for arch specific calls converged to "resctrl_arch_".

+{
+       struct rdt_hw_domain *hw_dom = resctrl_to_arch_dom(d);
+
+       switch (eventid) {
+       case QOS_L3_OCCUP_EVENT_ID:
+               break;
+       case QOS_L3_MBM_TOTAL_EVENT_ID:
+               return hw_dom->mbm_total_cfg;
+       case QOS_L3_MBM_LOCAL_EVENT_ID:
+               return hw_dom->mbm_local_cfg;
+       }
+
+       /* Never expect to get here */
+       WARN_ON_ONCE(1);
+
+       return -1;
+}
+
+void arch_set_mbm_evt_cfg(struct rdt_domain *d,
+                         enum resctrl_event_id eventid, u32 val)
+{
+       struct rdt_hw_domain *hw_dom = resctrl_to_arch_dom(d);
+
+       switch (eventid) {
+       case QOS_L3_OCCUP_EVENT_ID:
+               break;
+       case QOS_L3_MBM_TOTAL_EVENT_ID:
+               hw_dom->mbm_total_cfg = val;
+               break;
+       case QOS_L3_MBM_LOCAL_EVENT_ID:
+               hw_dom->mbm_local_cfg = val;
+       }
+
+       return;
+}
+

I expected that a call to set the event configuration on an architecture to
also interact with the hardware. Essentially what mon_event_config_write()
does today, but in addition also sets the cached mbm_total_cfg/mbm_local_cfg.

Yea. Understood.

Part of this is done by the new MPAM portion [1]. With that the post-ABMC
implementation of resctrl_arch_mon_event_config_read() may be what you
have as arch_get_mbm_evt_cfg() above and resctrl_arch_mon_event_config_write()
does the same as in [1] but with addition of updating the cached
mbm_local_cfg/mbm_total_cfg within struct rdt_hw_domain. Would this work
for ABMC?


Yes. It does work. I can keep the same name as well.
Thanks for the clarifications.


Reinette

[1] https://lore.kernel.org/lkml/20240614150033.10454-21-james.morse@xxxxxxx/



--
- Babu Moger




[Index of Archives]     [Kernel Newbies]     [Security]     [Netfilter]     [Bugtraq]     [Linux FS]     [Yosemite Forum]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]     [Linux Resources]

  Powered by Linux