summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Beulich <jbeulich@suse.com>2020-11-25 14:08:14 +0100
committerJan Beulich <jbeulich@suse.com>2020-11-25 14:08:14 +0100
commit181f2c224ccd0a2900d6ae94ec390a546731f593 (patch)
treed7f4a707fefc66976328f7b1e555586ca8898b36
parent500516fcb9e1c09eae9bbbd3b30bb294c6993853 (diff)
evtchn: double per-channel locking can't hit identical channels
Inter-domain channels can't possibly be bound to themselves, there's always a 2nd channel involved, even when this is a loopback into the same domain. As a result we can drop one conditional each from the two involved functions. With this, the number of evtchn_write_lock() invocations can also be shrunk by half, swapping the two incoming function arguments instead. Signed-off-by: Jan Beulich <jbeulich@suse.com> Reviewed-by: Juergen Gross <jgross@suse.com> Acked-by: Julien Grall <jgrall@amazon.com>
-rw-r--r--xen/common/event_channel.c21
1 files changed, 8 insertions, 13 deletions
diff --git a/xen/common/event_channel.c b/xen/common/event_channel.c
index 54b2e2550e..dbfba62a49 100644
--- a/xen/common/event_channel.c
+++ b/xen/common/event_channel.c
@@ -326,23 +326,18 @@ static long evtchn_alloc_unbound(evtchn_alloc_unbound_t *alloc)
static void double_evtchn_lock(struct evtchn *lchn, struct evtchn *rchn)
{
- if ( lchn <= rchn )
- {
- evtchn_write_lock(lchn);
- if ( lchn != rchn )
- evtchn_write_lock(rchn);
- }
- else
- {
- evtchn_write_lock(rchn);
- evtchn_write_lock(lchn);
- }
+ ASSERT(lchn != rchn);
+
+ if ( lchn > rchn )
+ SWAP(lchn, rchn);
+
+ evtchn_write_lock(lchn);
+ evtchn_write_lock(rchn);
}
static void double_evtchn_unlock(struct evtchn *lchn, struct evtchn *rchn)
{
- if ( lchn != rchn )
- evtchn_write_unlock(lchn);
+ evtchn_write_unlock(lchn);
evtchn_write_unlock(rchn);
}