Commit 48dbe31a authored by James Morse's avatar James Morse Committed by Borislav Petkov

x86/resctrl: Add per-rmid arch private storage for overflow and chunks

A renamed __rmid_read() is intended as the function that an
architecture agnostic resctrl filesystem driver can use to
read a value in bytes from a counter. Currently the function returns
the MBM values in chunks directly from hardware. For bandwidth
counters the resctrl filesystem uses this to calculate the number of
bytes ever seen.

MPAM's scaling of counters can be changed at runtime, reducing the
resolution but increasing the range. When this is changed the prev_msr
values need to be converted by the architecture code.

Add an array for per-rmid private storage. The prev_msr and chunks
values will move here to allow resctrl_arch_rmid_read() to always
return the number of bytes read by this counter without assistance
from the filesystem. The values are moved in later patches when
the overflow and correction calls are moved into __rmid_read().
Signed-off-by: default avatarJames Morse <james.morse@arm.com>
Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
Reviewed-by: default avatarJamie Iles <quic_jiles@quicinc.com>
Reviewed-by: default avatarShaopeng Tan <tan.shaopeng@fujitsu.com>
Reviewed-by: default avatarReinette Chatre <reinette.chatre@intel.com>
Tested-by: default avatarXin Hao <xhao@linux.alibaba.com>
Tested-by: default avatarShaopeng Tan <tan.shaopeng@fujitsu.com>
Tested-by: default avatarCristian Marussi <cristian.marussi@arm.com>
Link: https://lore.kernel.org/r/20220902154829.30399-14-james.morse@arm.com
parent 30442571
...@@ -413,6 +413,8 @@ static void setup_default_ctrlval(struct rdt_resource *r, u32 *dc) ...@@ -413,6 +413,8 @@ static void setup_default_ctrlval(struct rdt_resource *r, u32 *dc)
static void domain_free(struct rdt_hw_domain *hw_dom) static void domain_free(struct rdt_hw_domain *hw_dom)
{ {
kfree(hw_dom->arch_mbm_total);
kfree(hw_dom->arch_mbm_local);
kfree(hw_dom->ctrl_val); kfree(hw_dom->ctrl_val);
kfree(hw_dom); kfree(hw_dom);
} }
...@@ -438,6 +440,34 @@ static int domain_setup_ctrlval(struct rdt_resource *r, struct rdt_domain *d) ...@@ -438,6 +440,34 @@ static int domain_setup_ctrlval(struct rdt_resource *r, struct rdt_domain *d)
return 0; return 0;
} }
/**
* arch_domain_mbm_alloc() - Allocate arch private storage for the MBM counters
* @num_rmid: The size of the MBM counter array
* @hw_dom: The domain that owns the allocated arrays
*/
static int arch_domain_mbm_alloc(u32 num_rmid, struct rdt_hw_domain *hw_dom)
{
size_t tsize;
if (is_mbm_total_enabled()) {
tsize = sizeof(*hw_dom->arch_mbm_total);
hw_dom->arch_mbm_total = kcalloc(num_rmid, tsize, GFP_KERNEL);
if (!hw_dom->arch_mbm_total)
return -ENOMEM;
}
if (is_mbm_local_enabled()) {
tsize = sizeof(*hw_dom->arch_mbm_local);
hw_dom->arch_mbm_local = kcalloc(num_rmid, tsize, GFP_KERNEL);
if (!hw_dom->arch_mbm_local) {
kfree(hw_dom->arch_mbm_total);
hw_dom->arch_mbm_total = NULL;
return -ENOMEM;
}
}
return 0;
}
/* /*
* domain_add_cpu - Add a cpu to a resource's domain list. * domain_add_cpu - Add a cpu to a resource's domain list.
* *
...@@ -487,6 +517,11 @@ static void domain_add_cpu(int cpu, struct rdt_resource *r) ...@@ -487,6 +517,11 @@ static void domain_add_cpu(int cpu, struct rdt_resource *r)
return; return;
} }
if (r->mon_capable && arch_domain_mbm_alloc(r->num_rmid, hw_dom)) {
domain_free(hw_dom);
return;
}
list_add_tail(&d->list, add_pos); list_add_tail(&d->list, add_pos);
err = resctrl_online_domain(r, d); err = resctrl_online_domain(r, d);
......
...@@ -303,17 +303,31 @@ struct mbm_state { ...@@ -303,17 +303,31 @@ struct mbm_state {
bool delta_comp; bool delta_comp;
}; };
/**
* struct arch_mbm_state - values used to compute resctrl_arch_rmid_read()s
* return value.
* @prev_msr: Value of IA32_QM_CTR last time it was read for the RMID used to
* find this struct.
*/
struct arch_mbm_state {
u64 prev_msr;
};
/** /**
* struct rdt_hw_domain - Arch private attributes of a set of CPUs that share * struct rdt_hw_domain - Arch private attributes of a set of CPUs that share
* a resource * a resource
* @d_resctrl: Properties exposed to the resctrl file system * @d_resctrl: Properties exposed to the resctrl file system
* @ctrl_val: array of cache or mem ctrl values (indexed by CLOSID) * @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
* *
* Members of this structure are accessed via helpers that provide abstraction. * Members of this structure are accessed via helpers that provide abstraction.
*/ */
struct rdt_hw_domain { struct rdt_hw_domain {
struct rdt_domain d_resctrl; struct rdt_domain d_resctrl;
u32 *ctrl_val; u32 *ctrl_val;
struct arch_mbm_state *arch_mbm_total;
struct arch_mbm_state *arch_mbm_local;
}; };
static inline struct rdt_hw_domain *resctrl_to_arch_dom(struct rdt_domain *r) static inline struct rdt_hw_domain *resctrl_to_arch_dom(struct rdt_domain *r)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment