|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH xenbus 8/8] Add XENBUS_SHARED_INFO method to check whether event upcalls are supported
From: Paul Durrant <pdurrant@xxxxxxxxxx>
Upcalls can only be supported on a vCPU that has a vcpu_info structure
available to Xen; that is one with a vcpu_id < XEN_LEGACY_MAX_VCPUS (32) or
one that has explicitly registered a vcpu_info. This is determined during
SharedInfoAcquire() but the information needs to be avalable to the code in
evtchn.c. Hence this patch adds a new 'UpcallSupported' method to
XENBUS_SHARED_INFO (consequently bumping the interface version to 3).
Signed-off-by: Paul Durrant <pdurrant@xxxxxxxxxx>
---
include/revision.h | 3 ++-
include/shared_info_interface.h | 30 ++++++++++++++++++++--
src/xenbus/evtchn.c | 19 +++-----------
src/xenbus/shared_info.c | 44 +++++++++++++++++++++++++++++++++
4 files changed, 78 insertions(+), 18 deletions(-)
diff --git a/include/revision.h b/include/revision.h
index fe4661b42082..d507e60373a4 100644
--- a/include/revision.h
+++ b/include/revision.h
@@ -55,6 +55,7 @@
DEFINE_REVISION(0x09000005, 1, 2, 8, 1, 2, 1, 2, 4, 1, 1, 1), \
DEFINE_REVISION(0x09000006, 1, 3, 8, 1, 2, 1, 2, 4, 1, 1, 1), \
DEFINE_REVISION(0x09000007, 1, 3, 8, 1, 2, 1, 2, 4, 1, 1, 2), \
- DEFINE_REVISION(0x09000008, 1, 3, 9, 1, 2, 1, 2, 4, 1, 1, 2)
+ DEFINE_REVISION(0x09000008, 1, 3, 9, 1, 2, 1, 2, 4, 1, 1, 2), \
+ DEFINE_REVISION(0x09000008, 1, 4, 9, 1, 2, 1, 2, 4, 1, 1, 2)
#endif // _REVISION_H
diff --git a/include/shared_info_interface.h b/include/shared_info_interface.h
index f99bcb634cdd..27910b020a8e 100644
--- a/include/shared_info_interface.h
+++ b/include/shared_info_interface.h
@@ -60,6 +60,15 @@ typedef VOID
IN PINTERFACE Interface
);
+/*! \typedef XENBUS_SHARED_INFO_UPCALL_SUPPORTED
+ \brief Private method for EVTCHN inerface
+*/
+typedef BOOLEAN
+(*XENBUS_SHARED_INFO_UPCALL_SUPPORTED)(
+ IN PINTERFACE Interface,
+ IN ULONG Index
+ );
+
/*! \typedef XENBUS_SHARED_INFO_UPCALL_PENDING
\brief Private method for EVTCHN inerface
*/
@@ -168,7 +177,24 @@ struct _XENBUS_SHARED_INFO_INTERFACE_V3 {
XENBUS_SHARED_INFO_GET_TIME SharedInfoGetTime;
};
-typedef struct _XENBUS_SHARED_INFO_INTERFACE_V3 XENBUS_SHARED_INFO_INTERFACE,
*PXENBUS_SHARED_INFO_INTERFACE;
+/*! \struct _XENBUS_SHARED_INFO_INTERFACE_V4
+ \brief SHARED_INFO interface version 4
+ \ingroup interfaces
+*/
+struct _XENBUS_SHARED_INFO_INTERFACE_V4 {
+ INTERFACE Interface;
+ XENBUS_SHARED_INFO_ACQUIRE SharedInfoAcquire;
+ XENBUS_SHARED_INFO_RELEASE SharedInfoRelease;
+ XENBUS_SHARED_INFO_UPCALL_SUPPORTED SharedInfoUpcallSupported;
+ XENBUS_SHARED_INFO_UPCALL_PENDING SharedInfoUpcallPending;
+ XENBUS_SHARED_INFO_EVTCHN_POLL SharedInfoEvtchnPoll;
+ XENBUS_SHARED_INFO_EVTCHN_ACK SharedInfoEvtchnAck;
+ XENBUS_SHARED_INFO_EVTCHN_MASK SharedInfoEvtchnMask;
+ XENBUS_SHARED_INFO_EVTCHN_UNMASK SharedInfoEvtchnUnmask;
+ XENBUS_SHARED_INFO_GET_TIME SharedInfoGetTime;
+};
+
+typedef struct _XENBUS_SHARED_INFO_INTERFACE_V4 XENBUS_SHARED_INFO_INTERFACE,
*PXENBUS_SHARED_INFO_INTERFACE;
/*! \def XENBUS_SHARED_INFO
\brief Macro at assist in method invocation
@@ -179,6 +205,6 @@ typedef struct _XENBUS_SHARED_INFO_INTERFACE_V3
XENBUS_SHARED_INFO_INTERFACE, *P
#endif // _WINDLL
#define XENBUS_SHARED_INFO_INTERFACE_VERSION_MIN 2
-#define XENBUS_SHARED_INFO_INTERFACE_VERSION_MAX 3
+#define XENBUS_SHARED_INFO_INTERFACE_VERSION_MAX 4
#endif // _XENBUS_SHARED_INFO_H
diff --git a/src/xenbus/evtchn.c b/src/xenbus/evtchn.c
index cb0e8e54fb29..8942cdf30f81 100644
--- a/src/xenbus/evtchn.c
+++ b/src/xenbus/evtchn.c
@@ -1512,21 +1512,10 @@ EvtchnIsProcessorEnabled(
IN ULONG Cpu
)
{
- vcpu_info_t *Vcpu;
- NTSTATUS status;
-
- status = SystemProcessorVcpuInfo(Cpu, &Vcpu);
- if (!NT_SUCCESS(status)) {
- unsigned int vcpu_id;
-
- ASSERT(status == STATUS_NOT_SUPPORTED);
-
- status = SystemProcessorVcpuId(Cpu, &vcpu_id);
- ASSERT(NT_SUCCESS(status));
-
- if (vcpu_id >= XEN_LEGACY_MAX_VCPUS)
- return FALSE;
- }
+ if (!XENBUS_SHARED_INFO(UpcallSupported,
+ &Context->SharedInfoInterface,
+ Cpu))
+ return FALSE;
return XENBUS_EVTCHN_ABI(IsProcessorEnabled,
&Context->EvtchnAbi,
diff --git a/src/xenbus/shared_info.c b/src/xenbus/shared_info.c
index 984ee6ff0417..9f119791a03a 100644
--- a/src/xenbus/shared_info.c
+++ b/src/xenbus/shared_info.c
@@ -160,6 +160,20 @@ SharedInfoEvtchnMaskAll(
}
}
+static BOOLEAN
+SharedInfoUpcallSupported(
+ IN PINTERFACE Interface,
+ IN ULONG Index
+ )
+{
+ PXENBUS_SHARED_INFO_CONTEXT Context = Interface->Context;
+ PXENBUS_SHARED_INFO_PROCESSOR Processor = &Context->Processor[Index];
+
+ ASSERT3U(Index, <, Context->ProcessorCount);
+
+ return (Processor->Vcpu != NULL) ? TRUE : FALSE;
+}
+
static BOOLEAN
SharedInfoUpcallPending(
IN PINTERFACE Interface,
@@ -795,6 +809,19 @@ static struct _XENBUS_SHARED_INFO_INTERFACE_V3
SharedInfoInterfaceVersion3 = {
SharedInfoGetTime
};
+static struct _XENBUS_SHARED_INFO_INTERFACE_V4 SharedInfoInterfaceVersion4 = {
+ { sizeof (struct _XENBUS_SHARED_INFO_INTERFACE_V4), 4, NULL, NULL, NULL },
+ SharedInfoAcquire,
+ SharedInfoRelease,
+ SharedInfoUpcallSupported,
+ SharedInfoUpcallPending,
+ SharedInfoEvtchnPoll,
+ SharedInfoEvtchnAck,
+ SharedInfoEvtchnMask,
+ SharedInfoEvtchnUnmask,
+ SharedInfoGetTime
+};
+
NTSTATUS
SharedInfoInitialize(
IN PXENBUS_FDO Fdo,
@@ -886,6 +913,23 @@ SharedInfoGetInterface(
status = STATUS_SUCCESS;
break;
}
+ case 4: {
+ struct _XENBUS_SHARED_INFO_INTERFACE_V4 *SharedInfoInterface;
+
+ SharedInfoInterface = (struct _XENBUS_SHARED_INFO_INTERFACE_V4
*)Interface;
+
+ status = STATUS_BUFFER_OVERFLOW;
+ if (Size < sizeof (struct _XENBUS_SHARED_INFO_INTERFACE_V4))
+ break;
+
+ *SharedInfoInterface = SharedInfoInterfaceVersion4;
+
+ ASSERT3U(Interface->Version, ==, Version);
+ Interface->Context = Context;
+
+ status = STATUS_SUCCESS;
+ break;
+ }
default:
status = STATUS_NOT_SUPPORTED;
break;
--
2.17.1
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |