Hello Jan, hi all,

As discussed a couple of weeks ago, here an updated version of the 
"cache-coloring" for Jailhouse.

A short recap on what's coloring (see Documentation/cache-coloring.md):
> Cache coloring is a software technique that permits LLC partitioning,
> therefore eliminating mutual core interference, and thus guaranteeing more
> predictable performances for memory accesses.

In this version of the patch, we've tried to keep the changes in the hypervisor 
core minimal. Also, since coloring is something that should be transparent to 
inmates/VM (coloring belongs to the IPA/PA hypervisor translations), the Linux 
driver has been only minimally modified.

Coloring API
------------

The patch adds a small architecture API layer that implements coloring. The API 
is fully implemented only on arm64.  arm32 could be also a possible target for 
coloring, x86 already has CAT. Despite being implemented by only one 
architecture, having a small common API layer integrates IMHO better than other 
solutions in the main code (without adding conditionally compiled code).

The API is:
    arch_color_map_memory_region()   // cell_create
        Color-maps the memory of the cell. Coloring requires multiple passes to 
keep a contiguous VA, while "punching holes" in the PA according to the 
allocated colors.

    arch_color_unmap_memory_region() // cell_destroy
        The opposite of create: search and give back each piece of colored PA.

    arch_color_remap_to_root()       // cell_load
        Given that we don't want to modify the driver (i.e., we don't want the 
driver to do non-contiguous color-ioremap) we let the root cell believe that 
the IPAs it is ioremapping are contiguous, but in reality the PA are 
non-contiguous (colored). This is currently done by using a very high VA (IPA) 
address as "base" for the load-remap-to-root-cell operation. This value is 
configuration dependent and can be specified in the root cell to avoid 
(unlikely) conflicts.

    arch_color_unmap_from_root()     // cell_start
        Returns the mapping setup by the cell_load to the root cell.

Two APIs are implemented only by arm64:
    arm_color_dcache_flush_memory_region()  // range flushing
        Also flushing should be done in a "colored way".

    arm_color_init()                        // hook for the initialization of 
coloring
        Reads the parameters (size of the LLC way, base offset for the 
load-remapping operation) needed by coloring. There's also some debugging code 
to autodetect the cache-geometry and determine the size of the way.

Configuration
-------------

>From the configuration point of view, a colored memory region is a normal 
>memory region with a color attached. The color is expressed directly in the 
>memory region as color-bitmask and the flag JAILHOUSE_MEM_COLORED is used to 
>identify such a region. Contiguous bits in the bitmask identify a color 
>(region) to be used for the memory region. The size of the mapping doesn't 
>change due to coloring.

For example, with 16 colors, a full way size is selected by 0xffff, while 1/4 
of the way size is selected by 0x000f.

(Note: we also experimented with a different version that defined separate 
"normal" and "colored" memory regions. The approach presented in this version 
is more robust.)

Main coloring "loop"
--------------------

The coloring APIs basically boil down to a loop that appropriately selects 
--according to the color-- the physical addresses where to perform a selected 
operation. The selection is done efficiently with bit operations on the bitmask.

An alternative approach is to hook coloring deep into the mapping 
functionalities of the hypervisor. Basically, all low level mapping functions 
support coloring, and the non-colored case becomes the "special case."
This approach was not followed because to be implemented "cleanly", all the 
architecture mapping APIs have to be extended to support coloring, but only 
one-architecture then really implement it.

Instead, the implemented approach to have an additional "coloring" API 
integrates more nicely. Additionally, coloring will be hopefully only a 
transitory techniques (some years?) that could be eventually replaced by 
hardware-based techniques (e.g., MPAM). When this happens, removing the 
additional coloring API requires less rework than the other approach.


Debugging Code
--------------

The patches also provide a "debugging-only" code that can be activated by 
defining CONFIG_DEBUG (it sounded more Jailhouse-oriented than NDEBUG). In 
debugging mode, the coloring provides an autodetection for arm64 cache geometry.
Additionally, I've added an assert() function that can be used at runtime in 
debugging only contexts (could be used independently from coloring).


Feedback and comments welcome.

Best,
Andrea

