This patch implements set value flow for MBA including its callback
function and domctl interface.
Signed-off-by: Yi Sun
---
CC: Jan Beulich
CC: Andrew Cooper
CC: Wei Liu
CC: Roger Pau Monné
CC: Chao Peng
v8:
- restore some unnecessary changes in 'cat_check_cbm'.
(suggested by Jan Beulich)
- use 'fls()' but not 'flsl()'.
(suggested by Jan Beulich)
- use plain '=' to assign value for thrtl in 'mba_sanitize_thrtl'.
(suggested by Jan Beulich)
v7:
- change name of 'check_val' to 'sanitize'.
(suggested by Jan Beulich)
- fix comments.
(suggested by Jan Beulich)
- add parentheses and change '== 0' to '!'.
(suggested by Jan Beulich)
- remove unnecessary check of 'mba.thrtl_max'.
(suggested by Jan Beulich)
- remove unnecessary intermediate variable 'mod'.
(suggested by Jan Beulich)
- refine an assignement sentence to use '&='.
(suggested by Jan Beulich)
- change type of last parameter of 'sanitize' to 'uint32_t' and
apply same change to 'cat_check_cbm'.
(suggested by Jan Beulich)
v6:
- split co-exist features' values setting flow to a new patch.
(suggested by Jan Beulich)
- restore codes related to 'mba_check_thrtl' and 'check_value'.
(suggested by Jan Beulich)
v5:
- adjust position of 'cat_check_cbm' to not to make changes so big.
(suggested by Roger Pau Monné)
- remove 'props' from 'struct cos_write_info'.
(suggested by Roger Pau Monné)
- make a single return statement in 'mba_check_thrtl'.
(suggested by Jan Beulich)
v4:
- remove 'ALLOC_' from macro names.
(suggested by Roger Pau Monné)
- join two checks into a single if.
(suggested by Roger Pau Monné)
- remove redundant local variable 'array_len'.
(suggested by Roger Pau Monné)
v3:
- modify commit message to make it clear.
(suggested by Roger Pau Monné)
- modify functionality of 'check_val' to make it simple to only check value.
Change the last parameter type from 'unsigned long *' to 'unsigned long'.
(suggested by Roger Pau Monné)
- call rdmsrl to get value just written into MSR for MBA. Because HW can
automatically change input value to what it wants.
(suggested by Roger Pau Monné)
- change type of 'write_msr' to 'uint32_t' to return the value actually
written into MSR. Then, change 'do_write_psr_msrs' to set the returned
value into 'cos_reg_val[]'
- move the declaration of 'j' into loop in 'do_write_psr_msrs'.
(suggested by Roger Pau Monné)
- change 'mba_info' to 'mba'.
(suggested by Roger Pau Monné)
- change 'cat_info' to 'cat'.
(suggested by Roger Pau Monné)
- rename 'psr_cat/PSR_CAT' to 'psr_alloc/PSR_ALLOC' and remove 'op/OP'
from name.
(suggested by Roger Pau Monné)
- change 'PSR_VAL_TYPE_MBA' to 'PSR_TYPE_MBA_THRTL'.
(suggested by Roger Pau Monné)
v2:
- remove linear mode 'thrtl_max' check in 'mba_check_thrtl' because it has
been checked in 'mba_init_feature'.
(suggested by Chao Peng)
- for non-linear mode, check if '*thrtl' is not 0 in 'mba_check_thrtl'. If
it is 0, we do not need to change it.
(suggested by Chao Peng)
- move comments to explain changes of 'cos_write_info' from psr.c to commit
message.
(suggested by Chao Peng)
---
xen/arch/x86/domctl.c | 6 ++
xen/arch/x86/psr.c | 49 +
xen/include/public/domctl.h | 1 +
3 files changed, 52 insertions(+), 4 deletions(-)
diff --git a/xen/arch/x86/domctl.c b/xen/arch/x86/domctl.c
index b726eae..4bca15d 100644
--- a/xen/arch/x86/domctl.c
+++ b/xen/arch/x86/domctl.c
@@ -1465,6 +1465,12 @@ long arch_do_domctl(
PSR_TYPE_L2_CBM);
break;
+case XEN_DOMCTL_PSR_SET_MBA_THRTL:
+ret = psr_set_val(d, domctl->u.psr_alloc.target,
+ domctl->u.psr_alloc.data,
+ PSR_TYPE_MBA_THRTL);
+break;
+
#define domctl_psr_get_val(d, domctl, type, copyback) ({\
uint32_t v_;\
int r_ = psr_get_val((d), (domctl)->u.psr_alloc.target, \
diff --git a/xen/arch/x86/psr.c b/xen/arch/x86/psr.c
index 549f21b..04dd4a1 100644
--- a/xen/arch/x86/psr.c
+++ b/xen/arch/x86/psr.c
@@ -138,6 +138,12 @@ static const struct feat_props {
/* write_msr is used to write out feature MSR register. */
void (*write_msr)(unsigned int cos, uint32_t val, enum psr_type type);
+
+/*
+ * sanitize is used to check if input val fulfills SDM requirement.
+ * And change it to valid value if SDM allows.
+ */
+bool (*sanitize)(const struct feat_node *feat, uint32_t *val);
}