From: Jan Beulich <jbeulich@suse.com>
To: Carlo Nonato <carlo.nonato@minervasys.tech>
Cc: Andrew Cooper <andrew.cooper3@citrix.com>,
George Dunlap <george.dunlap@citrix.com>,
Julien Grall <julien@xen.org>,
Stefano Stabellini <sstabellini@kernel.org>, Wei Liu <wl@xen.org>,
Bertrand Marquis <bertrand.marquis@arm.com>,
Michal Orzel <michal.orzel@amd.com>,
Volodymyr Babchuk <Volodymyr_Babchuk@epam.com>,
Marco Solieri <marco.solieri@minervasys.tech>,
xen-devel@lists.xenproject.org
Subject: Re: [PATCH v7 04/14] xen/arm: add Dom0 cache coloring support
Date: Tue, 19 Mar 2024 16:30:52 +0100 [thread overview]
Message-ID: <fa879713-4eee-4905-83f9-6182924cddbb@suse.com> (raw)
In-Reply-To: <20240315105902.160047-5-carlo.nonato@minervasys.tech>
On 15.03.2024 11:58, Carlo Nonato wrote:
> --- a/docs/misc/xen-command-line.pandoc
> +++ b/docs/misc/xen-command-line.pandoc
> @@ -963,6 +963,15 @@ Controls for the dom0 IOMMU setup.
>
> Specify a list of IO ports to be excluded from dom0 access.
>
> +### dom0-llc-colors
> +> `= List of [ <integer> | <integer>-<integer> ]`
> +
> +> Default: `All available LLC colors`
> +
> +Specify dom0 LLC color configuration. This option is available only when
> +`CONFIG_LLC_COLORING` is enabled. If the parameter is not set, all available
> +colors are used.
My reservation towards this being a top-level option remains.
> --- a/xen/common/llc-coloring.c
> +++ b/xen/common/llc-coloring.c
> @@ -18,6 +18,63 @@ integer_param("llc-nr-ways", llc_nr_ways);
> /* Number of colors available in the LLC */
> static unsigned int __ro_after_init max_nr_colors;
>
> +static unsigned int __initdata dom0_colors[CONFIG_NR_LLC_COLORS];
> +static unsigned int __initdata dom0_num_colors;
> +
> +/*
> + * Parse the coloring configuration given in the buf string, following the
> + * syntax below.
> + *
> + * COLOR_CONFIGURATION ::= COLOR | RANGE,...,COLOR | RANGE
> + * RANGE ::= COLOR-COLOR
> + *
> + * Example: "0,2-6,15-16" represents the set of colors: 0,2,3,4,5,6,15,16.
> + */
> +static int __init parse_color_config(const char *buf, unsigned int *colors,
> + unsigned int max_num_colors,
> + unsigned int *num_colors)
> +{
> + const char *s = buf;
> +
> + *num_colors = 0;
> +
> + while ( *s != '\0' )
> + {
> + unsigned int color, start, end;
> +
> + start = simple_strtoul(s, &s, 0);
> +
> + if ( *s == '-' ) /* Range */
> + {
> + s++;
> + end = simple_strtoul(s, &s, 0);
> + }
> + else /* Single value */
> + end = start;
> +
> + if ( start > end || (end - start) > (UINT_MAX - *num_colors) ||
> + (*num_colors + (end - start)) >= max_num_colors )
> + return -EINVAL;
> +
> + for ( color = start; color <= end; color++ )
> + colors[(*num_colors)++] = color;
I can't spot any range check on start/end/color itself. In fact I was first
meaning to ask why the return value of simple_strtoul() is silently clipped
from unsigned long to unsigned int. Don't forget that a range specification
may easily degenerate into a negative number (due to a simple oversight or
typo), which would then be converted to a huge positive one.
> @@ -41,6 +98,22 @@ static void print_colors(const unsigned int *colors, unsigned int num_colors)
> printk(" }\n");
> }
>
> +static bool check_colors(const unsigned int *colors, unsigned int num_colors)
> +{
> + unsigned int i;
> +
> + for ( i = 0; i < num_colors; i++ )
> + {
> + if ( colors[i] >= max_nr_colors )
> + {
> + printk(XENLOG_ERR "LLC color %u >= %u\n", colors[i], max_nr_colors);
> + return false;
> + }
> + }
> +
> + return true;
> +}
Oh, here's the range checking of the color values themselves. Perhaps
a comment in parse_color_config() would help.
> @@ -91,6 +164,61 @@ void cf_check domain_dump_llc_colors(const struct domain *d)
> print_colors(d->llc_colors, d->num_llc_colors);
> }
>
> +static int domain_set_default_colors(struct domain *d)
> +{
> + unsigned int *colors = xmalloc_array(unsigned int, max_nr_colors);
> + unsigned int i;
> +
> + if ( !colors )
> + return -ENOMEM;
> +
> + printk(XENLOG_WARNING
> + "LLC color config not found for %pd, using all colors\n", d);
> +
> + for ( i = 0; i < max_nr_colors; i++ )
> + colors[i] = i;
> +
> + d->llc_colors = colors;
> + d->num_llc_colors = max_nr_colors;
> +
> + return 0;
> +}
If this function is expected to actually come into play, wouldn't it
make sense to set up such an array just once, and re-use it wherever
necessary?
Also right here both this and check_colors() could be __init. I
understand that subsequent patches will also want to use the
functions at runtime, but until then this looks slightly wrong. I'd
like to ask that such aspects be mentioned in the description, to
avoid respective questions.
> +int __init dom0_set_llc_colors(struct domain *d)
> +{
> + unsigned int *colors;
> +
> + if ( !dom0_num_colors )
> + return domain_set_default_colors(d);
> +
> + if ( !check_colors(dom0_colors, dom0_num_colors) )
> + {
> + printk(XENLOG_ERR "Bad LLC color config for %pd\n", d);
> + return -EINVAL;
> + }
> +
> + colors = xmalloc_array(unsigned int, dom0_num_colors);
> + if ( !colors )
> + return -ENOMEM;
> +
> + /* Static type checking */
> + (void)(colors == dom0_colors);
Btw, a means to avoid this would by to use typeof() in the declaration
of "colors".
Jan
next prev parent reply other threads:[~2024-03-19 15:31 UTC|newest]
Thread overview: 60+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-03-15 10:58 [PATCH v7 00/14] Arm cache coloring Carlo Nonato
2024-03-15 10:58 ` [PATCH v7 01/14] xen/common: add cache coloring common code Carlo Nonato
2024-03-15 11:39 ` Carlo Nonato
2024-03-19 14:58 ` Jan Beulich
2024-03-21 15:03 ` Carlo Nonato
2024-03-21 15:53 ` Jan Beulich
2024-03-21 17:22 ` Carlo Nonato
2024-03-22 7:25 ` Jan Beulich
2024-03-15 10:58 ` [PATCH v7 02/14] xen/arm: add initial support for LLC coloring on arm64 Carlo Nonato
2024-03-15 10:58 ` [PATCH v7 03/14] xen/arm: permit non direct-mapped Dom0 construction Carlo Nonato
2024-03-15 10:58 ` [PATCH v7 04/14] xen/arm: add Dom0 cache coloring support Carlo Nonato
2024-03-19 15:30 ` Jan Beulich [this message]
2024-03-21 15:04 ` Carlo Nonato
2024-03-21 15:57 ` Jan Beulich
2024-03-21 17:31 ` Carlo Nonato
2024-03-22 7:26 ` Jan Beulich
2024-03-27 11:39 ` Carlo Nonato
2024-03-27 11:56 ` Julien Grall
2024-04-05 0:20 ` Stefano Stabellini
2024-03-27 11:57 ` Michal Orzel
2024-03-19 15:45 ` Jan Beulich
2024-03-15 10:58 ` [PATCH v7 05/14] xen: extend domctl interface for cache coloring Carlo Nonato
2024-03-19 15:37 ` Jan Beulich
2024-03-21 15:11 ` Carlo Nonato
2024-03-15 10:58 ` [PATCH v7 06/14] tools: add support for cache coloring configuration Carlo Nonato
2024-03-25 10:55 ` Anthony PERARD
2024-03-25 11:44 ` Carlo Nonato
2024-03-15 10:58 ` [PATCH v7 07/14] xen/arm: add support for cache coloring configuration via device-tree Carlo Nonato
2024-03-19 15:41 ` Jan Beulich
2024-03-21 15:12 ` Carlo Nonato
2024-03-15 10:58 ` [PATCH v7 08/14] xen/page_alloc: introduce preserved page flags macro Carlo Nonato
2024-03-19 15:47 ` Jan Beulich
2024-03-21 16:07 ` Julien Grall
2024-03-21 16:10 ` Julien Grall
2024-03-21 16:22 ` Jan Beulich
2024-03-22 15:07 ` Carlo Nonato
2024-03-25 7:19 ` Jan Beulich
2024-03-26 16:39 ` Carlo Nonato
2024-03-26 17:04 ` Jan Beulich
2024-03-26 21:55 ` Julien Grall
2024-03-27 11:10 ` Carlo Nonato
2024-03-27 13:28 ` Julien Grall
2024-03-27 13:38 ` Jan Beulich
2024-03-27 13:48 ` Julien Grall
2024-03-28 18:21 ` Julien Grall
2024-03-15 10:58 ` [PATCH v7 09/14] xen/page_alloc: introduce page flag to stop buddy merging Carlo Nonato
2024-03-19 15:49 ` Jan Beulich
2024-03-15 10:58 ` [PATCH v7 10/14] xen: add cache coloring allocator for domains Carlo Nonato
2024-03-19 16:43 ` Jan Beulich
2024-03-21 15:36 ` Carlo Nonato
2024-03-21 16:03 ` Jan Beulich
2024-03-15 10:58 ` [PATCH v7 11/14] xen/arm: use domain memory to allocate p2m page tables Carlo Nonato
2024-03-15 10:59 ` [PATCH v7 12/14] xen/arm: add Xen cache colors command line parameter Carlo Nonato
2024-03-19 15:54 ` Jan Beulich
2024-03-21 15:36 ` Carlo Nonato
2024-03-15 10:59 ` [PATCH v7 13/14] xen/arm: make consider_modules() available for xen relocation Carlo Nonato
2024-03-15 10:59 ` [PATCH v7 14/14] xen/arm: add cache coloring support for Xen Carlo Nonato
2024-03-19 15:58 ` Jan Beulich
2024-03-19 16:15 ` Jan Beulich
2024-03-19 16:03 ` Jan Beulich
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=fa879713-4eee-4905-83f9-6182924cddbb@suse.com \
--to=jbeulich@suse.com \
--cc=Volodymyr_Babchuk@epam.com \
--cc=andrew.cooper3@citrix.com \
--cc=bertrand.marquis@arm.com \
--cc=carlo.nonato@minervasys.tech \
--cc=george.dunlap@citrix.com \
--cc=julien@xen.org \
--cc=marco.solieri@minervasys.tech \
--cc=michal.orzel@amd.com \
--cc=sstabellini@kernel.org \
--cc=wl@xen.org \
--cc=xen-devel@lists.xenproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.