config_tools: determine SSRAM_ENABLED automatically

Today users are able to tweak whether the hypervisor includes support to
software SRAM (SSRAM). This, however, gives rise to potential functional
incorrectness when the hypervisor is not built with such support but a
service VM attempts to assign SSRAM to a post-launched VM (which is
possible as the service VM can still see the SSRAM-related ACPI tables). In
such cases the SSRAM assigned to a post-launched VM is not properly
initialized and thus not locked in cache.

As makes little sense for a user to configure the SSRAM support in the
hypervisor in a different way as the presence of SSRAM on hardware, this
patch removes the "SSRAM support" option from the configurator. The config
tools will now automatically enable the SSRAM support if the hardware
supports the feature and disable that otherwise.

Tracked-On: #8231
Signed-off-by: Junjie Mao <junjie.mao@intel.com>
This commit is contained in:
Junjie Mao 2022-08-27 00:56:43 +08:00 committed by acrnsi-robot
parent ce5b4435bc
commit 7ce49f8c3c
5 changed files with 48 additions and 81 deletions

View File

@ -92,7 +92,6 @@ class CAT {
private CAT_REGION_INFO: any;
private switches: {
SSRAM_ENABLED: boolean,
RDT_ENABLED: boolean,
CDP_ENABLED: boolean,
VCAT_ENABLED: boolean
@ -141,7 +140,6 @@ class CAT {
formDataProxy(name, data = null, update = false) {
let path = {
'SSRAM_ENABLED': 'FEATURES.SSRAM.SSRAM_ENABLED',
'RDT_ENABLED': 'FEATURES.RDT.RDT_ENABLED',
'CDP_ENABLED': 'FEATURES.RDT.CDP_ENABLED',
'VCAT_ENABLED': 'FEATURES.RDT.VCAT_ENABLED',
@ -165,27 +163,19 @@ class CAT {
// if data is not empty, set value as expected and update CAT_INFO
if (update) {
switch (name) {
case 'SSRAM_ENABLED':
this.formDataProxy('RDT_ENABLED', 'n');
this.formDataProxy('CDP_ENABLED', 'n');
this.formDataProxy('VCAT_ENABLED', 'n');
break;
case 'RDT_ENABLED':
this.formDataProxy('SSRAM_ENABLED', 'n');
if (data === 'n') {
this.formDataProxy('CDP_ENABLED', 'n');
this.formDataProxy('VCAT_ENABLED', 'n');
}
break;
case 'CDP_ENABLED':
this.formDataProxy('SSRAM_ENABLED', 'n');
if (data === 'y') {
this.formDataProxy('RDT_ENABLED', 'y');
this.formDataProxy('VCAT_ENABLED', 'n');
}
break;
case 'VCAT_ENABLED':
this.formDataProxy('SSRAM_ENABLED', 'n');
if (data === 'y') {
this.formDataProxy('RDT_ENABLED', 'y');
this.formDataProxy('CDP_ENABLED', 'n');
@ -353,17 +343,7 @@ class CAT {
}
correctSwitches() {
if (this.switches.SSRAM_ENABLED) {
if (this.switches.RDT_ENABLED) {
this.switches.RDT_ENABLED = false
}
if (this.switches.CDP_ENABLED) {
this.switches.CDP_ENABLED = false
}
if (this.switches.VCAT_ENABLED) {
this.switches.VCAT_ENABLED = false
}
} else if (this.switches.RDT_ENABLED) {
if (this.switches.RDT_ENABLED) {
if (this.switches.CDP_ENABLED) {
if (this.switches.VCAT_ENABLED) {
this.switches.VCAT_ENABLED = false

View File

@ -2,24 +2,10 @@
<div class="py-3">
<b>Memory Isolation for Performance</b>
<div class="py-3">
<b-form-checkbox
v-model="SSRAM_ENABLED" :value="'y'" :uncheckedValue="'n'"
:disabled="RDT_ENABLED==='y'">
<n-popover trigger="hover" placement="top-start">
<template #trigger>
<IconInfo/>
</template>
<span v-html="this.SSRAMInfo.properties.SSRAM_ENABLED.description"></span>
</n-popover>
Software SRAM (for real-time apps)
</b-form-checkbox>
</div>
<div class="d-flex gap-2 flex-column">
<text>Intel Resource Director Technology</text>
<b-form-checkbox
v-model="RDT_ENABLED" :value="'y'" :uncheckedValue="'n'"
:disabled="SSRAM_ENABLED==='y'"
@click="(event)=>checkboxController('RDT_ENABLED',event)">
<n-popover trigger="hover" placement="top-start">
<template #trigger>
@ -32,7 +18,7 @@
<div class="d-flex flex-column gap-2 ps-3 pb-3">
<b-form-checkbox
v-model="CDP_ENABLED" :value="'y'" :uncheckedValue="'n'"
:disabled="SSRAM_ENABLED==='y'||VCAT_ENABLED==='y'"
:disabled="VCAT_ENABLED==='y'"
@click="(event)=>checkboxController('CDP_ENABLED',event)">
<n-popover trigger="hover" placement="top-start">
<template #trigger>
@ -44,7 +30,7 @@
</b-form-checkbox>
<b-form-checkbox
v-model="VCAT_ENABLED" :value="'y'" :uncheckedValue="'n'"
:disabled="SSRAM_ENABLED==='y'||CDP_ENABLED==='y'"
:disabled="CDP_ENABLED==='y'"
@click="(event)=>checkboxController('VCAT_ENABLED',event)">
<n-popover trigger="hover" placement="top-start">
<template #trigger>
@ -181,14 +167,6 @@ export default {
}
},
computed: {
SSRAM_ENABLED: {
get() {
return this.formDataProxy('SSRAM_ENABLED');
},
set(value) {
return this.formDataProxy('SSRAM_ENABLED', value, true);
}
},
RDT_ENABLED: {
get() {
return this.formDataProxy('RDT_ENABLED');
@ -217,7 +195,6 @@ export default {
data() {
return {
CAT_INFO: {errorMsg: null, regions: [], summary: {}},
SSRAMInfo: this.rootSchema.definitions['SSRAMInfo'],
RDTType: this.rootSchema.definitions['RDTType'],
InstructionLocation: {},
}
@ -260,7 +237,6 @@ export default {
},
formDataProxy(name, data = null, update = false) {
let path = {
'SSRAM_ENABLED': 'FEATURES.SSRAM.SSRAM_ENABLED',
'RDT_ENABLED': 'FEATURES.RDT.RDT_ENABLED',
'CDP_ENABLED': 'FEATURES.RDT.CDP_ENABLED',
'VCAT_ENABLED': 'FEATURES.RDT.VCAT_ENABLED',
@ -284,27 +260,19 @@ export default {
// if data is not empty, set value as expected and update CAT_INFO
if (update) {
switch (name) {
case 'SSRAM_ENABLED':
this.formDataProxy('RDT_ENABLED', 'n');
this.formDataProxy('CDP_ENABLED', 'n');
this.formDataProxy('VCAT_ENABLED', 'n');
break;
case 'RDT_ENABLED':
this.formDataProxy('SSRAM_ENABLED', 'n');
if (data === 'n') {
this.formDataProxy('CDP_ENABLED', 'n');
this.formDataProxy('VCAT_ENABLED', 'n');
}
break;
case 'CDP_ENABLED':
this.formDataProxy('SSRAM_ENABLED', 'n');
if (data === 'y') {
this.formDataProxy('RDT_ENABLED', 'y');
this.formDataProxy('VCAT_ENABLED', 'n');
}
break;
case 'VCAT_ENABLED':
this.formDataProxy('SSRAM_ENABLED', 'n');
if (data === 'y') {
this.formDataProxy('RDT_ENABLED', 'y');
this.formDataProxy('CDP_ENABLED', 'n');

View File

@ -25,6 +25,7 @@ class CustomParser(BaseParser):
# Bit-wise operations
'bitwise-and',
'bits-of',
'has',
'duplicate-values',
@ -41,30 +42,45 @@ OPERATORS_MAP = {
'bitwise-and': operator.and_
}
def hex_to_int(value):
if hasattr(value, 'text'):
value = value.text
if isinstance(value, int):
return value
elif isinstance(value, (float, Decimal)):
return int(value)
elif isinstance(value, str) and value.startswith("0x"):
return int(value, base=16)
else:
raise TypeError('invalid type {!r} for integer'.format(type(value)))
@method(function('bitwise-and', nargs=2))
def evaluate(self, context=None):
def to_int(value):
if isinstance(value, int):
return value
elif isinstance(value, (float, Decimal)):
return int(value)
elif isinstance(value, str) and value.startswith("0x"):
return int(value, base=16)
else:
raise TypeError('invalid type {!r} for xs:{}'.format(type(value), cls.name))
def aux(op):
op1, op2 = self.get_operands(context)
if op1 is not None and op2 is not None:
try:
return op(to_int(op1), to_int(op2))
except ValueError as err:
raise self.error('FORG0001', err) from None
except TypeError as err:
raise self.error('XPTY0004', err)
op1 = self.get_argument(context, 0)
op2 = self.get_argument(context, 1)
try:
return op(hex_to_int(op1), hex_to_int(op2))
except ValueError as err:
raise self.error('FORG0001', err) from None
except TypeError as err:
raise self.error('XPTY0004', err)
return aux(OPERATORS_MAP[self.symbol])
@method(function('bits-of', nargs=1))
def evaluate_bits_of(self, context=None):
op = self.get_argument(context)
try:
value = hex_to_int(op)
for idx, bit in enumerate(reversed(bin(value)[2:])):
if bit == '1':
yield idx
except TypeError as err:
raise self.error('XPTY0004', err)
@method(function('has', nargs=2))
def evaluate_has_function(self, context=None):
arg2 = self.get_argument(context, index=1, cls=str)

View File

@ -33,13 +33,7 @@
</xs:annotation>
</xs:assert>
<xs:assert test="not (//hv//RDT/RDT_ENABLED = 'y' and //hv//SSRAM/SSRAM_ENABLED = 'y')">
<xs:annotation acrn:severity="error" acrn:report-on="//hv//SSRAM/SSRAM_ENABLED">
<xs:documentation>The hypervisor Intel Resource Director Technology and Software SRAM settings may not be enabled at the same time.</xs:documentation>
</xs:annotation>
</xs:assert>
<xs:assert test="hv//SSRAM_ENABLED = 'n' or empty(vm[load_order ='PRE_LAUNCHED_VM' and vm_type='RTVM']) or
<xs:assert test="empty(vm[load_order ='PRE_LAUNCHED_VM' and vm_type='RTVM']) or
every $cap in caches/cache[@level=3]/capability[@id='Software SRAM'] satisfies
(compare($cap/end, '0x80000000') &lt; 0 or compare($cap/start, '0xf8000000') &gt;= 0)">
<xs:annotation acrn:severity="warning" acrn:report-on="hv//SSRAM_ENABLED">
@ -61,4 +55,13 @@ This error cannot be fixed by adjusting the configuration. Report a `GitHub issu
</xs:annotation>
</xs:assert>
<xs:assert test="every $cache in //CACHE_ALLOCATION satisfies
every $ssram in //caches/cache[@level=$cache/CACHE_LEVEL and @id=$cache/CACHE_ID]/capability[@id='Software SRAM'] satisfies
every $policy in $cache/POLICY satisfies
bitwise-and($policy/CLOS_MASK, $ssram/waymask) = 0">
<xs:annotation acrn:severity="error" acrn:report-on="/acrn-config/hv/CACHE_REGION">
<xs:documentation>VM '{$policy/VM}' vCPU '{$policy/VCPU}' cannot use chunk(s) {bits-of($ssram/waymask)} of L{$cache/CACHE_LEVEL} cache (cache ID: {$cache/CACHE_ID}) as those chunks are consumed by software SRAM. </xs:documentation>
</xs:annotation>
</xs:assert>
</xs:schema>

View File

@ -140,7 +140,7 @@
<xsl:call-template name="boolean-by-key-value">
<xsl:with-param name="key" select="'SSRAM_ENABLED'" />
<xsl:with-param name="value" select="SSRAM/SSRAM_ENABLED" />
<xsl:with-param name="value" select="count(//cache/capability[@id='Software SRAM']) > 0" />
</xsl:call-template>
<xsl:call-template name="boolean-by-key-value">