[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v7 1/3] x86: Support enable CDP by boot parameter and add get CDP status
Add boot parameter `psr=cdp` to enable CDP at boot time. Intel Code/Data Prioritization (CDP) feature is based on CAT. Note that cos_max would be half when CDP is on. struct psr_cat_cbm is extended to support CDP operation. Extend psr_get_cat_l3_info sysctl to get CDP status. Signed-off-by: He Chen <he.chen@xxxxxxxxxxxxxxx> Reviewed-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> --- Changes in v7: * write CDP data mask (mask1) before turning CDP on * check CDP status before clear enabled bit in function cat_cpu_fini Changes in v6: * remove unnecessary parameter in cdp_is_enabled Changes in v5: * remove unnecessary u in psr_cat_cbm structure * revert write_l3_cbm and put the modification to next patch * remove duplicate PSR_CAT_FLAG_L3_CDP --- docs/misc/xen-command-line.markdown | 11 ++++++-- xen/arch/x86/psr.c | 51 ++++++++++++++++++++++++++++++++++--- xen/arch/x86/sysctl.c | 5 ++-- xen/include/asm-x86/msr-index.h | 3 +++ xen/include/asm-x86/psr.h | 8 +++++- xen/include/public/sysctl.h | 4 ++- 6 files changed, 72 insertions(+), 10 deletions(-) diff --git a/docs/misc/xen-command-line.markdown b/docs/misc/xen-command-line.markdown index a565c1b..416e559 100644 --- a/docs/misc/xen-command-line.markdown +++ b/docs/misc/xen-command-line.markdown @@ -1174,9 +1174,9 @@ This option can be specified more than once (up to 8 times at present). > `= <integer>` ### psr (Intel) -> `= List of ( cmt:<boolean> | rmid_max:<integer> | cat:<boolean> | cos_max:<integer> )` +> `= List of ( cmt:<boolean> | rmid_max:<integer> | cat:<boolean> | cos_max:<integer> | cdp:<boolean> )` -> Default: `psr=cmt:0,rmid_max:255,cat:0,cos_max:255` +> Default: `psr=cmt:0,rmid_max:255,cat:0,cos_max:255,cdp:0` Platform Shared Resource(PSR) Services. Intel Haswell and later server platforms offer information about the sharing of resources. @@ -1206,6 +1206,13 @@ The following resources are available: the cache allocation. * `cat` instructs Xen to enable/disable Cache Allocation Technology. * `cos_max` indicates the max value for COS ID. +* Code and Data Prioritization Technology (Broadwell and later). Information + regarding the code cache and the data cache allocation. CDP is based on CAT. + * `cdp` instructs Xen to enable/disable Code and Data Prioritization. Note + that `cos_max` of CDP is a little different from `cos_max` of CAT. With + CDP, one COS will corespond two CBMs other than one with CAT, due to the + sum of CBMs is fixed, that means actual `cos_max` in use will automatically + reduce to half when CDP is enabled. ### reboot > `= t[riple] | k[bd] | a[cpi] | p[ci] | P[ower] | e[fi] | n[o] [, [w]arm | > [c]old]` diff --git a/xen/arch/x86/psr.c b/xen/arch/x86/psr.c index c0daa2e..5ddeb2b 100644 --- a/xen/arch/x86/psr.c +++ b/xen/arch/x86/psr.c @@ -21,9 +21,16 @@ #define PSR_CMT (1<<0) #define PSR_CAT (1<<1) +#define PSR_CDP (1<<2) struct psr_cat_cbm { - uint64_t cbm; + union { + uint64_t cbm; + struct { + uint64_t code; + uint64_t data; + }; + }; unsigned int ref; }; @@ -43,6 +50,7 @@ struct psr_cmt *__read_mostly psr_cmt; static unsigned long *__read_mostly cat_socket_enable; static struct psr_cat_socket_info *__read_mostly cat_socket_info; +static unsigned long *__read_mostly cdp_socket_enable; static unsigned int __initdata opt_psr; static unsigned int __initdata opt_rmid_max = 255; @@ -94,6 +102,7 @@ static void __init parse_psr_param(char *s) parse_psr_bool(s, val_str, "cmt", PSR_CMT); parse_psr_bool(s, val_str, "cat", PSR_CAT); + parse_psr_bool(s, val_str, "cdp", PSR_CDP); if ( val_str && !strcmp(s, "rmid_max") ) opt_rmid_max = simple_strtoul(val_str, NULL, 0); @@ -261,8 +270,13 @@ static struct psr_cat_socket_info *get_cat_socket_info(unsigned int socket) return cat_socket_info + socket; } +static inline bool_t cdp_is_enabled(unsigned int socket) +{ + return cdp_socket_enable && test_bit(socket, cdp_socket_enable); +} + int psr_get_cat_l3_info(unsigned int socket, uint32_t *cbm_len, - uint32_t *cos_max) + uint32_t *cos_max, uint32_t *flags) { struct psr_cat_socket_info *info = get_cat_socket_info(socket); @@ -272,6 +286,10 @@ int psr_get_cat_l3_info(unsigned int socket, uint32_t *cbm_len, *cbm_len = info->cbm_len; *cos_max = info->cos_max; + *flags = 0; + if ( cdp_is_enabled(socket) ) + *flags |= XEN_SYSCTL_PSR_CAT_L3_CDP; + return 0; } @@ -470,6 +488,7 @@ static void cat_cpu_init(void) struct psr_cat_socket_info *info; unsigned int socket; unsigned int cpu = smp_processor_id(); + uint64_t val; const struct cpuinfo_x86 *c = cpu_data + cpu; if ( !cpu_has(c, X86_FEATURE_CAT) || c->cpuid_level < PSR_CPUID_LEVEL_CAT ) @@ -495,8 +514,27 @@ static void cat_cpu_init(void) spin_lock_init(&info->cbm_lock); set_bit(socket, cat_socket_enable); - printk(XENLOG_INFO "CAT: enabled on socket %u, cos_max:%u, cbm_len:%u\n", - socket, info->cos_max, info->cbm_len); + + if ( (ecx & PSR_CAT_CDP_CAPABILITY) && (opt_psr & PSR_CDP) && + cdp_socket_enable && !test_bit(socket, cdp_socket_enable) ) + { + info->cos_to_cbm[0].code = (1ull << info->cbm_len) - 1; + info->cos_to_cbm[0].data = (1ull << info->cbm_len) - 1; + + /* We only write mask1 since mask0 is always all ones by default. */ + wrmsrl(MSR_IA32_PSR_L3_MASK(1), (1ull << info->cbm_len) - 1); + + rdmsrl(MSR_IA32_PSR_L3_QOS_CFG, val); + wrmsrl(MSR_IA32_PSR_L3_QOS_CFG, val | (1 << PSR_L3_QOS_CDP_ENABLE_BIT)); + + /* Cut half of cos_max when CDP is enabled. */ + info->cos_max >>= 1; + + set_bit(socket, cdp_socket_enable); + } + printk(XENLOG_INFO "CAT: enabled on socket %u, cos_max:%u, cbm_len:%u, CDP:%s\n", + socket, info->cos_max, info->cbm_len, + cdp_is_enabled(socket) ? "on" : "off"); } } @@ -513,6 +551,10 @@ static void cat_cpu_fini(unsigned int cpu) xfree(info->cos_to_cbm); info->cos_to_cbm = NULL; } + + if ( cdp_is_enabled(socket) ) + clear_bit(socket, cdp_socket_enable); + clear_bit(socket, cat_socket_enable); } } @@ -535,6 +577,7 @@ static void __init init_psr_cat(void) cat_socket_enable = xzalloc_array(unsigned long, BITS_TO_LONGS(nr_sockets)); cat_socket_info = xzalloc_array(struct psr_cat_socket_info, nr_sockets); + cdp_socket_enable = xzalloc_array(unsigned long, BITS_TO_LONGS(nr_sockets)); if ( !cat_socket_enable || !cat_socket_info ) psr_cat_free(); diff --git a/xen/arch/x86/sysctl.c b/xen/arch/x86/sysctl.c index 38b5dcb..e54ddac 100644 --- a/xen/arch/x86/sysctl.c +++ b/xen/arch/x86/sysctl.c @@ -178,12 +178,13 @@ long arch_do_sysctl( case XEN_SYSCTL_PSR_CAT_get_l3_info: ret = psr_get_cat_l3_info(sysctl->u.psr_cat_op.target, &sysctl->u.psr_cat_op.u.l3_info.cbm_len, - &sysctl->u.psr_cat_op.u.l3_info.cos_max); + &sysctl->u.psr_cat_op.u.l3_info.cos_max, + &sysctl->u.psr_cat_op.u.l3_info.flags); if ( !ret && __copy_field_to_guest(u_sysctl, sysctl, u.psr_cat_op) ) ret = -EFAULT; - break; + default: ret = -EOPNOTSUPP; break; diff --git a/xen/include/asm-x86/msr-index.h b/xen/include/asm-x86/msr-index.h index e9c4723..65c1d02 100644 --- a/xen/include/asm-x86/msr-index.h +++ b/xen/include/asm-x86/msr-index.h @@ -328,7 +328,10 @@ #define MSR_IA32_CMT_EVTSEL 0x00000c8d #define MSR_IA32_CMT_CTR 0x00000c8e #define MSR_IA32_PSR_ASSOC 0x00000c8f +#define MSR_IA32_PSR_L3_QOS_CFG 0x00000c81 #define MSR_IA32_PSR_L3_MASK(n) (0x00000c90 + (n)) +#define MSR_IA32_PSR_L3_MASK_CODE(n) (0x00000c90 + (n) * 2 + 1) +#define MSR_IA32_PSR_L3_MASK_DATA(n) (0x00000c90 + (n) * 2) /* Intel Model 6 */ #define MSR_P6_PERFCTR(n) (0x000000c1 + (n)) diff --git a/xen/include/asm-x86/psr.h b/xen/include/asm-x86/psr.h index 081750f..5faeaaf 100644 --- a/xen/include/asm-x86/psr.h +++ b/xen/include/asm-x86/psr.h @@ -27,6 +27,12 @@ /* L3 Monitoring Features */ #define PSR_CMT_L3_OCCUPANCY 0x1 +/* CDP Capability */ +#define PSR_CAT_CDP_CAPABILITY (1u << 2) + +/* L3 CDP Enable bit*/ +#define PSR_L3_QOS_CDP_ENABLE_BIT 0x0 + struct psr_cmt_l3 { unsigned int features; unsigned int upscaling_factor; @@ -52,7 +58,7 @@ void psr_free_rmid(struct domain *d); void psr_ctxt_switch_to(struct domain *d); int psr_get_cat_l3_info(unsigned int socket, uint32_t *cbm_len, - uint32_t *cos_max); + uint32_t *cos_max, uint32_t *flags); int psr_get_l3_cbm(struct domain *d, unsigned int socket, uint64_t *cbm); int psr_set_l3_cbm(struct domain *d, unsigned int socket, uint64_t cbm); diff --git a/xen/include/public/sysctl.h b/xen/include/public/sysctl.h index 0cacacc..96680eb 100644 --- a/xen/include/public/sysctl.h +++ b/xen/include/public/sysctl.h @@ -36,7 +36,7 @@ #include "physdev.h" #include "tmem.h" -#define XEN_SYSCTL_INTERFACE_VERSION 0x0000000C +#define XEN_SYSCTL_INTERFACE_VERSION 0x0000000D /* * Read console content from Xen buffer ring. @@ -705,6 +705,8 @@ struct xen_sysctl_psr_cat_op { struct { uint32_t cbm_len; /* OUT: CBM length */ uint32_t cos_max; /* OUT: Maximum COS */ +#define XEN_SYSCTL_PSR_CAT_L3_CDP (1u << 0) + uint32_t flags; /* OUT: CAT flags */ } l3_info; } u; }; -- 1.9.1 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |