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.
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>
---
v10:
- no changes
v9:
- turned warning into error in case of coloring not enabled
v8:
- warn the user in case of coloring not supported at hypervisor level
v7:
- removed unneeded NULL check before xc_hypercall_buffer_free() in
xc_domain_set_llc_colors()
v6:
- no edits
v5:
- added LIBXL_HAVE_BUILDINFO_LLC_COLORS
- moved color configuration in xc_domain_set_llc_colors() cause of the new
hypercall
v4:
- removed overlapping color ranges checks during parsing
- moved hypercall buffer initialization in libxenctrl
---
docs/man/xl.cfg.5.pod.in | 6 +++++
tools/include/libxl.h | 5 +++++
tools/include/xenctrl.h | 9 ++++++++
tools/libs/ctrl/xc_domain.c | 35 +++++++++++++++++++++++++++++
tools/libs/light/libxl_create.c | 18 +++++++++++++++
tools/libs/light/libxl_types.idl | 1 +
tools/xl/xl_parse.c | 38 +++++++++++++++++++++++++++++++-
7 files changed, 111 insertions(+), 1 deletion(-)
diff --git a/docs/man/xl.cfg.5.pod.in b/docs/man/xl.cfg.5.pod.in
index ac3f88fd57..8e1422104e 100644
--- a/docs/man/xl.cfg.5.pod.in
+++ b/docs/man/xl.cfg.5.pod.in
@@ -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
diff --git a/tools/include/libxl.h b/tools/include/libxl.h
index 8d32428ea9..f8fe4afd7d 100644
--- a/tools/include/libxl.h
+++ b/tools/include/libxl.h
@@ -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
diff --git a/tools/include/xenctrl.h b/tools/include/xenctrl.h
index 29617585c5..aa2b4b04f3 100644
--- a/tools/include/xenctrl.h
+++ b/tools/include/xenctrl.h
@@ -2667,6 +2667,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 unsigned int *llc_colors,
+ unsigned int 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);
diff --git a/tools/libs/ctrl/xc_domain.c b/tools/libs/ctrl/xc_domain.c
index e3538ec0ba..4ed339e6e4 100644
--- a/tools/libs/ctrl/xc_domain.c
+++ b/tools/libs/ctrl/xc_domain.c
@@ -2195,6 +2195,41 @@ 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 unsigned int *llc_colors,
+ unsigned int 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");
+ ret = -ENOMEM;
+ 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
diff --git a/tools/libs/light/libxl_create.c b/tools/libs/light/libxl_create.c
index edeadd57ef..e03599ea99 100644
--- a/tools/libs/light/libxl_create.c
+++ b/tools/libs/light/libxl_create.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;
diff --git a/tools/libs/light/libxl_types.idl b/tools/libs/light/libxl_types.idl
index 4e65e6fda5..bd4b8721ff 100644
--- a/tools/libs/light/libxl_types.idl
+++ b/tools/libs/light/libxl_types.idl
@@ -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),
diff --git a/tools/xl/xl_parse.c b/tools/xl/xl_parse.c
index e3a4800f6e..3d85be7dd4 100644
--- a/tools/xl/xl_parse.c
+++ b/tools/xl/xl_parse.c
@@ -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)) {
--
2.43.0
On Tue, Nov 19, 2024 at 03:13:23PM +0100, Carlo Nonato wrote:
> tools/libs/light/libxl_types.idl | 1 +
An other thing I've completely forgot, with this IDL changed there will
be a need to regen some other files in the repo, namely:
tools/golang/xenlight/helpers.gen.go
tools/golang/xenlight/types.gen.go
Running this following command should be enough, even if you don't have
golang installed.
make -C tools/golang/xenlight helpers.gen.go types.gen.go
If you send an update of the patch series, it would be nice to include
the regenerated files.
Cheers,
--
Anthony Perard | Vates XCP-ng Developer
XCP-ng & Xen Orchestra - Vates solutions
web: https://vates.tech
Hi Carlo,
On Tue, Nov 19, 2024 at 03:13:23PM +0100, Carlo Nonato wrote:
> diff --git a/tools/libs/ctrl/xc_domain.c b/tools/libs/ctrl/xc_domain.c
> index e3538ec0ba..4ed339e6e4 100644
> --- a/tools/libs/ctrl/xc_domain.c
> +++ b/tools/libs/ctrl/xc_domain.c
> @@ -2195,6 +2195,41 @@ 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 unsigned int *llc_colors,
The hypercall seems to take a buffer of `uint32_t` for `llc_colors`, but
the parameter of the function is `unsigned int` instead, is there any
reason for them to be different?
> + unsigned int 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");
> + ret = -ENOMEM;
I think we are supposed to return -1 in case of error, see:
https://elixir.bootlin.com/xen/v4.19.0/source/tools/include/xenctrl.h#L101
And there's nothing else to do, xc_hypercall_buffer_alloc() should
already have set `errno`, and PERROR() preserves it.
> + goto out;
> + }
Thanks,
--
Anthony Perard | Vates XCP-ng Developer
XCP-ng & Xen Orchestra - Vates solutions
web: https://vates.tech
Hi Anthony,
On Wed, Nov 20, 2024 at 5:25 PM Anthony PERARD
<anthony.perard@vates.tech> wrote:
>
> Hi Carlo,
>
> On Tue, Nov 19, 2024 at 03:13:23PM +0100, Carlo Nonato wrote:
> > diff --git a/tools/libs/ctrl/xc_domain.c b/tools/libs/ctrl/xc_domain.c
> > index e3538ec0ba..4ed339e6e4 100644
> > --- a/tools/libs/ctrl/xc_domain.c
> > +++ b/tools/libs/ctrl/xc_domain.c
> > @@ -2195,6 +2195,41 @@ 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 unsigned int *llc_colors,
>
> The hypercall seems to take a buffer of `uint32_t` for `llc_colors`, but
> the parameter of the function is `unsigned int` instead, is there any
> reason for them to be different?
I don't remember anymore, but I think it should be uint32_t also for the
parameter.
> > + unsigned int 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");
> > + ret = -ENOMEM;
>
> I think we are supposed to return -1 in case of error, see:
> https://elixir.bootlin.com/xen/v4.19.0/source/tools/include/xenctrl.h#L101
>
> And there's nothing else to do, xc_hypercall_buffer_alloc() should
> already have set `errno`, and PERROR() preserves it.
You're right.
>> > + goto out;
> > + }
>
> Thanks,
>
> --
>
> Anthony Perard | Vates XCP-ng Developer
>
> XCP-ng & Xen Orchestra - Vates solutions
> web: https://vates.tech
(answering the other mail)
On Wed, Nov 20, 2024 at 5:48 PM Anthony PERARD
<anthony.perard@vates.tech> wrote:
>
> On Tue, Nov 19, 2024 at 03:13:23PM +0100, Carlo Nonato wrote:
> > tools/libs/light/libxl_types.idl | 1 +
>
> An other thing I've completely forgot, with this IDL changed there will
> be a need to regen some other files in the repo, namely:
> tools/golang/xenlight/helpers.gen.go
> tools/golang/xenlight/types.gen.go
>
> Running this following command should be enough, even if you don't have
> golang installed.
>
> make -C tools/golang/xenlight helpers.gen.go types.gen.go
>
> If you send an update of the patch series, it would be nice to include
> the regenerated files.
Yes, will do that.
> Cheers,
>
> --
>
> Anthony Perard | Vates XCP-ng Developer
>
> XCP-ng & Xen Orchestra - Vates solutions
>
> web: https://vates.tech
Thanks.
- Carlo
© 2016 - 2026 Red Hat, Inc.