|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH RESEND v5 06/24] x86: refactor psr: implement get hw info flow.
.snip..
> +static enum psr_feat_type psr_cbm_type_to_feat_type(enum cbm_type type)
> +{
> + enum psr_feat_type feat_type;
> +
> + /* Judge if feature is enabled. */
> + switch ( type ) {
The { should be on its own line.
> + case PSR_CBM_TYPE_L3:
> + feat_type = PSR_SOCKET_L3_CAT;
> + break;
> + default:
> + feat_type = 0xFFFF;
Perhaps have an extra field in psr_feat_type titled 'PSR_SOCKET_UNKNOWN =
0xFFFF'
and use that ?
> + break;
> + }
> +
> + return feat_type;
> +}
> +
> /* L3 CAT functions implementation. */
> static void l3_cat_init_feature(struct cpuid_leaf_regs regs,
> struct feat_node *feat,
> @@ -218,8 +238,22 @@ static unsigned int l3_cat_get_cos_max(const struct
> feat_node *feat)
> return feat->info.l3_cat_info.cos_max;
> }
>
> +static bool l3_cat_get_feat_info(const struct feat_node *feat,
> + uint32_t data[], unsigned int array_len)
> +{
> + if ( !data || 3 > array_len )
> + return false;
> +
> + data[CBM_LEN] = feat->info.l3_cat_info.cbm_len;
> + data[COS_MAX] = feat->info.l3_cat_info.cos_max;
> + data[PSR_FLAG] = 0;
> +
> + return true;
> +}
> +
> static const struct feat_ops l3_cat_ops = {
> .get_cos_max = l3_cat_get_cos_max,
> + .get_feat_info = l3_cat_get_feat_info,
> };
>
> static void __init parse_psr_bool(char *s, char *value, char *feature,
> @@ -425,10 +459,43 @@ 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 *flags)
> +static struct psr_socket_info *get_socket_info(unsigned int socket)
> {
> - return 0;
> + if ( !socket_info )
> + return ERR_PTR(-ENODEV);
> +
> + if ( socket >= nr_sockets )
> + return ERR_PTR(-ENOTSOCK);
<chuckles>
I think ENXIO is more appropiate. Or ERANGE
> +
> + if ( !socket_info[socket].feat_mask )
> + return ERR_PTR(-ENOENT);
> +
> + return socket_info + socket;
> +}
> +
> +int psr_get_info(unsigned int socket, enum cbm_type type,
> + uint32_t data[], unsigned int array_len)
> +{
> + const struct psr_socket_info *info = get_socket_info(socket);
> + const struct feat_node *feat;
> + enum psr_feat_type feat_type;
> +
> + if ( IS_ERR(info) )
> + return PTR_ERR(info);
> +
> + feat_type = psr_cbm_type_to_feat_type(type);
> + list_for_each_entry(feat, &info->feat_list, list)
> + {
> + if ( feat->feature != feat_type )
> + continue;
> +
> + if ( feat->ops.get_feat_info(feat, data, array_len) )
> + return 0;
> + else
> + return -EINVAL;
> + }
> +
> + return -ENOENT;
> }
>
> int psr_get_l3_cbm(struct domain *d, unsigned int socket,
> diff --git a/xen/arch/x86/sysctl.c b/xen/arch/x86/sysctl.c
> index 14e7dc7..d90db78 100644
> --- a/xen/arch/x86/sysctl.c
> +++ b/xen/arch/x86/sysctl.c
> @@ -176,15 +176,19 @@ long arch_do_sysctl(
> switch ( sysctl->u.psr_cat_op.cmd )
> {
> 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.flags);
> + {
> + uint32_t data[3];
> + ret = psr_get_info(sysctl->u.psr_cat_op.target,
> + PSR_CBM_TYPE_L3, data, 3);
> +
> + sysctl->u.psr_cat_op.u.l3_info.cbm_len = data[CBM_LEN];
> + sysctl->u.psr_cat_op.u.l3_info.cos_max = data[COS_MAX];
> + sysctl->u.psr_cat_op.u.l3_info.flags = data[PSR_FLAG];
>
> 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/psr.h b/xen/include/asm-x86/psr.h
> index 57f47e9..e3b18bc 100644
> --- a/xen/include/asm-x86/psr.h
> +++ b/xen/include/asm-x86/psr.h
> @@ -33,6 +33,11 @@
> /* L3 CDP Enable bit*/
> #define PSR_L3_QOS_CDP_ENABLE_BIT 0x0
>
> +/* Used by psr_get_info() */
> +#define CBM_LEN 0
> +#define COS_MAX 1
> +#define PSR_FLAG 2
Odd. Looking at that file I see those #define but all of them are on
an odd spacing. But that was with previous commits that are in.
Perhaps put them all on the same column?
> +
> struct psr_cmt_l3 {
> unsigned int features;
> unsigned int upscaling_factor;
> @@ -63,8 +68,8 @@ int psr_alloc_rmid(struct domain *d);
> 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 *flags);
> +int psr_get_info(unsigned int socket, enum cbm_type type,
> + uint32_t data[], unsigned int array_len);
> int psr_get_l3_cbm(struct domain *d, unsigned int socket,
> uint64_t *cbm, enum cbm_type type);
> int psr_set_l3_cbm(struct domain *d, unsigned int socket,
> --
> 1.9.1
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |