mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
x86/hvm: fix BUFIOREQ evtchn init for a stubdom
This is a missing part from the previous patch that add the BUFIOREQ_EVTCHN parameter. This patch changes the ownership of the buifioreq event channel to the stubdom (when HVM_PARAM_DM_DOMAIN is set within the stubdom). This patch introduces an helper to replace a xen port. This fix the initialization of QEMU inside the stubdomain. Signed-off-by: Anthony PERARD <anthony.perard@citrix.com> Add error handling to first invocation of hvm_replace_event_channel(). Adjust type of hvm_replace_event_channel()'s second parameter. Signed-off-by: Jan Beulich <jbeulich@suse.com> Committed-by: Jan Beulich <jbeulich@suse.com>
This commit is contained in:
1 parent
817dbc6f30
commit
1efe5e116a
1 file changed
+28
-10
+28
-10
@@ -3664,6 +3664,21 @@ static int hvmop_flush_tlb_all(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int hvm_replace_event_channel(struct vcpu *v, domid_t remote_domid,
|
||||
int *p_port)
|
||||
{
|
||||
int old_port, new_port;
|
||||
|
||||
new_port = alloc_unbound_xen_event_channel(v, remote_domid, NULL);
|
||||
if ( new_port < 0 )
|
||||
return new_port;
|
||||
|
||||
/* xchg() ensures that only we call free_xen_event_channel(). */
|
||||
old_port = xchg(p_port, new_port);
|
||||
free_xen_event_channel(v, old_port);
|
||||
return 0;
|
||||
}
|
||||
|
||||
long do_hvm_op(unsigned long op, XEN_GUEST_HANDLE(void) arg)
|
||||
|
||||
{
|
||||
@@ -3774,20 +3789,23 @@ long do_hvm_op(unsigned long op, XEN_GUEST_HANDLE(void) arg)
|
||||
|
||||
rc = 0;
|
||||
domain_pause(d); /* safe to change per-vcpu xen_port */
|
||||
if ( d->vcpu[0] )
|
||||
rc = hvm_replace_event_channel(d->vcpu[0], a.value,
|
||||
(int *)&d->vcpu[0]->domain->arch.hvm_domain.params
|
||||
[HVM_PARAM_BUFIOREQ_EVTCHN]);
|
||||
if ( rc )
|
||||
{
|
||||
domain_unpause(d);
|
||||
break;
|
||||
}
|
||||
iorp = &d->arch.hvm_domain.ioreq;
|
||||
for_each_vcpu ( d, v )
|
||||
{
|
||||
int old_port, new_port;
|
||||
new_port = alloc_unbound_xen_event_channel(
|
||||
v, a.value, NULL);
|
||||
if ( new_port < 0 )
|
||||
{
|
||||
rc = new_port;
|
||||
rc = hvm_replace_event_channel(v, a.value,
|
||||
&v->arch.hvm_vcpu.xen_port);
|
||||
if ( rc )
|
||||
break;
|
||||
}
|
||||
/* xchg() ensures that only we free_xen_event_channel() */
|
||||
old_port = xchg(&v->arch.hvm_vcpu.xen_port, new_port);
|
||||
free_xen_event_channel(v, old_port);
|
||||
|
||||
spin_lock(&iorp->lock);
|
||||
if ( iorp->va != NULL )
|
||||
get_ioreq(v)->vp_eport = v->arch.hvm_vcpu.xen_port;
|
||||
|
||||