Andrea Bastoni (12):
  arm-common: bitops: add most-significant-bit operation
  hypervisor, driver, archs: add basic empty infrastructure for coloring
  hypervisor: arm64: add cache coloring implementation
  hypervisor configuration: hook autodetection for coloring_way_size
  configs: arm64: add example configuration for colored ZCU102 inmate
  hypervisor: protect inclusion of control.h
  hypervisor, driver: add platform information to configure coloring
    params
  configs: arm64: hook-in coloring parameters for ZCU102
  hypervisor: provide runtime assert() helper for DEBUG only
  hypervisor: provide implementation for __assert_fail() and group
    panic-related functions
  hypervisor: coloring: use assert instead of "BUG"
  hypervisor: coloring: make cache autodetection debug-only

Luca Miccio (2):
  Documentation: add description and usage of cache coloring support
  pyjailhouse: add support for colored regions

 Documentation/cache-coloring.md               | 198 ++++++++++++++++++
 configs/arm64/zynqmp-zcu102-inmate-demo-col.c |  75 +++++++
 configs/arm64/zynqmp-zcu102.c                 |   6 +
 driver/cell.c                                 |  10 +-
 driver/cell.h                                 |   1 +
 driver/main.c                                 |  12 ++
 hypervisor/Makefile                           |   2 +-
 hypervisor/arch/arm-common/control.c          |   1 +
 .../arch/arm-common/include/asm/bitops.h      |  10 +
 .../arch/arm-common/include/asm/dcaches.h     |   8 +
 hypervisor/arch/arm-common/mmu_cell.c         |  52 +++--
 hypervisor/arch/arm/control.c                 |   1 +
 hypervisor/arch/arm/include/asm/coloring.h    |  59 ++++++
 hypervisor/arch/arm/traps.c                   |   1 +
 hypervisor/arch/arm64/Kbuild                  |   5 +
 hypervisor/arch/arm64/cache_layout.c          | 148 +++++++++++++
 hypervisor/arch/arm64/coloring.c              | 184 ++++++++++++++++
 hypervisor/arch/arm64/control.c               |   1 +
 .../arch/arm64/include/asm/cache_layout.h     |  21 ++
 hypervisor/arch/arm64/include/asm/coloring.h  | 137 ++++++++++++
 hypervisor/arch/arm64/setup.c                 |   3 +
 hypervisor/arch/arm64/traps.c                 |   1 +
 hypervisor/arch/x86/amd_iommu.c               |   1 +
 hypervisor/arch/x86/control.c                 |   1 +
 hypervisor/arch/x86/efifb.c                   |   1 +
 hypervisor/arch/x86/include/asm/coloring.h    |  45 ++++
 hypervisor/arch/x86/ioapic.c                  |   1 +
 hypervisor/arch/x86/svm.c                     |   1 +
 hypervisor/arch/x86/vmx.c                     |   1 +
 hypervisor/control.c                          | 111 ++++------
 hypervisor/include/jailhouse/assert.h         |  37 ++++
 hypervisor/include/jailhouse/control.h        |  34 +--
 hypervisor/include/jailhouse/panic.h          |  40 ++++
 hypervisor/include/jailhouse/printk.h         |   4 +
 hypervisor/panic.c                            |  86 ++++++++
 hypervisor/pci.c                              |   1 +
 hypervisor/printk.c                           |   1 +
 hypervisor/uart.c                             |   1 +
 include/jailhouse/cell-config.h               |  11 +
 pyjailhouse/config_parser.py                  |   9 +-
 40 files changed, 1201 insertions(+), 121 deletions(-)
 create mode 100644 Documentation/cache-coloring.md
 create mode 100644 configs/arm64/zynqmp-zcu102-inmate-demo-col.c
 create mode 100644 hypervisor/arch/arm/include/asm/coloring.h
 create mode 100644 hypervisor/arch/arm64/cache_layout.c
 create mode 100644 hypervisor/arch/arm64/coloring.c
 create mode 100644 hypervisor/arch/arm64/include/asm/cache_layout.h
 create mode 100644 hypervisor/arch/arm64/include/asm/coloring.h
 create mode 100644 hypervisor/arch/x86/include/asm/coloring.h
 create mode 100644 hypervisor/include/jailhouse/assert.h
 create mode 100644 hypervisor/include/jailhouse/panic.h
 create mode 100644 hypervisor/panic.c

-- 
2.29.2

-- 
You received this message because you are subscribed to the Google Groups 
"Jailhouse" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/jailhouse-dev/20201123204613.252563-1-andrea.bastoni%40tum.de.

Reply via email to