[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 01d0b77..d0fbe82 100644 --- a/xen/common/event_channel.c +++ b/xen/common/event_channel.c @@ -237,10 +237,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; @@ -291,6 +293,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; @@ -321,6 +324,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; @@ -398,6 +402,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); @@ -877,6 +882,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 208f7bd..05d8091 100644 --- a/xen/include/xen/event.h +++ b/xen/include/xen/event.h @@ -115,6 +115,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); }; static inline void evtchn_port_set_pending(struct vcpu *v, struct evtchn *evtchn) @@ -145,4 +147,11 @@ static inline bool_t evtchn_port_is_masked(struct domain *d, 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 |