|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3 14/15] tools: implement new generic set value interface and MBA set value command
On Tue, Sep 05, 2017 at 05:32:36PM +0800, Yi Sun wrote:
> This patch implements new generic set value interfaces in libxc and libxl.
> These interfaces are suitable for all allocation features. It also adds a
> new MBA set value command in xl.
>
> Signed-off-by: Yi Sun <yi.y.sun@xxxxxxxxxxxxxxx>
> ---
> v3:
> - add 'const' for 'opts[]' in 'main_psr_mba_set'.
> (suggested by Roger Pau Monné)
> - replace 'libxl_psr_cbm_type' to 'libxl_psr_type' for newly defined
> interfaces.
> (suggested by Roger Pau Monné)
> ---
> tools/libxc/include/xenctrl.h | 6 ++---
> tools/libxc/xc_psr.c | 9 ++++---
> tools/libxl/libxl_psr.c | 56
> +++++++++++++++++++++----------------------
> tools/xl/xl.h | 1 +
> tools/xl/xl_cmdtable.c | 6 +++++
> tools/xl/xl_psr.c | 55 ++++++++++++++++++++++++++++++++++++++++++
> 6 files changed, 99 insertions(+), 34 deletions(-)
>
> diff --git a/tools/libxc/include/xenctrl.h b/tools/libxc/include/xenctrl.h
> index eef06be..21dac2f 100644
> --- a/tools/libxc/include/xenctrl.h
> +++ b/tools/libxc/include/xenctrl.h
> @@ -2499,9 +2499,9 @@ int xc_psr_cmt_get_data(xc_interface *xch, uint32_t
> rmid, uint32_t cpu,
> uint64_t *tsc);
> int xc_psr_cmt_enabled(xc_interface *xch);
>
> -int xc_psr_cat_set_domain_data(xc_interface *xch, uint32_t domid,
> - xc_psr_type type, uint32_t target,
> - uint64_t data);
> +int xc_psr_set_domain_data(xc_interface *xch, uint32_t domid,
> + xc_psr_type type, uint32_t target,
> + uint64_t data);
> int xc_psr_get_domain_data(xc_interface *xch, uint32_t domid,
> xc_psr_type type, uint32_t target,
> uint64_t *data);
> diff --git a/tools/libxc/xc_psr.c b/tools/libxc/xc_psr.c
> index 2f0eed9..e53b5f5 100644
> --- a/tools/libxc/xc_psr.c
> +++ b/tools/libxc/xc_psr.c
> @@ -248,9 +248,9 @@ int xc_psr_cmt_enabled(xc_interface *xch)
>
> return 0;
> }
> -int xc_psr_cat_set_domain_data(xc_interface *xch, uint32_t domid,
> - xc_psr_type type, uint32_t target,
> - uint64_t data)
> +int xc_psr_set_domain_data(xc_interface *xch, uint32_t domid,
> + xc_psr_type type, uint32_t target,
> + uint64_t data)
> {
> DECLARE_DOMCTL;
> uint32_t cmd;
> @@ -269,6 +269,9 @@ int xc_psr_cat_set_domain_data(xc_interface *xch,
> uint32_t domid,
> case XC_PSR_CAT_L2_CBM:
> cmd = XEN_DOMCTL_PSR_ALLOC_SET_L2_CBM;
> break;
> + case XC_PSR_MBA_THRTL:
> + cmd = XEN_DOMCTL_PSR_ALLOC_SET_MBA_THRTL;
> + break;
> default:
> errno = EINVAL;
> return -1;
> diff --git a/tools/libxl/libxl_psr.c b/tools/libxl/libxl_psr.c
> index 78d5bc5..d3c3d42 100644
> --- a/tools/libxl/libxl_psr.c
> +++ b/tools/libxl/libxl_psr.c
> @@ -328,33 +328,7 @@ int libxl_psr_cat_set_cbm(libxl_ctx *ctx, uint32_t domid,
> libxl_psr_cbm_type type, libxl_bitmap *target_map,
> uint64_t cbm)
> {
> - GC_INIT(ctx);
> - int rc;
> - int socketid, nr_sockets;
> -
> - rc = libxl__count_physical_sockets(gc, &nr_sockets);
> - if (rc) {
> - LOGED(ERROR, domid, "failed to get system socket count");
> - goto out;
> - }
> -
> - libxl_for_each_set_bit(socketid, *target_map) {
> - xc_psr_type xc_type;
> -
> - if (socketid >= nr_sockets)
> - break;
> -
> - xc_type = libxl__psr_type_to_libxc_psr_type(type);
> - if (xc_psr_cat_set_domain_data(ctx->xch, domid, xc_type,
> - socketid, cbm)) {
> - libxl__psr_alloc_log_err_msg(gc, errno, type);
> - rc = ERROR_FAIL;
> - }
> - }
> -
> -out:
> - GC_FREE;
> - return rc;
> + return libxl_psr_set_val(ctx, domid, type, target_map, cbm);
> }
>
> int libxl_psr_cat_get_cbm(libxl_ctx *ctx, uint32_t domid,
> @@ -458,7 +432,33 @@ int libxl_psr_set_val(libxl_ctx *ctx, uint32_t domid,
> libxl_psr_type type, libxl_bitmap *target_map,
> uint64_t val)
> {
> - return ERROR_FAIL;
> + GC_INIT(ctx);
> + int rc;
> + int socketid, nr_sockets;
You could fit them all in a single line.
> + rc = libxl__count_physical_sockets(gc, &nr_sockets);
> + if (rc) {
> + LOG(ERROR, "failed to get system socket count");
> + goto out;
> + }
> +
> + libxl_for_each_set_bit(socketid, *target_map) {
> + xc_psr_type xc_type;
> +
> + if (socketid >= nr_sockets)
> + break;
> +
> + xc_type = libxl__psr_type_to_libxc_psr_type(type);
> + if (xc_psr_set_domain_data(ctx->xch, domid, xc_type,
> + socketid, val)) {
> + libxl__psr_alloc_log_err_msg(gc, errno, type);
> + rc = ERROR_FAIL;
> + }
> + }
> +
> +out:
> + GC_FREE;
> + return rc;
> }
>
> int libxl_psr_get_val(libxl_ctx *ctx, uint32_t domid,
> diff --git a/tools/xl/xl.h b/tools/xl/xl.h
> index 3389df9..3f99b6b 100644
> --- a/tools/xl/xl.h
> +++ b/tools/xl/xl.h
> @@ -204,6 +204,7 @@ int main_psr_cmt_detach(int argc, char **argv);
> int main_psr_cmt_show(int argc, char **argv);
> int main_psr_cat_cbm_set(int argc, char **argv);
> int main_psr_cat_show(int argc, char **argv);
> +int main_psr_mba_set(int argc, char **argv);
> int main_psr_mba_show(int argc, char **argv);
> #endif
> int main_qemu_monitor_command(int argc, char **argv);
> diff --git a/tools/xl/xl_cmdtable.c b/tools/xl/xl_cmdtable.c
> index cdc2349..9d45d3b 100644
> --- a/tools/xl/xl_cmdtable.c
> +++ b/tools/xl/xl_cmdtable.c
> @@ -560,6 +560,12 @@ struct cmd_spec cmd_table[] = {
> "[options] <Domain>",
> "-l <level> Specify the cache level to process, otherwise L3
> cache is processed\n"
> },
> + { "psr-mba-set",
> + &main_psr_mba_set, 0, 1,
> + "Set throttling value (THRTL) for a domain",
> + "[options] <Domain> <THRTL>",
> + "-s <socket> Specify the socket to process, otherwise all
> sockets are processed\n"
> + },
> { "psr-mba-show",
> &main_psr_mba_show, 0, 1,
> "Show Memory Bandwidth Allocation information",
> diff --git a/tools/xl/xl_psr.c b/tools/xl/xl_psr.c
> index 46b7788..a648b1a 100644
> --- a/tools/xl/xl_psr.c
> +++ b/tools/xl/xl_psr.c
> @@ -552,6 +552,61 @@ int main_psr_mba_show(int argc, char **argv)
> return psr_val_show(domid, LIBXL_PSR_FEAT_TYPE_MBA, 0);
> }
>
> +int main_psr_mba_set(int argc, char **argv)
> +{
> + uint32_t domid;
> + libxl_psr_type type;
> + uint64_t thrtl;
> + int ret, opt = 0;
> + libxl_bitmap target_map;
> + char *value;
> + libxl_string_list socket_list;
> + unsigned long start, end;
> + unsigned int i, j, len;
> +
> + static const struct option opts[] = {
> + {"socket", 1, 0, 's'},
> + COMMON_LONG_OPTS
> + };
> +
> + libxl_socket_bitmap_alloc(ctx, &target_map, 0);
> + libxl_bitmap_set_none(&target_map);
> +
> + SWITCH_FOREACH_OPT(opt, "s:", opts, "psr-mba-set", 0) {
> + case 's':
> + trim(isspace, optarg, &value);
> + split_string_into_string_list(value, ",", &socket_list);
> + len = libxl_string_list_length(&socket_list);
> + for (i = 0; i < len; i++) {
> + parse_range(socket_list[i], &start, &end);
Indentation.
> + for (j = start; j <= end; j++)
> + libxl_bitmap_set(&target_map, j);
> + }
> +
> + libxl_string_list_dispose(&socket_list);
> + free(value);
> + break;
> + }
> +
> + type = LIBXL_PSR_CBM_TYPE_MBA_THRTL;
> +
> + if (libxl_bitmap_is_empty(&target_map))
> + libxl_bitmap_set_any(&target_map);
> +
> + if (argc != optind + 2) {
> + help("psr-mba-set");
> + return 2;
> + }
Can you do this check at the beginning of the function? Also why
return 2 instead of EXIT_FAILURE?
Thanks, Roger.
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |