Message ID | 20220304174701.1453977-10-marco.solieri@minervasys.tech (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Arm cache coloring | expand |
On 04.03.2022 18:46, Marco Solieri wrote: > From: Luca Miccio <lucmiccio@gmail.com> > > When cache coloring support is enabled, a color assignment is needed for > every domain. Introduce a function computing a default configuration > with a safe and common value -- the dom0 color selection. > > Do not access directly the array of color indices of dom0. Instead make > use of the dom0 color configuration as a bitmask. > Add a helper function that converts the color configuration bitmask into > the indices array. > > Signed-off-by: Luca Miccio <lucmiccio@gmail.com> > Signed-off-by: Marco Solieri <marco.solieri@minervasys.tech> Nit (but relevant because it might be misguiding people just glancing over the series): Did you mean "xen/arm:" rather than "xen/arch:" in the title here as well as in that of the next patch? Jan > --- > xen/arch/arm/coloring.c | 36 +++++++++++++++++++++++++++++ > xen/arch/arm/include/asm/coloring.h | 7 ++++++ > 2 files changed, 43 insertions(+) > > diff --git a/xen/arch/arm/coloring.c b/xen/arch/arm/coloring.c > index af75b536a7..f6e6d09477 100644 > --- a/xen/arch/arm/coloring.c > +++ b/xen/arch/arm/coloring.c > @@ -143,6 +143,42 @@ static __init uint64_t calculate_addr_col_mask(uint64_t llc_way_size) > return addr_col_mask; > } > > +static int copy_mask_to_list( > + uint32_t *col_mask, uint32_t *col_list, uint64_t col_num) > +{ > + unsigned int i, k, c; > + > + if ( !col_list ) > + return -EINVAL; > + > + for ( i = 0, k = 0; i < MAX_COLORS_CELLS; i++ ) > + for ( c = 0; k < col_num && c < 32; c++ ) > + if ( col_mask[i] & (1 << (c + (i*32))) ) > + col_list[k++] = c + (i * 32); > + > + return 0; > +} > + > +uint32_t *setup_default_colors(uint32_t *col_num) > +{ > + uint32_t *col_list; > + > + if ( dom0_col_num ) > + { > + *col_num = dom0_col_num; > + col_list = xzalloc_array(uint32_t, dom0_col_num); > + if ( !col_list ) > + { > + printk(XENLOG_ERR "setup_default_colors: Alloc failed\n"); > + return NULL; > + } > + copy_mask_to_list(dom0_col_mask, col_list, dom0_col_num); > + return col_list; > + } > + > + return NULL; > +} > + > bool __init coloring_init(void) > { > int i; > diff --git a/xen/arch/arm/include/asm/coloring.h b/xen/arch/arm/include/asm/coloring.h > index 70e1dbd09b..8f24acf082 100644 > --- a/xen/arch/arm/include/asm/coloring.h > +++ b/xen/arch/arm/include/asm/coloring.h > @@ -27,6 +27,13 @@ > > #ifdef CONFIG_COLORING > bool __init coloring_init(void); > + > +/* > + * Return an array with default colors selection and store the number of > + * colors in @param col_num. The array selection will be equal to the dom0 > + * color configuration. > + */ > +uint32_t *setup_default_colors(uint32_t *col_num); > #else /* !CONFIG_COLORING */ > static inline bool __init coloring_init(void) > {
diff --git a/xen/arch/arm/coloring.c b/xen/arch/arm/coloring.c index af75b536a7..f6e6d09477 100644 --- a/xen/arch/arm/coloring.c +++ b/xen/arch/arm/coloring.c @@ -143,6 +143,42 @@ static __init uint64_t calculate_addr_col_mask(uint64_t llc_way_size) return addr_col_mask; } +static int copy_mask_to_list( + uint32_t *col_mask, uint32_t *col_list, uint64_t col_num) +{ + unsigned int i, k, c; + + if ( !col_list ) + return -EINVAL; + + for ( i = 0, k = 0; i < MAX_COLORS_CELLS; i++ ) + for ( c = 0; k < col_num && c < 32; c++ ) + if ( col_mask[i] & (1 << (c + (i*32))) ) + col_list[k++] = c + (i * 32); + + return 0; +} + +uint32_t *setup_default_colors(uint32_t *col_num) +{ + uint32_t *col_list; + + if ( dom0_col_num ) + { + *col_num = dom0_col_num; + col_list = xzalloc_array(uint32_t, dom0_col_num); + if ( !col_list ) + { + printk(XENLOG_ERR "setup_default_colors: Alloc failed\n"); + return NULL; + } + copy_mask_to_list(dom0_col_mask, col_list, dom0_col_num); + return col_list; + } + + return NULL; +} + bool __init coloring_init(void) { int i; diff --git a/xen/arch/arm/include/asm/coloring.h b/xen/arch/arm/include/asm/coloring.h index 70e1dbd09b..8f24acf082 100644 --- a/xen/arch/arm/include/asm/coloring.h +++ b/xen/arch/arm/include/asm/coloring.h @@ -27,6 +27,13 @@ #ifdef CONFIG_COLORING bool __init coloring_init(void); + +/* + * Return an array with default colors selection and store the number of + * colors in @param col_num. The array selection will be equal to the dom0 + * color configuration. + */ +uint32_t *setup_default_colors(uint32_t *col_num); #else /* !CONFIG_COLORING */ static inline bool __init coloring_init(void) {