mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 10:11:27 +01:00
tools: add support for cache coloring configuration
Add a new "llc_colors" parameter that defines the LLC color assignment for a domain. The user can specify one or more color ranges using the same syntax used everywhere else for color config described in the documentation. The parameter is defined as a list of strings that represent the color ranges. Documentation is also added. Golang bindings are regenerated. Based on original work from: Luca Miccio <lucmiccio@gmail.com> Signed-off-by: Carlo Nonato <carlo.nonato@minervasys.tech> Signed-off-by: Marco Solieri <marco.solieri@minervasys.tech> Reviewed-by: Anthony PERARD <anthony.perard@vates.tech>
This commit is contained in:
1 parent
6985aa5e0c
commit
748bd725fb
9 files changed
+127
-1
No files matched your search
@@ -3074,6 +3074,12 @@ raised.
|
||||
|
||||
=over 4
|
||||
|
||||
=item B<llc_colors=[ "RANGE", "RANGE", ...]>
|
||||
|
||||
Specify the Last Level Cache (LLC) color configuration for the guest.
|
||||
B<RANGE> can be either a single color value or a hypen-separated closed
|
||||
interval of colors (such as "0-4").
|
||||
|
||||
=item B<nr_spis="NR_SPIS">
|
||||
|
||||
An optional integer parameter specifying the number of SPIs (Shared
|
||||
|
||||
@@ -1097,6 +1097,14 @@ if err := x.Iomem[i].fromC(&v); err != nil {
|
||||
return fmt.Errorf("converting field Iomem: %v", err) }
|
||||
}
|
||||
}
|
||||
x.LlcColors = nil
|
||||
if n := int(xc.num_llc_colors); n > 0 {
|
||||
cLlcColors := (*[1<<28]C.uint32_t)(unsafe.Pointer(xc.llc_colors))[:n:n]
|
||||
x.LlcColors = make([]uint32, n)
|
||||
for i, v := range cLlcColors {
|
||||
x.LlcColors[i] = uint32(v)
|
||||
}
|
||||
}
|
||||
if err := x.ClaimMode.fromC(&xc.claim_mode);err != nil {
|
||||
return fmt.Errorf("converting field ClaimMode: %v", err)
|
||||
}
|
||||
@@ -1453,6 +1461,14 @@ return fmt.Errorf("converting field Iomem: %v", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
if numLlcColors := len(x.LlcColors); numLlcColors > 0 {
|
||||
xc.llc_colors = (*C.uint32_t)(C.malloc(C.size_t(numLlcColors*numLlcColors)))
|
||||
xc.num_llc_colors = C.int(numLlcColors)
|
||||
cLlcColors := (*[1<<28]C.uint32_t)(unsafe.Pointer(xc.llc_colors))[:numLlcColors:numLlcColors]
|
||||
for i,v := range x.LlcColors {
|
||||
cLlcColors[i] = C.uint32_t(v)
|
||||
}
|
||||
}
|
||||
if err := x.ClaimMode.toC(&xc.claim_mode); err != nil {
|
||||
return fmt.Errorf("converting field ClaimMode: %v", err)
|
||||
}
|
||||
|
||||
@@ -575,6 +575,7 @@ SchedParams DomainSchedParams
|
||||
Ioports []IoportRange
|
||||
Irqs []uint32
|
||||
Iomem []IomemRange
|
||||
LlcColors []uint32
|
||||
ClaimMode Defbool
|
||||
EventChannels uint32
|
||||
Kernel string
|
||||
|
||||
@@ -1379,6 +1379,11 @@ void libxl_mac_copy(libxl_ctx *ctx, libxl_mac *dst, const libxl_mac *src);
|
||||
*/
|
||||
#define LIBXL_HAVE_BUILDINFO_HVM_SYSTEM_FIRMWARE
|
||||
|
||||
/*
|
||||
* The libxl_domain_build_info has the llc_colors array.
|
||||
*/
|
||||
#define LIBXL_HAVE_BUILDINFO_LLC_COLORS 1
|
||||
|
||||
/*
|
||||
* ERROR_REMUS_XXX error code only exists from Xen 4.5, Xen 4.6 and it
|
||||
* is changed to ERROR_CHECKPOINT_XXX in Xen 4.7
|
||||
|
||||
@@ -2641,6 +2641,15 @@ int xc_livepatch_replace(xc_interface *xch, char *name, uint32_t timeout, uint32
|
||||
int xc_domain_cacheflush(xc_interface *xch, uint32_t domid,
|
||||
xen_pfn_t start_pfn, xen_pfn_t nr_pfns);
|
||||
|
||||
/*
|
||||
* Set LLC colors for a domain.
|
||||
* It can only be used directly after domain creation. An attempt to use it
|
||||
* afterwards will result in an error.
|
||||
*/
|
||||
int xc_domain_set_llc_colors(xc_interface *xch, uint32_t domid,
|
||||
const uint32_t *llc_colors,
|
||||
uint32_t num_llc_colors);
|
||||
|
||||
#if defined(__arm__) || defined(__aarch64__)
|
||||
int xc_dt_overlay(xc_interface *xch, void *overlay_fdt,
|
||||
uint32_t overlay_fdt_size, uint8_t overlay_op);
|
||||
|
||||
@@ -2195,6 +2195,40 @@ int xc_domain_soft_reset(xc_interface *xch,
|
||||
domctl.domain = domid;
|
||||
return do_domctl(xch, &domctl);
|
||||
}
|
||||
|
||||
int xc_domain_set_llc_colors(xc_interface *xch, uint32_t domid,
|
||||
const uint32_t *llc_colors,
|
||||
uint32_t num_llc_colors)
|
||||
{
|
||||
struct xen_domctl domctl = {};
|
||||
DECLARE_HYPERCALL_BUFFER(uint32_t, local);
|
||||
int ret = -1;
|
||||
|
||||
if ( num_llc_colors )
|
||||
{
|
||||
size_t bytes = sizeof(uint32_t) * num_llc_colors;
|
||||
|
||||
local = xc_hypercall_buffer_alloc(xch, local, bytes);
|
||||
if ( local == NULL )
|
||||
{
|
||||
PERROR("Could not allocate LLC colors for set_llc_colors");
|
||||
goto out;
|
||||
}
|
||||
memcpy(local, llc_colors, bytes);
|
||||
set_xen_guest_handle(domctl.u.set_llc_colors.llc_colors, local);
|
||||
}
|
||||
|
||||
domctl.cmd = XEN_DOMCTL_set_llc_colors;
|
||||
domctl.domain = domid;
|
||||
domctl.u.set_llc_colors.num_llc_colors = num_llc_colors;
|
||||
|
||||
ret = do_domctl(xch, &domctl);
|
||||
|
||||
out:
|
||||
xc_hypercall_buffer_free(xch, local);
|
||||
|
||||
return ret;
|
||||
}
|
||||
/*
|
||||
* Local variables:
|
||||
* mode: C
|
||||
|
||||
@@ -747,6 +747,24 @@ int libxl__domain_make(libxl__gc *gc, libxl_domain_config *d_config,
|
||||
/* A new domain now exists */
|
||||
*domid = local_domid;
|
||||
|
||||
ret = xc_domain_set_llc_colors(ctx->xch, local_domid,
|
||||
b_info->llc_colors,
|
||||
b_info->num_llc_colors);
|
||||
if (ret < 0) {
|
||||
if (errno == EOPNOTSUPP) {
|
||||
if (b_info->num_llc_colors > 0) {
|
||||
LOGED(ERROR, local_domid,
|
||||
"LLC coloring not enabled in the hypervisor");
|
||||
rc = ERROR_FAIL;
|
||||
goto out;
|
||||
}
|
||||
} else {
|
||||
LOGED(ERROR, local_domid, "LLC colors allocation failed");
|
||||
rc = ERROR_FAIL;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
rc = libxl__is_domid_recent(gc, local_domid, &recent);
|
||||
if (rc)
|
||||
goto out;
|
||||
|
||||
@@ -616,6 +616,7 @@ libxl_domain_build_info = Struct("domain_build_info",[
|
||||
("ioports", Array(libxl_ioport_range, "num_ioports")),
|
||||
("irqs", Array(uint32, "num_irqs")),
|
||||
("iomem", Array(libxl_iomem_range, "num_iomem")),
|
||||
("llc_colors", Array(uint32, "num_llc_colors")),
|
||||
("claim_mode", libxl_defbool),
|
||||
("event_channels", uint32),
|
||||
("kernel", string),
|
||||
|
||||
+37
-1
@@ -1296,7 +1296,7 @@ void parse_config_data(const char *config_source,
|
||||
XLU_ConfigList *cpus, *vbds, *nics, *pcis, *cvfbs, *cpuids, *vtpms,
|
||||
*usbctrls, *usbdevs, *p9devs, *vdispls, *pvcallsifs_devs;
|
||||
XLU_ConfigList *channels, *ioports, *irqs, *iomem, *viridian, *dtdevs,
|
||||
*mca_caps, *smbios;
|
||||
*mca_caps, *smbios, *llc_colors;
|
||||
int num_ioports, num_irqs, num_iomem, num_cpus, num_viridian, num_mca_caps;
|
||||
int num_smbios;
|
||||
int pci_power_mgmt = 0;
|
||||
@@ -1304,6 +1304,7 @@ void parse_config_data(const char *config_source,
|
||||
int pci_permissive = 0;
|
||||
int pci_seize = 0;
|
||||
int i, e;
|
||||
int num_llc_colors;
|
||||
char *kernel_basename;
|
||||
|
||||
libxl_domain_create_info *c_info = &d_config->c_info;
|
||||
@@ -1447,6 +1448,41 @@ void parse_config_data(const char *config_source,
|
||||
if (!xlu_cfg_get_long (config, "maxmem", &l, 0))
|
||||
b_info->max_memkb = l * 1024;
|
||||
|
||||
if (!xlu_cfg_get_list(config, "llc_colors", &llc_colors, &num_llc_colors, 0)) {
|
||||
int cur_index = 0;
|
||||
|
||||
b_info->num_llc_colors = 0;
|
||||
for (i = 0; i < num_llc_colors; i++) {
|
||||
uint32_t start = 0, end = 0, k;
|
||||
|
||||
buf = xlu_cfg_get_listitem(llc_colors, i);
|
||||
if (!buf) {
|
||||
fprintf(stderr,
|
||||
"xl: Can't get element %d in LLC color list\n", i);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (sscanf(buf, "%" SCNu32 "-%" SCNu32, &start, &end) != 2) {
|
||||
if (sscanf(buf, "%" SCNu32, &start) != 1) {
|
||||
fprintf(stderr, "xl: Invalid LLC color range: %s\n", buf);
|
||||
exit(1);
|
||||
}
|
||||
end = start;
|
||||
} else if (start > end) {
|
||||
fprintf(stderr,
|
||||
"xl: Start LLC color is greater than end: %s\n", buf);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
b_info->num_llc_colors += (end - start) + 1;
|
||||
b_info->llc_colors = (uint32_t *)realloc(b_info->llc_colors,
|
||||
sizeof(*b_info->llc_colors) * b_info->num_llc_colors);
|
||||
|
||||
for (k = start; k <= end; k++)
|
||||
b_info->llc_colors[cur_index++] = k;
|
||||
}
|
||||
}
|
||||
|
||||
if (!xlu_cfg_get_long (config, "vcpus", &l, 0)) {
|
||||
vcpus = l;
|
||||
if (libxl_cpu_bitmap_alloc(ctx, &b_info->avail_vcpus, l)) {
|
||||
|
||||