mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 02:30:03 +01:00
Clean up event-channel notification code in Xen.
Signed-off-by: Keir Fraser <keir@xensource.com>
This commit is contained in:
1 parent
4afea39c56
commit
a606f89f0e
5 files changed
+32
-26
No files matched your search
@@ -587,6 +587,14 @@ void vcpu_pend_interrupt(VCPU *vcpu, UINT64 vector)
|
||||
set_bit(vector,PSCBX(vcpu,irr));
|
||||
PSCB(vcpu,pending_interruption) = 1;
|
||||
}
|
||||
|
||||
/* Keir: I think you should unblock when an interrupt is pending. */
|
||||
{
|
||||
int running = test_bit(_VCPUF_running, &vcpu->vcpu_flags);
|
||||
vcpu_unblock(vcpu);
|
||||
if ( running )
|
||||
smp_send_event_check_cpu(vcpu->processor);
|
||||
}
|
||||
}
|
||||
|
||||
void early_tick(VCPU *vcpu)
|
||||
|
||||
@@ -95,6 +95,7 @@
|
||||
#include <xen/irq.h>
|
||||
#include <xen/softirq.h>
|
||||
#include <xen/domain_page.h>
|
||||
#include <xen/event.h>
|
||||
#include <asm/shadow.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/flushtlb.h>
|
||||
|
||||
@@ -11,6 +11,19 @@
|
||||
|
||||
static inline void evtchn_notify(struct vcpu *v)
|
||||
{
|
||||
/*
|
||||
* NB1. 'vcpu_flags' and 'processor' must be checked /after/ update of
|
||||
* pending flag. These values may fluctuate (after all, we hold no
|
||||
* locks) but the key insight is that each change will cause
|
||||
* evtchn_upcall_pending to be polled.
|
||||
*
|
||||
* NB2. We save VCPUF_running across the unblock to avoid a needless
|
||||
* IPI for domains that we IPI'd to unblock.
|
||||
*/
|
||||
int running = test_bit(_VCPUF_running, &v->vcpu_flags);
|
||||
vcpu_unblock(v);
|
||||
if ( running )
|
||||
smp_send_event_check_cpu(v->processor);
|
||||
}
|
||||
|
||||
#endif
|
||||
+7
-22
@@ -26,30 +26,14 @@ static inline void evtchn_set_pending(struct vcpu *v, int port)
|
||||
{
|
||||
struct domain *d = v->domain;
|
||||
shared_info_t *s = d->shared_info;
|
||||
int running;
|
||||
|
||||
/* These three operations must happen in strict order. */
|
||||
/* These four operations must happen in strict order. */
|
||||
if ( !test_and_set_bit(port, &s->evtchn_pending[0]) &&
|
||||
!test_bit (port, &s->evtchn_mask[0]) &&
|
||||
!test_and_set_bit(port>>5, &v->vcpu_info->evtchn_pending_sel) )
|
||||
!test_and_set_bit(port>>5, &v->vcpu_info->evtchn_pending_sel) &&
|
||||
!test_and_set_bit(0, &v->vcpu_info->evtchn_upcall_pending) )
|
||||
{
|
||||
/* The VCPU pending flag must be set /after/ update to evtchn-pend. */
|
||||
set_bit(0, &v->vcpu_info->evtchn_upcall_pending);
|
||||
evtchn_notify(v);
|
||||
|
||||
/*
|
||||
* NB1. 'vcpu_flags' and 'processor' must be checked /after/ update of
|
||||
* pending flag. These values may fluctuate (after all, we hold no
|
||||
* locks) but the key insight is that each change will cause
|
||||
* evtchn_upcall_pending to be polled.
|
||||
*
|
||||
* NB2. We save VCPUF_running across the unblock to avoid a needless
|
||||
* IPI for domains that we IPI'd to unblock.
|
||||
*/
|
||||
running = test_bit(_VCPUF_running, &v->vcpu_flags);
|
||||
vcpu_unblock(v);
|
||||
if ( running )
|
||||
smp_send_event_check_cpu(v->processor);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -73,8 +57,9 @@ static inline void send_guest_virq(struct vcpu *v, int virq)
|
||||
*/
|
||||
extern void send_guest_pirq(struct domain *d, int pirq);
|
||||
|
||||
#define event_pending(_d) \
|
||||
((_d)->vcpu_info->evtchn_upcall_pending && \
|
||||
!(_d)->vcpu_info->evtchn_upcall_mask)
|
||||
/* Note: Bitwise operations result in fast code with no branches. */
|
||||
#define event_pending(v) \
|
||||
((v)->vcpu_info->evtchn_upcall_pending & \
|
||||
~(v)->vcpu_info->evtchn_upcall_mask)
|
||||
|
||||
#endif /* __XEN_EVENT_H__ */
|
||||
@@ -297,10 +297,9 @@ unsigned long __hypercall_create_continuation(
|
||||
(unsigned long)(_a1), (unsigned long)(_a2), (unsigned long)(_a3), \
|
||||
(unsigned long)(_a4), (unsigned long)(_a5), (unsigned long)(_a6))
|
||||
|
||||
#define hypercall_preempt_check() (unlikely( \
|
||||
softirq_pending(smp_processor_id()) | \
|
||||
(!!current->vcpu_info->evtchn_upcall_pending & \
|
||||
!current->vcpu_info->evtchn_upcall_mask) \
|
||||
#define hypercall_preempt_check() (unlikely( \
|
||||
softirq_pending(smp_processor_id()) | \
|
||||
event_pending(current) \
|
||||
))
|
||||
|
||||
/* This domain_hash and domain_list are protected by the domlist_lock. */
|
||||
|
||||