From 6e78f81a2761d175f82551b1cbcdad6d53392bec Mon Sep 17 00:00:00 2001 From: Stefano Stabellini Date: Wed, 16 Nov 2011 15:17:37 +0000 Subject: hvm: introduce HVM_PARAM_BUFIOREQ_EVTCHN Introduce an event channel for buffered io event notifications, advertise the port number using an hvm param. This way the device model is not forced to check the buffered io page for data several times a second for the entire life of the VM (buffered io is mostly used for stdvga emulation in Xen that is switched off after the guest goes into graphical mode). Signed-off-by: Stefano Stabellini Committed-by: Keir Fraser --- xen/arch/x86/hvm/hvm.c | 13 +++++++++++++ xen/arch/x86/hvm/io.c | 2 ++ xen/include/public/hvm/params.h | 3 ++- 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c index b118195c94..29452a2daf 100644 --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -985,6 +985,16 @@ int hvm_vcpu_initialise(struct vcpu *v) /* Register ioreq event channel. */ v->arch.hvm_vcpu.xen_port = rc; + + if ( v->vcpu_id == 0 ) + { + /* Create bufioreq event channel. */ + rc = alloc_unbound_xen_event_channel(v, 0); + if ( rc < 0 ) + goto fail2; + v->domain->arch.hvm_domain.params[HVM_PARAM_BUFIOREQ_EVTCHN] = rc; + } + spin_lock(&v->domain->arch.hvm_domain.ioreq.lock); if ( v->domain->arch.hvm_domain.ioreq.va != NULL ) get_ioreq(v)->vp_eport = v->arch.hvm_vcpu.xen_port; @@ -3597,6 +3607,9 @@ long do_hvm_op(unsigned long op, XEN_GUEST_HANDLE(void) arg) if ( rc == 0 ) rc = nestedhvm_vcpu_initialise(v); break; + case HVM_PARAM_BUFIOREQ_EVTCHN: + rc = -EINVAL; + break; } if ( rc == 0 ) diff --git a/xen/arch/x86/hvm/io.c b/xen/arch/x86/hvm/io.c index 7ebefc7460..41a2edea50 100644 --- a/xen/arch/x86/hvm/io.c +++ b/xen/arch/x86/hvm/io.c @@ -118,6 +118,8 @@ int hvm_buffered_io_send(ioreq_t *p) wmb(); pg->write_pointer += qw ? 2 : 1; + notify_via_xen_event_channel(v->domain, + v->domain->arch.hvm_domain.params[HVM_PARAM_BUFIOREQ_EVTCHN]); spin_unlock(&iorp->lock); return 1; diff --git a/xen/include/public/hvm/params.h b/xen/include/public/hvm/params.h index 1c5a1a9964..6699788eae 100644 --- a/xen/include/public/hvm/params.h +++ b/xen/include/public/hvm/params.h @@ -52,6 +52,7 @@ #define HVM_PARAM_IOREQ_PFN 5 #define HVM_PARAM_BUFIOREQ_PFN 6 +#define HVM_PARAM_BUFIOREQ_EVTCHN 26 #ifdef __ia64__ @@ -141,6 +142,6 @@ /* Boolean: Enable nestedhvm (hvm only) */ #define HVM_PARAM_NESTEDHVM 24 -#define HVM_NR_PARAMS 26 +#define HVM_NR_PARAMS 27 #endif /* __XEN_PUBLIC_HVM_PARAMS_H__ */ -- cgit v1.2.3