|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v8 3/3] xen/events: do some cleanups in evtchn_fifo_set_pending()
evtchn_fifo_set_pending() can be simplified a little bit.
Suggested-by: Jan Beulich <jbeulich@xxxxxxxx>
Signed-off-by: Juergen Gross <jgross@xxxxxxxx>
---
V8:
- new patch
---
xen/common/event_fifo.c | 34 +++++++++++++++-------------------
1 file changed, 15 insertions(+), 19 deletions(-)
diff --git a/xen/common/event_fifo.c b/xen/common/event_fifo.c
index 443593c3b3..77609539b1 100644
--- a/xen/common/event_fifo.c
+++ b/xen/common/event_fifo.c
@@ -175,6 +175,18 @@ static void evtchn_fifo_set_pending(struct vcpu *v, struct
evtchn *evtchn)
return;
}
+ /*
+ * Control block not mapped. The guest must not unmask an
+ * event until the control block is initialized, so we can
+ * just drop the event.
+ */
+ if ( unlikely(!v->evtchn_fifo->control_block) )
+ {
+ printk(XENLOG_G_WARNING
+ "%pv has no FIFO event channel control block\n", v);
+ return;
+ }
+
/*
* Lock all queues related to the event channel (in case of a queue change
* this might be two).
@@ -233,25 +245,8 @@ static void evtchn_fifo_set_pending(struct vcpu *v, struct
evtchn *evtchn)
* Link the event if it unmasked and not already linked.
*/
if ( !guest_test_bit(d, EVTCHN_FIFO_MASKED, word) &&
- !guest_test_bit(d, EVTCHN_FIFO_LINKED, word) )
+ !guest_test_and_set_bit(d, EVTCHN_FIFO_LINKED, word) )
{
- event_word_t *tail_word;
-
- /*
- * Control block not mapped. The guest must not unmask an
- * event until the control block is initialized, so we can
- * just drop the event.
- */
- if ( unlikely(!v->evtchn_fifo->control_block) )
- {
- printk(XENLOG_G_WARNING
- "%pv has no FIFO event channel control block\n", v);
- goto unlock;
- }
-
- if ( guest_test_and_set_bit(d, EVTCHN_FIFO_LINKED, word) )
- goto unlock;
-
/*
* If this event was a tail, the old queue is now empty and
* its tail must be invalidated to prevent adding an event to
@@ -286,6 +281,8 @@ static void evtchn_fifo_set_pending(struct vcpu *v, struct
evtchn *evtchn)
linked = false;
if ( q->tail )
{
+ event_word_t *tail_word;
+
tail_word = evtchn_fifo_word_from_port(d, q->tail);
linked = evtchn_fifo_set_link(d, tail_word, port);
}
@@ -294,7 +291,6 @@ static void evtchn_fifo_set_pending(struct vcpu *v, struct
evtchn *evtchn)
q->tail = port;
}
- unlock:
if ( q != old_q )
spin_unlock(&old_q->lock);
spin_unlock_irqrestore(&q->lock, flags);
--
2.26.2
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |