[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen master] evtchn: let evtchn_set_priority() acquire the per-channel lock
commit b76c3a1b878b1897b7166a46a8cb341ef6dfa854 Author: Jan Beulich <jbeulich@xxxxxxxx> AuthorDate: Fri Oct 23 10:12:31 2020 +0200 Commit: Jan Beulich <jbeulich@xxxxxxxx> CommitDate: Fri Oct 23 10:12:31 2020 +0200 evtchn: let evtchn_set_priority() acquire the per-channel lock Some lock wants to be held to make sure the port doesn't change state, but there's no point holding the per-domain event lock here. Switch to using the finer grained per-channel lock instead (albeit as a downside for the time being this requires disabling interrupts for a short period of time). FAOD this doesn't guarantee anything towards in particular evtchn_fifo_set_pending(), as for interdomain channels that function would be called with the remote side's per-channel lock held. Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> Reviewed-by: Roger Pau Monné <roger.pau@xxxxxxxxxx> --- xen/common/event_channel.c | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/xen/common/event_channel.c b/xen/common/event_channel.c index 37d0b75384..cd4a2c0501 100644 --- a/xen/common/event_channel.c +++ b/xen/common/event_channel.c @@ -1154,20 +1154,17 @@ static long evtchn_set_priority(const struct evtchn_set_priority *set_priority) { struct domain *d = current->domain; unsigned int port = set_priority->port; + struct evtchn *chn; long ret; - - spin_lock(&d->event_lock); + unsigned long flags; if ( !port_is_valid(d, port) ) - { - spin_unlock(&d->event_lock); return -EINVAL; - } - ret = evtchn_port_set_priority(d, evtchn_from_port(d, port), - set_priority->priority); - - spin_unlock(&d->event_lock); + chn = evtchn_from_port(d, port); + spin_lock_irqsave(&chn->lock, flags); + ret = evtchn_port_set_priority(d, chn, set_priority->priority); + spin_unlock_irqrestore(&chn->lock, flags); return ret; } -- generated by git-patchbot for /home/xen/git/xen.git#master
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |