@@ -16,8 +16,8 @@ In order to enable and use it, few steps are needed.
- If needed, change the amount of memory reserved for the buddy allocator either
from the Xen configuration file, via the CONFIG_BUDDY_ALLOCATOR_SIZE value,
or with the command line option. See `Colored allocator and buddy allocator`.
-- Assign colors to domains using the `Color selection format`_ (see
- `Coloring parameters`_ for more documentation pointers).
+- Assign colors to each memory pool (Xen, Dom0/DomUs) using the
+ `Color selection format`_ for `Coloring parameters`_ configuration.
Background
**********
@@ -110,8 +110,8 @@ Examples:
Coloring parameters
*******************
-LLC way size (as previously discussed) and Dom0 colors can be set using the
-appropriate command line parameters. See the relevant documentation in
+LLC way size (as previously discussed), Xen colors and Dom0 colors can be set
+using the appropriate command line parameters. See the relevant documentation in
"docs/misc/xen-command-line.pandoc".
DomUs colors can be set either in the xl configuration file (relative
@@ -2736,6 +2736,15 @@ In the case that x2apic is in use, this option switches between physical and
clustered mode. The default, given no hint from the **FADT**, is cluster
mode.
+### xen-colors (arm64)
+> `= List of [ <integer> | <integer>-<integer> ]`
+
+> Default: `0: the lowermost color`
+
+Specify Xen color configuration.
+Two colors are most likely needed on platforms where private caches are
+physically indexed, e.g. the L1 instruction cache of the Arm Cortex-A57.
+
### xenheap_megabytes (arm32)
> `= <size>`
@@ -31,6 +31,10 @@
#include <asm/processor.h>
#include <asm/sysregs.h>
+/* By default Xen uses the lowestmost color */
+#define XEN_DEFAULT_COLOR 0
+#define XEN_DEFAULT_NUM_COLORS 1
+
/* Size of a LLC way */
static unsigned int llc_way_size;
/* Number of colors available in the LLC */
@@ -42,6 +46,9 @@ static uint64_t addr_col_mask;
#define addr_set_color(addr, color) (((addr) & ~addr_col_mask) \
| ((color) << PAGE_SHIFT))
+static unsigned int xen_colors[CONFIG_MAX_CACHE_COLORS];
+static unsigned int xen_num_colors;
+
static unsigned int dom0_colors[CONFIG_MAX_CACHE_COLORS];
static unsigned int dom0_num_colors;
@@ -93,6 +100,12 @@ static int parse_color_config(const char *buf, unsigned int *colors,
size_param("llc-way-size", llc_way_size);
+static int __init parse_xen_colors(const char *s)
+{
+ return parse_color_config(s, xen_colors, &xen_num_colors);
+}
+custom_param("xen-colors", parse_xen_colors);
+
static int __init parse_dom0_colors(const char *s)
{
return parse_color_config(s, dom0_colors, &dom0_num_colors);
@@ -187,6 +200,8 @@ static void dump_coloring_info(unsigned char key)
printk("LLC way size: %u KiB\n", llc_way_size >> 10);
printk("Number of LLC colors supported: %u\n", max_colors);
printk("Address color mask: 0x%lx\n", addr_col_mask);
+ printk("Xen colors: ");
+ print_colors(xen_colors, xen_num_colors);
}
bool __init coloring_init(void)
@@ -204,6 +219,21 @@ bool __init coloring_init(void)
ASSERT((max_colors & (max_colors - 1)) == 0);
addr_col_mask = (max_colors - 1) << PAGE_SHIFT;
+ if ( !xen_num_colors )
+ {
+ printk(XENLOG_WARNING
+ "Xen color config not found. Using default color: %u\n",
+ XEN_DEFAULT_COLOR);
+ xen_colors[0] = XEN_DEFAULT_COLOR;
+ xen_num_colors = XEN_DEFAULT_NUM_COLORS;
+ }
+
+ if ( !check_colors(xen_colors, xen_num_colors) )
+ {
+ printk(XENLOG_ERR "Bad color config for Xen\n");
+ return false;
+ }
+
if ( !dom0_num_colors )
{
printk(XENLOG_WARNING