tools: implement new generic set value interface and MBA set value command

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@linux.intel.com>
Acked-by: Wei Liu <wei.liu2@citrix.com>
This commit is contained in:
Yi Sun authored and Wei Liu committed 2018-01-18 11:32:51 +00:00
1 parent 755471176c
commit 583906320b
6 files changed
+96 -33

No files matched your search

+3 -3
View File
@@ -2533,9 +2533,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);
+6 -3
View File
@@ -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_SET_L2_CBM;
break;
case XC_PSR_MBA_THRTL:
cmd = XEN_DOMCTL_PSR_SET_MBA_THRTL;
break;
default:
errno = EINVAL;
return -1;
+25 -27
View File
@@ -328,32 +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 = libxl__psr_type_to_libxc_psr_type(type);
if (socketid >= nr_sockets)
break;
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,
@@ -453,7 +428,30 @@ 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, socketid, nr_sockets;
xc_psr_type xc_type = libxl__psr_type_to_libxc_psr_type(type);
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) {
if (socketid >= nr_sockets)
break;
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,
+1
View File
@@ -208,6 +208,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);
+6
View File
@@ -586,6 +586,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",
+55
View File
@@ -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);
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 EXIT_FAILURE;
}
domid = find_domain(argv[optind]);
thrtl = strtoll(argv[optind + 1], NULL , 0);
ret = libxl_psr_set_val(ctx, domid, type, &target_map, thrtl);
libxl_bitmap_dispose(&target_map);
return ret;
}
static int psr_mba_hwinfo(void)
{
int rc;
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.