[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 03/11] xen/arm: vpl011: Refactor evtchn_send in Xen to allow sending events from a xen bound channel
Hi Bhupinder,My knowledge is limited for this code. So I've just CCed "The REST" maintainers. Please do CC them in the future. On 02/21/2017 11:26 AM, Bhupinder Thakur wrote: Breakup evtchn_send() to allow sending events for a Xen bound channel. Currently, there is a check in evtchn_send() i.e. is_consumer_xen() that if the event channel is bound to a xen consumer then event generation is not allowed for that channel. This check is to disallow a guest from raising an event via this channel. However, it should allow Xen to send a event via this channel as it is required for sending vpl011 event to the dom0. This change introduces a new function raw_evtchn_send() which sends the event without this check. The current evtchn_send() calls this function after doing the xen consumer check. Xen uses the raw_evtchm_send() version to send the event thus bypassing the check. Signed-off-by: Bhupinder Thakur <bhupinder.thakur@xxxxxxxxxx> --- xen/common/event_channel.c | 49 ++++++++++++++++++++++++++++++++++------------ xen/include/xen/event.h | 6 ++++++ 2 files changed, 42 insertions(+), 13 deletions(-) diff --git a/xen/common/event_channel.c b/xen/common/event_channel.c index 638dc5e..4b039f3 100644 --- a/xen/common/event_channel.c +++ b/xen/common/event_channel.c @@ -27,6 +27,7 @@ #include <xen/keyhandler.h> #include <xen/event_fifo.h> #include <asm/current.h> +#include <xen/domain_page.h> Why did you include xen/domain_page.h? #include <public/xen.h> #include <public/event_channel.h> @@ -650,25 +651,21 @@ static long evtchn_close(struct domain *d1, int port1, bool_t guest) return rc; } -int evtchn_send(struct domain *ld, unsigned int lport) +int raw_evtchn_send(struct domain *ld, unsigned int lport, void *data) { struct evtchn *lchn, *rchn; struct domain *rd; - int rport, ret = 0; + int rport, ret=0; - if ( !port_is_valid(ld, lport) ) - return -EINVAL; - - lchn = evtchn_from_port(ld, lport); - - spin_lock(&lchn->lock); - - /* Guest cannot send via a Xen-attached event channel. */ - if ( unlikely(consumer_is_xen(lchn)) ) + if ( !data ) { - ret = -EINVAL; - goto out; + if ( !port_is_valid(ld, lport) ) + return -EINVAL; + lchn = evtchn_from_port(ld, lport); + spin_lock(&lchn->lock); } + else + lchn = (struct evtchn *)data; ret = xsm_evtchn_send(XSM_HOOK, ld, lchn); if ( ret ) @@ -696,6 +693,32 @@ int evtchn_send(struct domain *ld, unsigned int lport) } out: + if ( !data ) + spin_unlock(&lchn->lock); + + return ret; +} + +int evtchn_send(struct domain *ld, unsigned int lport) +{ + struct evtchn *lchn; + int ret; + + if ( !port_is_valid(ld, lport) ) + return -EINVAL; + + lchn = evtchn_from_port(ld, lport); + + spin_lock(&lchn->lock); + + if ( unlikely(consumer_is_xen(lchn)) ) + { + printk("evtchn_send failed to send via xen event channel\n"); + return -EINVAL; + } + + ret = raw_evtchn_send(ld, lport, lchn); + spin_unlock(&lchn->lock); return ret; diff --git a/xen/include/xen/event.h b/xen/include/xen/event.h index 5008c80..9bd17db 100644 --- a/xen/include/xen/event.h +++ b/xen/include/xen/event.h @@ -45,6 +45,12 @@ void send_guest_pirq(struct domain *, const struct pirq *); /* Send a notification from a given domain's event-channel port. */ int evtchn_send(struct domain *d, unsigned int lport); +/* + * This function is same as evntchn_send() except it does not do xen consumer check + * to allow the events to be sent from xen bound channels. + */ +int raw_evtchn_send(struct domain *ld, unsigned int lport, void *data); + /* Bind a local event-channel port to the specified VCPU. */ long evtchn_bind_vcpu(unsigned int port, unsigned int vcpu_id); Cheers, -- Julien Grall _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |