x86/vtx: Allow runtime modification of the exec-sp setting

See patch for details.

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: George Dunlap <george.dunlap@citrix.com>
This commit is contained in:
Andrew Cooper committed 2019-11-12 17:12:54 +00:00
1 parent 59e89cdabc
commit 0cafb89ae6
3 files changed
+57 -2

No files matched your search

+15
View File
@@ -959,6 +959,21 @@ introduced with the Nehalem architecture.
If HVM guest kernels are trusted not to mount a DoS against the system,
this option can enabled to regain performance.
This boolean may be modified at runtime using `xl set-parameters
ept=[no-]exec-sp` to switch between fast and secure.
* When switching from secure to fast, preexisting HVM domains will run
at their current performance until they are rebooted; new domains will
run without any overhead.
* When switching from fast to secure, all HVM domains will immediately
suffer a performance penalty.
**Warning: No guarantee is made that this runtime option will be retained
indefinitely, or that it will retain this exact behaviour. It is
intended as an emergency option for people who first chose fast, then
change their minds to secure, and wish not to reboot.**
### extra_guest_irqs
> `= [<domU number>][,<dom0 number>]`
+35
View File
@@ -95,6 +95,41 @@ static int __init parse_ept_param(const char *s)
}
custom_param("ept", parse_ept_param);
static int parse_ept_param_runtime(const char *s)
{
int val;
if ( !cpu_has_vmx_ept || !hvm_funcs.hap_supported ||
!(hvm_funcs.hap_capabilities &
(HVM_HAP_SUPERPAGE_2MB | HVM_HAP_SUPERPAGE_1GB)) )
{
printk("VMX: EPT not available, or not in use - ignoring\n");
return 0;
}
if ( (val = parse_boolean("exec-sp", s, NULL)) < 0 )
return -EINVAL;
if ( val != opt_ept_exec_sp )
{
struct domain *d;
opt_ept_exec_sp = val;
rcu_read_lock(&domlist_read_lock);
for_each_domain ( d )
if ( paging_mode_hap(d) )
p2m_change_entry_type_global(d, p2m_ram_rw, p2m_ram_rw);
rcu_read_unlock(&domlist_read_lock);
}
printk("VMX: EPT executable superpages %sabled\n",
val ? "en" : "dis");
return 0;
}
custom_runtime_only_param("ept", parse_ept_param_runtime);
/* Dynamic (run-time adjusted) execution control flags. */
u32 vmx_pin_based_exec_control __read_mostly;
u32 vmx_cpu_based_exec_control __read_mostly;
+7 -2
View File
@@ -289,15 +289,20 @@ static void change_entry_type_global(struct p2m_domain *p2m,
p2m_type_t ot, p2m_type_t nt)
{
p2m->change_entry_type_global(p2m, ot, nt);
p2m->global_logdirty = (nt == p2m_ram_logdirty);
/* Don't allow 'recalculate' operations to change the logdirty state. */
if ( ot != nt )
p2m->global_logdirty = (nt == p2m_ram_logdirty);
}
/*
* May be called with ot = nt = p2m_ram_rw for its side effect of
* recalculating all PTEs in the p2m.
*/
void p2m_change_entry_type_global(struct domain *d,
p2m_type_t ot, p2m_type_t nt)
{
struct p2m_domain *hostp2m = p2m_get_hostp2m(d);
ASSERT(ot != nt);
ASSERT(p2m_is_changeable(ot) && p2m_is_changeable(nt));
p2m_lock(hostp2m);
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.