|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 11/16] x86/monitor: fix: treat -monitor- properly, as a subsys of the vm-event subsys
As it can be seen looking @ the vm_event_per_domain structure, there are 3
defined vm-event subsystems: share, paging and monitor. In a number of places in
the codebase, the monitor vm-events subsystem is mistakenly confounded with the
vm-event subsystem as a whole: i.e. it is wrongfully checked if v->arch.vm_event
is allocated to determine if the monitor subsystem is initialized.
To fix that, add an 'initialised' bit in d->monitor which will determine if the
monitor subsystem is initialised, create an inline stub
monitor_domain_initialised() and use that instead where it applies.
Signed-off-by: Corneliu ZUZU <czuzu@xxxxxxxxxxxxxxx>
---
xen/arch/x86/hvm/emulate.c | 3 ++-
xen/arch/x86/hvm/hvm.c | 10 +++++-----
xen/arch/x86/monitor.c | 3 +++
xen/include/asm-arm/monitor.h | 3 ++-
xen/include/asm-x86/monitor.h | 9 ++++-----
xen/include/xen/monitor.h | 11 +++++++----
xen/include/xen/sched.h | 1 +
7 files changed, 24 insertions(+), 16 deletions(-)
diff --git a/xen/arch/x86/hvm/emulate.c b/xen/arch/x86/hvm/emulate.c
index 855af4d..a0094e9 100644
--- a/xen/arch/x86/hvm/emulate.c
+++ b/xen/arch/x86/hvm/emulate.c
@@ -12,6 +12,7 @@
#include <xen/config.h>
#include <xen/init.h>
#include <xen/lib.h>
+#include <xen/monitor.h>
#include <xen/sched.h>
#include <xen/paging.h>
#include <xen/trace.h>
@@ -73,7 +74,7 @@ static int set_context_data(void *buffer, unsigned int size)
{
struct vcpu *curr = current;
- if ( curr->arch.vm_event )
+ if ( unlikely(monitor_domain_initialised(curr->domain)) )
{
unsigned int safe_size =
min(size, curr->arch.vm_event->emul_read_data.size);
diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c
index 79ba185..46fed33 100644
--- a/xen/arch/x86/hvm/hvm.c
+++ b/xen/arch/x86/hvm/hvm.c
@@ -471,7 +471,7 @@ void hvm_do_resume(struct vcpu *v)
if ( !handle_hvm_io_completion(v) )
return;
- if ( unlikely(v->arch.vm_event) )
+ if ( unlikely(monitor_domain_initialised(v->domain)) )
{
if ( unlikely(v->arch.vm_event->emulate_flags) )
{
@@ -2176,7 +2176,7 @@ int hvm_set_cr0(unsigned long value, bool_t may_defer)
if ( may_defer && unlikely(v->domain->arch.monitor.write_ctrlreg_enabled &
monitor_ctrlreg_bitmask(VM_EVENT_X86_CR0)) )
{
- ASSERT(v->arch.vm_event);
+ ASSERT(monitor_domain_initialised(v->domain));
if ( hvm_monitor_crX(CR0, value, old_value) )
{
@@ -2281,7 +2281,7 @@ int hvm_set_cr3(unsigned long value, bool_t may_defer)
if ( may_defer && unlikely(v->domain->arch.monitor.write_ctrlreg_enabled &
monitor_ctrlreg_bitmask(VM_EVENT_X86_CR3)) )
{
- ASSERT(v->arch.vm_event);
+ ASSERT(monitor_domain_initialised(v->domain));
if ( hvm_monitor_crX(CR3, value, old) )
{
@@ -2364,7 +2364,7 @@ int hvm_set_cr4(unsigned long value, bool_t may_defer)
if ( may_defer && unlikely(v->domain->arch.monitor.write_ctrlreg_enabled &
monitor_ctrlreg_bitmask(VM_EVENT_X86_CR4)) )
{
- ASSERT(v->arch.vm_event);
+ ASSERT(monitor_domain_initialised(v->domain));
if ( hvm_monitor_crX(CR4, value, old_cr) )
{
@@ -3748,7 +3748,7 @@ int hvm_msr_write_intercept(unsigned int msr, uint64_t
msr_content,
if ( may_defer && unlikely(monitored_msr(v->domain, msr)) )
{
- ASSERT(v->arch.vm_event);
+ ASSERT(monitor_domain_initialised(v->domain));
/*
* The actual write will occur in monitor_ctrlreg_write_data(), if
diff --git a/xen/arch/x86/monitor.c b/xen/arch/x86/monitor.c
index aeee435..4a29cad 100644
--- a/xen/arch/x86/monitor.c
+++ b/xen/arch/x86/monitor.c
@@ -62,6 +62,8 @@ int monitor_init_domain(struct domain *d)
return -ENOMEM;
}
+ d->monitor.initialised = 1;
+
return 0;
}
@@ -78,6 +80,7 @@ void monitor_cleanup_domain(struct domain *d)
memset(&d->arch.monitor, 0, sizeof(d->arch.monitor));
memset(&d->monitor, 0, sizeof(d->monitor));
+ d->monitor.initialised = 0;
}
void monitor_ctrlreg_write_resume(struct vcpu *v, vm_event_response_t *rsp)
diff --git a/xen/include/asm-arm/monitor.h b/xen/include/asm-arm/monitor.h
index 9a9734a..7ef30f1 100644
--- a/xen/include/asm-arm/monitor.h
+++ b/xen/include/asm-arm/monitor.h
@@ -48,13 +48,14 @@ int arch_monitor_domctl_event(struct domain *d,
static inline int monitor_init_domain(struct domain *d)
{
- /* No arch-specific domain initialization on ARM. */
+ d->monitor.initialised = 1;
return 0;
}
static inline void monitor_cleanup_domain(struct domain *d)
{
memset(&d->monitor, 0, sizeof(d->monitor));
+ d->monitor.initialised = 0;
}
static inline
diff --git a/xen/include/asm-x86/monitor.h b/xen/include/asm-x86/monitor.h
index 3ae24dd..4014f8d 100644
--- a/xen/include/asm-x86/monitor.h
+++ b/xen/include/asm-x86/monitor.h
@@ -22,6 +22,7 @@
#ifndef __ASM_X86_MONITOR_H__
#define __ASM_X86_MONITOR_H__
+#include <xen/monitor.h>
#include <xen/sched.h>
#define monitor_ctrlreg_bitmask(ctrlreg_index) (1U << (ctrlreg_index))
@@ -41,11 +42,9 @@ int arch_monitor_domctl_op(struct domain *d, struct
xen_domctl_monitor_op *mop)
{
case XEN_DOMCTL_MONITOR_OP_EMULATE_EACH_REP:
domain_pause(d);
- /*
- * Enabling mem_access_emulate_each_rep without a vm_event subscriber
- * is meaningless.
- */
- if ( d->max_vcpus && d->vcpu[0] && d->vcpu[0]->arch.vm_event )
+
+ /* Meaningless without a monitor vm-events subscriber. */
+ if ( likely(monitor_domain_initialised(d)) )
d->arch.mem_access_emulate_each_rep = !!mop->event;
else
rc = -EINVAL;
diff --git a/xen/include/xen/monitor.h b/xen/include/xen/monitor.h
index 2171d04..605caf0 100644
--- a/xen/include/xen/monitor.h
+++ b/xen/include/xen/monitor.h
@@ -22,12 +22,15 @@
#ifndef __XEN_MONITOR_H__
#define __XEN_MONITOR_H__
-#include <public/vm_event.h>
-
-struct domain;
-struct xen_domctl_monitor_op;
+#include <xen/sched.h>
int monitor_domctl(struct domain *d, struct xen_domctl_monitor_op *op);
+
+static inline bool_t monitor_domain_initialised(const struct domain *d)
+{
+ return d->monitor.initialised;
+}
+
void monitor_guest_request(void);
int monitor_traps(struct vcpu *v, bool_t sync, vm_event_request_t *req);
diff --git a/xen/include/xen/sched.h b/xen/include/xen/sched.h
index 46c82e7..e6bd13f 100644
--- a/xen/include/xen/sched.h
+++ b/xen/include/xen/sched.h
@@ -472,6 +472,7 @@ struct domain
struct {
unsigned int guest_request_enabled : 1;
unsigned int guest_request_sync : 1;
+ unsigned int initialised : 1;
} monitor;
};
--
2.5.0
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |