[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] Add ETW support



Defines ETW schema with EtwEnter and EtwExit events, which can be used to track
code-paths and produce flamegraphs of executions.
Only uses EtwEnter and EtwExit in the driver.c file of XenVif, but more events
will be added in subsequent patches.

Signed-off-by: Owen Smith <owen.smith@xxxxxxxxx>
---
 src/xenvif/dbg_print.h       | 60 +++++++++++++++++++++++++++++++++++
 src/xenvif/driver.c          | 10 ++++++
 src/xenvif/xenvif_etw.xml    | 61 ++++++++++++++++++++++++++++++++++++
 vs2019/xenvif/xenvif.vcxproj | 13 +++++++-
 vs2022/xenvif/xenvif.vcxproj | 13 +++++++-
 5 files changed, 155 insertions(+), 2 deletions(-)
 create mode 100644 src/xenvif/xenvif_etw.xml

diff --git a/src/xenvif/dbg_print.h b/src/xenvif/dbg_print.h
index e39a50c..9cbd286 100644
--- a/src/xenvif/dbg_print.h
+++ b/src/xenvif/dbg_print.h
@@ -42,6 +42,66 @@
 
 #pragma warning(disable:4127)   // conditional expression is constant
 
+#ifdef ETW_HEADER
+#include ETW_HEADER
+
+static __inline VOID
+__EtwEnter(
+    IN  const CHAR      *Module,
+    IN  const CHAR      *Function,
+    IN  ULONG           Line
+    )
+{
+    CHAR                _Module[16];
+    CHAR                _Function[32];
+
+    if (!EventEnabledEvtEnter())
+        return;
+
+    RtlZeroMemory(_Module, sizeof(_Module));
+    RtlZeroMemory(_Function, sizeof(_Function));
+
+    strncpy(_Module, Module, ARRAYSIZE(_Module) -1);
+    strncpy(_Function, Function, ARRAYSIZE(_Function) - 1);
+
+    EventWriteEvtEnter(NULL, _Module, _Function, Line);
+}
+
+static __inline VOID
+__EtwExit(
+    IN  const CHAR      *Module,
+    IN  const CHAR      *Function,
+    IN  ULONG           Line,
+    IN  NTSTATUS        Status
+    )
+{
+    CHAR                _Module[16];
+    CHAR                _Function[32];
+
+    if (!EventEnabledEvtExit())
+        return;
+
+    RtlZeroMemory(_Module, sizeof(_Module));
+    RtlZeroMemory(_Function, sizeof(_Function));
+
+    strncpy(_Module, Module, sizeof(_Module));
+    strncpy(_Function, Function, sizeof(_Function));
+
+    EventWriteEvtExit(NULL, _Module, _Function, Line, (ULONG)Status);
+}
+
+#define EtwEnter()          __EtwEnter(__MODULE__, __FUNCTION__, __LINE__)
+#define EtwExit()           __EtwExit(__MODULE__, __FUNCTION__, __LINE__, 
STATUS_SUCCESS)
+#define EtwExit2(status)    __EtwExit(__MODULE__, __FUNCTION__, __LINE__, 
status)
+
+#else
+
+#define EtwEnter()          (VOID)0
+#define EtwExit()           (VOID)0
+#define EtwExit2(status)    (VOID)status
+
+#endif
+
 static __inline VOID
 __Error(
     IN  const CHAR  *Prefix,
diff --git a/src/xenvif/driver.c b/src/xenvif/driver.c
index 3345607..fec047d 100644
--- a/src/xenvif/driver.c
+++ b/src/xenvif/driver.c
@@ -303,6 +303,8 @@ DriverUnload(
 
     __DriverSetDriverObject(NULL);
 
+    EventUnregisterXenVif_Driver();
+
     ASSERT(IsZeroMemory(&Driver, sizeof (XENVIF_DRIVER)));
 
     Trace("<====\n");
@@ -318,6 +320,7 @@ AddDevice(
 {
     NTSTATUS            status;
 
+    EtwEnter();
     ASSERT3P(DriverObject, ==, __DriverGetDriverObject());
 
     status = FdoCreate(DeviceObject);
@@ -328,11 +331,13 @@ AddDevice(
     ASSERT(!(DeviceObject->Flags & DO_DEVICE_INITIALIZING));
     DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
 
+    EtwExit();
     return STATUS_SUCCESS;
 
 fail1:
     Error("fail1 (%08x)\n", status);
 
+    EtwExit2(status);
     return status;
 }
 
@@ -347,6 +352,7 @@ Dispatch(
     PXENVIF_DX          Dx;
     NTSTATUS            status;
 
+    EtwEnter();
     Dx = (PXENVIF_DX)DeviceObject->DeviceExtension;
     ASSERT3P(Dx->DeviceObject, ==, DeviceObject);
 
@@ -390,6 +396,7 @@ Dispatch(
     }
 
 done:
+    EtwExit2(status);
     return status;
 }
 
@@ -410,6 +417,7 @@ DriverEntry(
 
     ASSERT3P(__DriverGetDriverObject(), ==, NULL);
 
+    EventRegisterXenVif_Driver();
     ExInitializeDriverRuntime(DrvRtPoolNxOptIn);
     WdmlibProcgrpInitialize();
 
@@ -506,6 +514,8 @@ fail1:
 
     __DriverSetDriverObject(NULL);
 
+    EventUnregisterXenVif_Driver();
+
     ASSERT(IsZeroMemory(&Driver, sizeof (XENVIF_DRIVER)));
 
     return status;
diff --git a/src/xenvif/xenvif_etw.xml b/src/xenvif/xenvif_etw.xml
new file mode 100644
index 0000000..06f088b
--- /dev/null
+++ b/src/xenvif/xenvif_etw.xml
@@ -0,0 +1,61 @@
+<?xml version='1.0' encoding='utf-8' standalone='yes'?>
+<instrumentationManifest
+    xmlns="http://schemas.microsoft.com/win/2004/08/events";
+    xmlns:win="http://manifests.microsoft.com/win/2004/08/windows/events";
+    xmlns:xs="http://www.w3.org/2001/XMLSchema";
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+    xsi:schemaLocation="http://schemas.microsoft.com/win/2004/08/events 
eventman.xsd" >
+  <instrumentation>
+    <events>
+      <provider
+          guid="{6c02b05a-c66d-49db-bd06-4fbe1adcbe13}"
+          messageFileName="%SystemDrive%\windows\system32\drivers\xenvif.sys"
+          name="XenVif_Driver"
+          resourceFileName="%SystemDrive%\windows\system32\drivers\xenvif.sys"
+          symbol="DriverControlGuid" >
+        <channels>
+          <channel chid="XENVIF" name="XenVif" type="Analytic" enabled="true" 
/>
+        </channels>
+        <templates>
+          <template tid="tid_enter">
+            <data name="Module" inType="win:Int8" count="16" 
outType="xs:string" />     <!-- 16 chars -->
+            <data name="Function" inType="win:Int8" count="32" 
outType="xs:string" />   <!-- 32 chars -->
+            <data name="Line" inType="win:UInt32" outType="xs:unsignedInt" />  
         <!-- line number -->
+          </template>
+          <template tid="tid_exit">
+            <data name="Module" inType="win:Int8" count="16" 
outType="xs:string" />     <!-- 16 chars -->
+            <data name="Function" inType="win:Int8" count="32" 
outType="xs:string" />   <!-- 32 chars -->
+            <data name="Line" inType="win:UInt32" outType="xs:unsignedInt" />  
         <!-- line number -->
+            <data name="Status" inType="win:UInt32" outType="xs:unsignedInt" 
/>         <!-- NTSTATUS -->
+          </template>
+        </templates>
+        <events>
+          <event
+            channel="XENVIF"
+            level="win:Informational"
+            message="$(string.EventTraceInfo.Enter)"
+            opcode="win:Info"
+            symbol="EvtEnter"
+            template="tid_enter"
+            value="10" />
+          <event
+            channel="XENVIF"
+            level="win:Informational"
+            message="$(string.EventTraceInfo.Exit)"
+            opcode="win:Info"
+            symbol="EvtExit"
+            template="tid_exit"
+            value="11" />
+        </events>
+      </provider>
+    </events>
+  </instrumentation>
+  <localization xmlns="http://schemas.microsoft.com/win/2004/08/events";>
+    <resources culture="en-US">
+      <stringTable>
+        <string id="EventTraceInfo.Enter" value="[Enter]" />
+        <string id="EventTraceInfo.Exit"  value="[Exit ]" />
+      </stringTable>
+    </resources>
+  </localization>
+</instrumentationManifest>
diff --git a/vs2019/xenvif/xenvif.vcxproj b/vs2019/xenvif/xenvif.vcxproj
index d070a03..7bb566b 100644
--- a/vs2019/xenvif/xenvif.vcxproj
+++ b/vs2019/xenvif/xenvif.vcxproj
@@ -21,7 +21,7 @@
     <ClCompile>
       <AdditionalOptions>/ZH:SHA_256 %(AdditionalOptions)</AdditionalOptions>
       
<AdditionalIncludeDirectories>$(WindowsSdkDir)\include\km;..\..\include;..\..\include\xen;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      
<PreprocessorDefinitions>PROJECT=$(ProjectName);POOL_NX_OPTIN=1;NT_PROCESSOR_GROUPS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      
<PreprocessorDefinitions>PROJECT=$(ProjectName);POOL_NX_OPTIN=1;NT_PROCESSOR_GROUPS;ETW_HEADER="xenvif_etw.h";%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <IntrinsicFunctions>true</IntrinsicFunctions>
       <WarningLevel>EnableAllWarnings</WarningLevel>
       
<DisableSpecificWarnings>4061;4464;4711;4770;4548;4820;4668;4255;5045;6001;6054;26451;28196;30030;30029;%(DisableSpecificWarnings)</DisableSpecificWarnings>
@@ -35,6 +35,13 @@
       
<LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
       <CETCompat>true</CETCompat>
     </Link>
+    <MessageCompile>
+      <HeaderFilePath>..\..\include</HeaderFilePath>
+      <GeneratedFilesBaseName>%(Filename)</GeneratedFilesBaseName>
+      <RCFilePath>..\..\src\xenvif</RCFilePath>
+      <GenerateKernelModeLoggingMacros>true</GenerateKernelModeLoggingMacros>
+      <UseBaseNameOfInput>true</UseBaseNameOfInput>
+    </MessageCompile>
     <DriverSign>
       <FileDigestAlgorithm>sha256</FileDigestAlgorithm>
     </DriverSign>
@@ -65,6 +72,7 @@
   <ItemGroup>
     <FilesToPackage Include="$(TargetPath)" />
     <FilesToPackage Include="$(OutDir)$(TargetName).pdb" />
+    <FilesToPackage Include="..\..\src\xenvif\xenvif_etw.xml" />
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="../../src/xenvif/bus.c" />
@@ -87,6 +95,9 @@
   <ItemGroup>
     <ResourceCompile Include="..\..\src\xenvif\xenvif.rc" />
   </ItemGroup>
+  <ItemGroup>
+    <MessageCompile Include="..\..\src\xenvif\xenvif_etw.xml" />
+  </ItemGroup>
   <ItemGroup>
     <None Include="..\package\package.vcxproj" />
   </ItemGroup>
diff --git a/vs2022/xenvif/xenvif.vcxproj b/vs2022/xenvif/xenvif.vcxproj
index 85c0a05..9f5aad2 100644
--- a/vs2022/xenvif/xenvif.vcxproj
+++ b/vs2022/xenvif/xenvif.vcxproj
@@ -21,7 +21,7 @@
     <ClCompile>
       <AdditionalOptions>/ZH:SHA_256 %(AdditionalOptions)</AdditionalOptions>
       
<AdditionalIncludeDirectories>$(WindowsSdkDir)\include\km;..\..\include;..\..\include\xen;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      
<PreprocessorDefinitions>PROJECT=$(ProjectName);POOL_NX_OPTIN=1;NT_PROCESSOR_GROUPS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      
<PreprocessorDefinitions>PROJECT=$(ProjectName);POOL_NX_OPTIN=1;NT_PROCESSOR_GROUPS;ETW_HEADER="xenvif_etw.h";%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <IntrinsicFunctions>true</IntrinsicFunctions>
       <WarningLevel>EnableAllWarnings</WarningLevel>
       
<DisableSpecificWarnings>4061;4464;4711;4770;4548;4820;4668;4255;5045;6001;6054;26451;28196;30030;30029;%(DisableSpecificWarnings)</DisableSpecificWarnings>
@@ -35,6 +35,13 @@
       
<LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
       <CETCompat>true</CETCompat>
     </Link>
+    <MessageCompile>
+      <HeaderFilePath>..\..\include</HeaderFilePath>
+      <GeneratedFilesBaseName>%(Filename)</GeneratedFilesBaseName>
+      <RCFilePath>..\..\src\xenvif</RCFilePath>
+      <GenerateKernelModeLoggingMacros>true</GenerateKernelModeLoggingMacros>
+      <UseBaseNameOfInput>true</UseBaseNameOfInput>
+    </MessageCompile>
     <DriverSign>
       <FileDigestAlgorithm>sha256</FileDigestAlgorithm>
     </DriverSign>
@@ -57,6 +64,7 @@
   <ItemGroup>
     <FilesToPackage Include="$(TargetPath)" />
     <FilesToPackage Include="$(OutDir)$(TargetName).pdb" />
+    <FilesToPackage Include="..\..\src\xenvif\xenvif_etw.xml" />
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="../../src/xenvif/bus.c" />
@@ -79,6 +87,9 @@
   <ItemGroup>
     <ResourceCompile Include="..\..\src\xenvif\xenvif.rc" />
   </ItemGroup>
+  <ItemGroup>
+    <MessageCompile Include="..\..\src\xenvif\xenvif_etw.xml" />
+  </ItemGroup>
   <ItemGroup>
     <None Include="..\package\package.vcxproj" />
   </ItemGroup>
-- 
2.41.0.windows.3




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.