|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 3/8] evtchn: add a hook to bind an event port to a VCPU
From: David Vrabel <david.vrabel@xxxxxxxxxx>
The upcoming FIFO-based event channel ABI will require binding ports
to a specific per-VCPU queue, so add a port op (bind_to_vcpu) for
this. Call this new op when events are bound and when they are moved
to a different VCPU.
Signed-off-by: David Vrabel <david.vrabel@xxxxxxxxxx>
---
xen/common/event_channel.c | 7 +++++++
xen/include/xen/event.h | 9 +++++++++
2 files changed, 16 insertions(+), 0 deletions(-)
diff --git a/xen/common/event_channel.c b/xen/common/event_channel.c
index b5e74d6..3a91241 100644
--- a/xen/common/event_channel.c
+++ b/xen/common/event_channel.c
@@ -236,10 +236,12 @@ static long
evtchn_bind_interdomain(evtchn_bind_interdomain_t *bind)
if ( rc )
goto out;
+ evtchn_port_bind_to_vcpu(ld, lchn, ld->vcpu[lchn->notify_vcpu_id]);
lchn->u.interdomain.remote_dom = rd;
lchn->u.interdomain.remote_port = (u16)rport;
lchn->state = ECS_INTERDOMAIN;
+ evtchn_port_bind_to_vcpu(rd, rchn, rd->vcpu[rchn->notify_vcpu_id]);
rchn->u.interdomain.remote_dom = ld;
rchn->u.interdomain.remote_port = (u16)lport;
rchn->state = ECS_INTERDOMAIN;
@@ -290,6 +292,7 @@ static long evtchn_bind_virq(evtchn_bind_virq_t *bind)
ERROR_EXIT(port);
chn = evtchn_from_port(d, port);
+ evtchn_port_bind_to_vcpu(d, chn, v);
chn->state = ECS_VIRQ;
chn->notify_vcpu_id = vcpu;
chn->u.virq = virq;
@@ -320,6 +323,7 @@ static long evtchn_bind_ipi(evtchn_bind_ipi_t *bind)
ERROR_EXIT(port);
chn = evtchn_from_port(d, port);
+ evtchn_port_bind_to_vcpu(d, chn, d->vcpu[vcpu]);
chn->state = ECS_IPI;
chn->notify_vcpu_id = vcpu;
@@ -397,6 +401,7 @@ static long evtchn_bind_pirq(evtchn_bind_pirq_t *bind)
goto out;
}
+ evtchn_port_bind_to_vcpu(d, chn, v);
chn->state = ECS_PIRQ;
chn->u.pirq.irq = pirq;
link_pirq_port(port, chn, v);
@@ -876,6 +881,8 @@ long evtchn_bind_vcpu(unsigned int port, unsigned int
vcpu_id)
rc = -EINVAL;
break;
}
+ if ( rc == 0 )
+ evtchn_port_bind_to_vcpu(d, chn, d->vcpu[vcpu_id]);
out:
spin_unlock(&d->event_lock);
diff --git a/xen/include/xen/event.h b/xen/include/xen/event.h
index 0d23e3f..9d85234 100644
--- a/xen/include/xen/event.h
+++ b/xen/include/xen/event.h
@@ -111,6 +111,8 @@ struct evtchn_port_ops {
void (*unmask)(struct domain *d, struct evtchn *evtchn);
bool_t (*is_pending)(struct domain *d, const struct evtchn *evtchn);
bool_t (*is_masked)(struct domain *d, const struct evtchn *evtchn);
+ void (*bind_to_vcpu)(struct domain *d, struct evtchn *evtchn,
+ struct vcpu *vcpu);
};
extern struct evtchn_port_ops evtchn_port_ops_2l;
@@ -142,4 +144,11 @@ static inline bool_t evtchn_port_is_masked(struct domain
*d, struct evtchn *evtc
return d->evtchn_port_ops->is_masked(d, evtchn);
}
+static inline void evtchn_port_bind_to_vcpu(struct domain *d, struct evtchn
*evtchn,
+ struct vcpu *vcpu)
+{
+ if ( d->evtchn_port_ops->bind_to_vcpu )
+ d->evtchn_port_ops->bind_to_vcpu(d, evtchn, vcpu);
+}
+
#endif /* __XEN_EVENT_H__ */
--
1.7.2.5
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |