[ovs-dev] [PATCH] datapath-windows: Modified dump start message memory representation
Sorin Vinturis
svinturis at cloudbasesolutions.com
Fri Jul 3 15:36:37 UTC 2015
Changed the dump start message memory representation to be static.
Signed-off-by: Sorin Vinturis <svinturis at cloudbasesolutions.com>
---
datapath-windows/ovsext/Datapath.c | 53 +++++++++++++++++---------------------
datapath-windows/ovsext/Datapath.h | 8 +++---
datapath-windows/ovsext/Flow.c | 4 +--
datapath-windows/ovsext/Util.h | 5 ++++
datapath-windows/ovsext/Vport.c | 9 ++++---
5 files changed, 40 insertions(+), 39 deletions(-)
diff --git a/datapath-windows/ovsext/Datapath.c b/datapath-windows/ovsext/Datapath.c
index 4af909c..603008d 100644
--- a/datapath-windows/ovsext/Datapath.c
+++ b/datapath-windows/ovsext/Datapath.c
@@ -347,21 +347,16 @@ NDIS_SPIN_LOCK ovsCtrlLockObj;
PNDIS_SPIN_LOCK gOvsCtrlLock;
NTSTATUS
-InitUserDumpState(POVS_OPEN_INSTANCE instance,
- POVS_MESSAGE ovsMsg)
+SetUserDumpState(POVS_OPEN_INSTANCE instance,
+ POVS_MESSAGE ovsMsg)
{
/* Clear the dumpState from a previous dump sequence. */
- ASSERT(instance->dumpState.ovsMsg == NULL);
+ ASSERT(OvsBufferIsEmpty((char*)&instance->dumpState.ovsMsg,
+ sizeof(instance->dumpState.ovsMsg)));
ASSERT(ovsMsg);
- instance->dumpState.ovsMsg =
- (POVS_MESSAGE)OvsAllocateMemoryWithTag(sizeof(OVS_MESSAGE),
- OVS_DATAPATH_POOL_TAG);
- if (instance->dumpState.ovsMsg == NULL) {
- return STATUS_NO_MEMORY;
- }
- RtlCopyMemory(instance->dumpState.ovsMsg, ovsMsg,
- sizeof *instance->dumpState.ovsMsg);
+ RtlCopyMemory(&instance->dumpState.ovsMsg, ovsMsg,
+ sizeof instance->dumpState.ovsMsg);
RtlZeroMemory(instance->dumpState.index,
sizeof instance->dumpState.index);
@@ -369,13 +364,9 @@ InitUserDumpState(POVS_OPEN_INSTANCE instance,
}
VOID
-FreeUserDumpState(POVS_OPEN_INSTANCE instance)
+ClearUserDumpState(POVS_OPEN_INSTANCE instance)
{
- if (instance->dumpState.ovsMsg != NULL) {
- OvsFreeMemoryWithTag(instance->dumpState.ovsMsg,
- OVS_DATAPATH_POOL_TAG);
- RtlZeroMemory(&instance->dumpState, sizeof instance->dumpState);
- }
+ RtlZeroMemory(&instance->dumpState, sizeof instance->dumpState);
}
VOID
@@ -588,7 +579,6 @@ OvsRemoveOpenInstance(PFILE_OBJECT fileObject)
OvsReleaseCtrlLock();
ASSERT(instance->eventQueue == NULL);
ASSERT (instance->packetQueue == NULL);
- FreeUserDumpState(instance);
OvsFreeMemoryWithTag(instance, OVS_DATAPATH_POOL_TAG);
}
@@ -839,12 +829,14 @@ OvsDeviceControl(PDEVICE_OBJECT deviceObject,
*
* In the absence of a dump start, return 0 bytes.
*/
- if (instance->dumpState.ovsMsg == NULL) {
+ if (OvsBufferIsEmpty((char*)&instance->dumpState.ovsMsg,
+ sizeof(instance->dumpState.ovsMsg))) {
replyLen = 0;
status = STATUS_SUCCESS;
goto done;
}
- RtlCopyMemory(&ovsMsgReadOp, instance->dumpState.ovsMsg,
+
+ RtlCopyMemory(&ovsMsgReadOp, &instance->dumpState.ovsMsg,
sizeof (ovsMsgReadOp));
/* Create an NL message for consumption. */
@@ -1263,11 +1255,12 @@ HandleGetDpDump(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
} else {
NL_BUFFER nlBuf;
NTSTATUS status;
- POVS_MESSAGE msgIn = instance->dumpState.ovsMsg;
+ POVS_MESSAGE msgIn = &instance->dumpState.ovsMsg;
ASSERT(usrParamsCtx->devOp == OVS_READ_DEV_OP);
- if (instance->dumpState.ovsMsg == NULL) {
+ if (OvsBufferIsEmpty((char*)&instance->dumpState.ovsMsg,
+ sizeof(instance->dumpState.ovsMsg))) {
ASSERT(FALSE);
return STATUS_INVALID_DEVICE_STATE;
}
@@ -1285,7 +1278,7 @@ HandleGetDpDump(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
if (status != STATUS_SUCCESS) {
*replyLen = 0;
- FreeUserDumpState(instance);
+ ClearUserDumpState(instance);
return status;
}
@@ -1293,8 +1286,8 @@ HandleGetDpDump(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
instance->dumpState.index[0] = 1;
*replyLen = msgOut->nlMsg.nlmsgLen;
- /* Free up the dump state, since there's no more data to continue. */
- FreeUserDumpState(instance);
+ /* Clear the dump state, since there's no more data to continue. */
+ ClearUserDumpState(instance);
}
return STATUS_SUCCESS;
@@ -1428,9 +1421,9 @@ OvsSetupDumpStart(POVS_USER_PARAMS_CONTEXT usrParamsCtx)
* This operation should be setting up the dump state. If there's any
* previous state, clear it up so as to set it up afresh.
*/
- FreeUserDumpState(instance);
+ ClearUserDumpState(instance);
- return InitUserDumpState(instance, msgIn);
+ return SetUserDumpState(instance, msgIn);
}
@@ -1566,7 +1559,8 @@ OvsReadEventCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
ASSERT(usrParamsCtx->devOp == OVS_READ_DEV_OP);
/* Should never read events with a dump socket */
- ASSERT(instance->dumpState.ovsMsg == NULL);
+ ASSERT(OvsBufferIsEmpty((char*)&instance->dumpState.ovsMsg,
+ sizeof(instance->dumpState.ovsMsg)));
/* Must have an event queue */
ASSERT(instance->eventQueue != NULL);
@@ -1614,7 +1608,8 @@ OvsReadPacketCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
ASSERT(usrParamsCtx->devOp == OVS_READ_DEV_OP);
/* Should never read events with a dump socket */
- ASSERT(instance->dumpState.ovsMsg == NULL);
+ ASSERT(OvsBufferIsEmpty((char*)&instance->dumpState.ovsMsg,
+ sizeof(instance->dumpState.ovsMsg)));
/* Must have an packet queue */
ASSERT(instance->packetQueue != NULL);
diff --git a/datapath-windows/ovsext/Datapath.h b/datapath-windows/ovsext/Datapath.h
index 2c61d82..f41357f 100644
--- a/datapath-windows/ovsext/Datapath.h
+++ b/datapath-windows/ovsext/Datapath.h
@@ -53,7 +53,7 @@ typedef struct _OVS_OPEN_INSTANCE {
UINT32 pid;
struct {
- POVS_MESSAGE ovsMsg; /* OVS message passed during dump start. */
+ OVS_MESSAGE ovsMsg; /* OVS message passed during dump start. */
UINT32 index[2]; /* markers to continue dump from. One or more
* of them may be used. Eg. in flow dump, the
* markers can store the row and the column
@@ -113,10 +113,10 @@ InitUserParamsCtx(PIRP irp,
usrParamsCtx->outputLength = outputLength;
}
-NTSTATUS InitUserDumpState(POVS_OPEN_INSTANCE instance,
- POVS_MESSAGE ovsMsg);
+NTSTATUS SetUserDumpState(POVS_OPEN_INSTANCE instance,
+ POVS_MESSAGE ovsMsg);
-VOID FreeUserDumpState(POVS_OPEN_INSTANCE instance);
+VOID ClearUserDumpState(POVS_OPEN_INSTANCE instance);
NTSTATUS OvsSetupDumpStart(POVS_USER_PARAMS_CONTEXT usrParamsCtx);
diff --git a/datapath-windows/ovsext/Flow.c b/datapath-windows/ovsext/Flow.c
index 69b546a..4971a25 100644
--- a/datapath-windows/ovsext/Flow.c
+++ b/datapath-windows/ovsext/Flow.c
@@ -556,7 +556,7 @@ _FlowNlDumpCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
goto done;
}
- POVS_MESSAGE msgIn = instance->dumpState.ovsMsg;
+ POVS_MESSAGE msgIn = &instance->dumpState.ovsMsg;
PNL_MSG_HDR nlMsgHdr = &(msgIn->nlMsg);
PGENL_MSG_HDR genlMsgHdr = &(msgIn->genlMsg);
POVS_HDR ovsHdr = &(msgIn->ovsHdr);
@@ -612,7 +612,7 @@ _FlowNlDumpCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
NlMsgAlignSize(nlMsgOutHdr);
*replyLen += NlMsgSize(nlMsgOutHdr);
- FreeUserDumpState(instance);
+ ClearUserDumpState(instance);
break;
} else {
BOOLEAN ok;
diff --git a/datapath-windows/ovsext/Util.h b/datapath-windows/ovsext/Util.h
index e3f9ede..1baa8e0 100644
--- a/datapath-windows/ovsext/Util.h
+++ b/datapath-windows/ovsext/Util.h
@@ -90,4 +90,9 @@ VOID OvsAppendList(PLIST_ENTRY dst, PLIST_ENTRY src);
BOOLEAN OvsCompareString(PVOID string1, PVOID string2);
+__inline BOOLEAN OvsBufferIsEmpty(char *buf, size_t size)
+{
+ return (buf[0] == 0 && !memcmp(buf, buf + 1, size - 1));
+}
+
#endif /* __UTIL_H_ */
diff --git a/datapath-windows/ovsext/Vport.c b/datapath-windows/ovsext/Vport.c
index 4315464..646139c 100644
--- a/datapath-windows/ovsext/Vport.c
+++ b/datapath-windows/ovsext/Vport.c
@@ -1848,7 +1848,8 @@ OvsGetVportDumpNext(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
ASSERT(usrParamsCtx->devOp == OVS_READ_DEV_OP);
- if (instance->dumpState.ovsMsg == NULL) {
+ if (OvsBufferIsEmpty((char*)&instance->dumpState.ovsMsg,
+ sizeof(instance->dumpState.ovsMsg))) {
ASSERT(FALSE);
return STATUS_INVALID_DEVICE_STATE;
}
@@ -1856,7 +1857,7 @@ OvsGetVportDumpNext(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
/* Output buffer has been validated while validating read dev op. */
ASSERT(usrParamsCtx->outputBuffer != NULL);
- msgIn = instance->dumpState.ovsMsg;
+ msgIn = &instance->dumpState.ovsMsg;
/*
* XXX: when we implement OVS_DP_ATTR_USER_FEATURES in datapath,
@@ -1935,8 +1936,8 @@ OvsGetVportDumpNext(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
* it's dump done
*/
*replyLen = 0;
- /* Free up the dump state, since there's no more data to continue. */
- FreeUserDumpState(instance);
+ /* Clear the dump state, since there's no more data to continue. */
+ ClearUserDumpState(instance);
}
return STATUS_SUCCESS;
--
1.9.0.msysgit.0
More information about the dev
mailing list