|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [RFC PATCH V5 08/15] evtchn: add evtchn_extended in struct domain
This field is a bitmap of currently in use extended event channel ABI, which
can have 0 (no extended event channel in use) or 1 bit set. It is manipulated
by hypervisor only, so if anything goes wrong it is a bug.
The default event channel ABI is EVTCHN_EXTENDED_NONE, which means no extended
event channel is used.
Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx>
---
xen/common/event_channel.c | 18 ++++++++++++++++--
xen/include/xen/event.h | 16 +++++++++++++++-
xen/include/xen/sched.h | 1 +
3 files changed, 32 insertions(+), 3 deletions(-)
diff --git a/xen/common/event_channel.c b/xen/common/event_channel.c
index 2f5f3de..4d02fc7 100644
--- a/xen/common/event_channel.c
+++ b/xen/common/event_channel.c
@@ -1162,6 +1162,21 @@ const static struct evtchn_port_ops evtchn_2l_ops = {
.clear_pending = evtchn_bitmap_clear_pending
};
+void evtchn_set_abi(struct domain *d, uint64_t abi)
+{
+ d->evtchn_extended = abi;
+ /* This must go after setting ABI */
+ d->max_evtchns = max_evtchns(d);
+ switch ( abi )
+ {
+ case EVTCHN_EXTENDED_NONE:
+ d->evtchn_ops = &evtchn_2l_ops;
+ break;
+ default:
+ BUG();
+ }
+}
+
int evtchn_init(struct domain *d)
{
spin_lock_init(&d->event_lock);
@@ -1169,8 +1184,7 @@ int evtchn_init(struct domain *d)
if ( get_free_port(d) != 0 )
return -EINVAL;
evtchn_from_port(d, 0)->state = ECS_RESERVED;
-
- d->evtchn_ops = &evtchn_2l_ops;
+ evtchn_set_abi(d, EVTCHN_EXTENDED_NONE);
#if MAX_VIRT_CPUS > BITS_PER_LONG
d->poll_mask = xmalloc_array(unsigned long, BITS_TO_LONGS(MAX_VIRT_CPUS));
diff --git a/xen/include/xen/event.h b/xen/include/xen/event.h
index 0ad34fe..e16fdb6 100644
--- a/xen/include/xen/event.h
+++ b/xen/include/xen/event.h
@@ -14,10 +14,20 @@
#include <xen/softirq.h>
#include <asm/bitops.h>
#include <asm/event.h>
+#include <public/event_channel.h>
static inline unsigned int max_evtchns(struct domain *d)
{
- return BITS_PER_EVTCHN_WORD(d) * BITS_PER_EVTCHN_WORD(d);
+ unsigned int ret = 0;
+ switch ( d->evtchn_extended )
+ {
+ case EVTCHN_EXTENDED_NONE:
+ ret = BITS_PER_EVTCHN_WORD(d) * BITS_PER_EVTCHN_WORD(d);
+ break;
+ default:
+ BUG();
+ }
+ return ret;
}
/*
@@ -130,4 +140,8 @@ int evtchn_bitmap_unmask(unsigned int port);
/* A bitmap of supported extended event channel ABIs */
extern uint64_t extended_event_channel;
+
+/* Set event channel ABI for a domain */
+void evtchn_set_abi(struct domain *d, uint64_t abi);
+
#endif /* __XEN_EVENT_H__ */
diff --git a/xen/include/xen/sched.h b/xen/include/xen/sched.h
index f89e9c5..dbb7217 100644
--- a/xen/include/xen/sched.h
+++ b/xen/include/xen/sched.h
@@ -271,6 +271,7 @@ struct domain
const struct evtchn_port_ops *evtchn_ops;
spinlock_t event_lock;
unsigned int max_evtchns;
+ unsigned int evtchn_extended;
struct grant_table *grant_table;
--
1.7.10.4
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |