[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [win-pv-devel] [PATCH v2] Add optional log level settings
> -----Original Message----- > From: win-pv-devel [mailto:win-pv-devel-bounces@xxxxxxxxxxxxxxxxxxxx] On > Behalf Of owen.smith@xxxxxxxxxx > Sent: 24 July 2017 16:35 > To: win-pv-devel@xxxxxxxxxxxxxxxxxxxx > Cc: Owen Smith <owen.smith@xxxxxxxxxx> > Subject: [win-pv-devel] [PATCH v2] Add optional log level settings > > From: Owen Smith <owen.smith@xxxxxxxxxx> > > Adds XenLogLevel and QemuLogLevel to xen.sys and ConsoleLogLevel > to xenbus.sys, which can be used to override the default log levels. > Each value is a REG_MULTI_SZ that contains an enumerated list of > log levels; TRACE, INFO, WARNING, ERROR, CRITICAL are defined. > > Signed-off-by: Owen Smith <owen.smith@xxxxxxxxxx> Reviewed-by: Paul Durrant <paul.durrant@xxxxxxxxxx> with one small nit, which I'll fix up on commit... > --- > include/xen.h | 10 ++++- > src/xen/driver.c | 103 ++++++++++++++++++++++++++++++++++---------- > -------- > src/xen/log.c | 88 +++++++++++++++++++++++++++++++++++++++---- > - > src/xenbus/driver.c | 37 +++++++++++++++++++ > src/xenbus/driver.h | 6 +++ > src/xenbus/fdo.c | 5 +-- > 6 files changed, 198 insertions(+), 51 deletions(-) > > diff --git a/include/xen.h b/include/xen.h > index 470ccd4..05cf8ec 100644 > --- a/include/xen.h > +++ b/include/xen.h > @@ -365,7 +365,7 @@ UnplugDecrementValue( > // LOG > > typedef enum _LOG_LEVEL { > - LOG_LEVEL_INVALID = 0, > + LOG_LEVEL_NONE = 0, > LOG_LEVEL_TRACE = 1 << DPFLTR_TRACE_LEVEL, > LOG_LEVEL_INFO = 1 << DPFLTR_INFO_LEVEL, > LOG_LEVEL_WARNING = 1 << DPFLTR_WARNING_LEVEL, > @@ -413,6 +413,14 @@ LogResume( > VOID > ); > > +XEN_API > +NTSTATUS > +LogReadLogLevel( > + IN HANDLE Key, > + IN PCHAR Name, > + OUT PLOG_LEVEL LogLevel > + ); > + > typedef struct _LOG_DISPOSITION LOG_DISPOSITION, > *PLOG_DISPOSITION; > > XEN_API > diff --git a/src/xen/driver.c b/src/xen/driver.c > index f83cb13..fa141f3 100644 > --- a/src/xen/driver.c > +++ b/src/xen/driver.c > @@ -49,6 +49,13 @@ > #include "assert.h" > #include "version.h" > > +#define DEFAULT_XEN_LOG_LEVEL (LOG_LEVEL_TRACE | \ > + LOG_LEVEL_CRITICAL) > +#define DEFAULT_QEMU_LOG_LEVEL (LOG_LEVEL_INFO | \ > + LOG_LEVEL_WARNING | \ > + LOG_LEVEL_ERROR | \ > + LOG_LEVEL_CRITICAL) > + > typedef struct _XEN_DRIVER { > PLOG_DISPOSITION TraceDisposition; > PLOG_DISPOSITION InfoDisposition; > @@ -160,6 +167,8 @@ DllInitialize( > { > HANDLE ServiceKey; > HANDLE UnplugKey; > + HANDLE ParametersKey; > + LOG_LEVEL LogLevel; > NTSTATUS status; > > ExInitializeDriverRuntime(DrvRtPoolNxOptIn); > @@ -173,17 +182,40 @@ DllInitialize( > if (!NT_SUCCESS(status)) > goto fail1; > > - status = LogAddDisposition(LOG_LEVEL_TRACE | > - LOG_LEVEL_CRITICAL, > + status = RegistryInitialize(RegistryPath); > + if (!NT_SUCCESS(status)) > + goto fail2; > + > + status = RegistryCreateServiceKey(&ServiceKey); > + if (!NT_SUCCESS(status)) > + goto fail3; > + > + status = RegistryCreateSubKey(ServiceKey, > + "Parameters", > + REG_OPTION_NON_VOLATILE, > + &ParametersKey); > + if (!NT_SUCCESS(status)) > + goto fail4; > + > + status = LogReadLogLevel(ParametersKey, > + "XenLogLevel", > + &LogLevel); > + if (!NT_SUCCESS(status)) > + LogLevel = DEFAULT_XEN_LOG_LEVEL; > + > + status = LogAddDisposition(LogLevel, > DriverOutputBuffer, > (PVOID)XEN_PORT, > &Driver.TraceDisposition); > ASSERT(NT_SUCCESS(status)); > > - status = LogAddDisposition(LOG_LEVEL_INFO | > - LOG_LEVEL_WARNING | > - LOG_LEVEL_ERROR | > - LOG_LEVEL_CRITICAL, > + status = LogReadLogLevel(ParametersKey, > + "QemuLogLevel", > + &LogLevel); > + if (!NT_SUCCESS(status)) > + LogLevel = DEFAULT_QEMU_LOG_LEVEL; > + > + status = LogAddDisposition(LogLevel, > DriverOutputBuffer, > (PVOID)QEMU_PORT, > &Driver.InfoDisposition); > @@ -201,50 +233,44 @@ DllInitialize( > if (__DriverSafeMode()) > Info("SAFE MODE\n"); > > - status = RegistryInitialize(RegistryPath); > - if (!NT_SUCCESS(status)) > - goto fail2; > - > - status = RegistryCreateServiceKey(&ServiceKey); > - if (!NT_SUCCESS(status)) > - goto fail3; > - > status = RegistryCreateSubKey(ServiceKey, > "Unplug", > REG_OPTION_NON_VOLATILE, > &UnplugKey); > if (!NT_SUCCESS(status)) > - goto fail4; > + goto fail5; > > __DriverSetUnplugKey(UnplugKey); > > status = AcpiInitialize(); > if (!NT_SUCCESS(status)) > - goto fail5; > + goto fail6; > > status = SystemInitialize(); > if (!NT_SUCCESS(status)) > - goto fail6; > + goto fail7; > > status = HypercallInitialize(); > if (!NT_SUCCESS(status)) > - goto fail7; > + goto fail8; > > status = BugCheckInitialize(); > if (!NT_SUCCESS(status)) > - goto fail8; > + goto fail9; > > status = ModuleInitialize(); > if (!NT_SUCCESS(status)) > - goto fail9; > + goto fail10; > > status = ProcessInitialize(); > if (!NT_SUCCESS(status)) > - goto fail10; > + goto fail11; > > status = UnplugInitialize(); > if (!NT_SUCCESS(status)) > - goto fail11; > + goto fail12; > + > + RegistryCloseKey(ParametersKey); > > RegistryCloseKey(ServiceKey); > > @@ -252,41 +278,52 @@ DllInitialize( > > return STATUS_SUCCESS; > > +fail12: > + Error("fail12\n"); > + > + ProcessTeardown(); > + > fail11: > Error("fail11\n"); > > - ProcessTeardown(); > + ModuleTeardown(); > > fail10: > Error("fail10\n"); > > - ModuleTeardown(); > + BugCheckTeardown(); > > fail9: > Error("fail9\n"); > > - BugCheckTeardown(); > + HypercallTeardown(); > > fail8: > Error("fail8\n"); > > - HypercallTeardown(); > + SystemTeardown(); > > fail7: > Error("fail7\n"); > > - SystemTeardown(); > + AcpiTeardown(); > > fail6: > Error("fail6\n"); > > - AcpiTeardown(); > + RegistryCloseKey(UnplugKey); > + __DriverSetUnplugKey(NULL); > > fail5: > Error("fail5\n"); > > - RegistryCloseKey(UnplugKey); > - __DriverSetUnplugKey(NULL); > + LogRemoveDisposition(Driver.InfoDisposition); > + Driver.InfoDisposition = NULL; > + > + LogRemoveDisposition(Driver.TraceDisposition); > + Driver.TraceDisposition = NULL; > + > + RegistryCloseKey(ParametersKey); > > fail4: > Error("fail4\n"); > @@ -301,12 +338,6 @@ fail3: > fail2: > Error("fail2\n"); > > - LogRemoveDisposition(Driver.InfoDisposition); > - Driver.InfoDisposition = NULL; > - > - LogRemoveDisposition(Driver.TraceDisposition); > - Driver.TraceDisposition = NULL; > - > LogTeardown(); > > fail1: > diff --git a/src/xen/log.c b/src/xen/log.c > index ff8b091..c10315e 100644 > --- a/src/xen/log.c > +++ b/src/xen/log.c > @@ -560,9 +560,9 @@ LogAddDisposition( > ULONG Index; > NTSTATUS status; > > - status = STATUS_INVALID_PARAMETER; > - if (Mask == 0) > - goto fail1; > + *Disposition = NULL; > + if (Mask == LOG_LEVEL_NONE) > + goto ignore; > > AcquireHighLock(&Context->Lock, &Irql); > > @@ -581,21 +581,19 @@ LogAddDisposition( > } > > if (!NT_SUCCESS(status)) > - goto fail2; > + goto fail1; > > ReleaseHighLock(&Context->Lock, Irql); > > +ignore: > return STATUS_SUCCESS; > > -fail2: > - Error("fail2\n"); > - > - *Disposition = NULL; > +fail1: > + Error("fail1 (%08x)\n", status); > > ReleaseHighLock(&Context->Lock, Irql); > > -fail1: > - Error("fail1 (%08x)\n", status); > + *Disposition = NULL; > > return status; > } > @@ -609,6 +607,9 @@ LogRemoveDisposition( > KIRQL Irql; > ULONG Index; > > + if (Disposition == NULL) > + return; > + > AcquireHighLock(&Context->Lock, &Irql); > > for (Index = 0; Index < LOG_MAXIMUM_DISPOSITION; Index++) { > @@ -664,6 +665,73 @@ LogResume( > (VOID) DbgSetDebugPrintCallback(LogDebugPrint, TRUE); > } > > +typedef struct _XEN_LOG_LEVEL_NAME { > + const CHAR *Name; > + LOG_LEVEL LogLevel; > +} XEN_LOG_LEVEL_NAME, *PXEN_LOG_LEVEL_NAME; > + > +static const XEN_LOG_LEVEL_NAME XenLogLevelNames[] = { > + { "TRACE", LOG_LEVEL_TRACE }, > + { "INFO", LOG_LEVEL_INFO }, > + { "WARNING", LOG_LEVEL_WARNING }, > + { "ERROR", LOG_LEVEL_ERROR, }, > + { "CRITICAL", LOG_LEVEL_CRITICAL } > +}; > + > +XEN_API > +NTSTATUS > +LogReadLogLevel( > + IN HANDLE Key, > + IN PCHAR Name, > + OUT PLOG_LEVEL LogLevel > + ) > +{ > + PANSI_STRING Values; > + ULONG Type; > + ULONG Index; > + NTSTATUS status; > + > + status = RegistryQuerySzValue(Key, > + Name, > + &Type, > + &Values); > + if (!NT_SUCCESS(status)) > + goto fail1; > + > + status = STATUS_INVALID_PARAMETER; > + if (Type != REG_MULTI_SZ) > + goto fail2; > + > + *LogLevel = LOG_LEVEL_NONE; > + for (Index = 0; Values[Index].Buffer != NULL; ++Index) { > + PANSI_STRING Value = &Values[Index]; > + ULONG Level; > + > + for (Level = 0; Level < ARRAYSIZE(XenLogLevelNames); ++Level) { > + if (_stricmp(XenLogLevelNames[Level].Name, Value->Buffer) == 0) { > + *LogLevel |= XenLogLevelNames[Level].LogLevel; > + break; > + } > + } > + } > + > + RegistryFreeSzValue(Values); > + > + return STATUS_SUCCESS; > + > +fail2: > + Error("fail2\n"); > + > + RegistryFreeSzValue(Values); > + > +fail1: > + Error("fail1 (%08x)\n", status); > + > + *LogLevel = LOG_LEVEL_NONE; > + > + return status; > +} > + > NTSTATUS > LogInitialize( > VOID > diff --git a/src/xenbus/driver.c b/src/xenbus/driver.c > index bbbda6c..5550d88 100644 > --- a/src/xenbus/driver.c > +++ b/src/xenbus/driver.c > @@ -48,6 +48,7 @@ > typedef struct _XENBUS_DRIVER { > PDRIVER_OBJECT DriverObject; > HANDLE ParametersKey; > + LOG_LEVEL ConsoleLogLevel; > > MUTEX Mutex; > LIST_ENTRY List; > @@ -57,6 +58,10 @@ typedef struct _XENBUS_DRIVER { > static XENBUS_DRIVER Driver; > > #define XENBUS_DRIVER_TAG 'VIRD' > +#define DEFAULT_CONSOLE_LOG_LEVEL (LOG_LEVEL_INFO | \ > + LOG_LEVEL_WARNING | \ > + LOG_LEVEL_ERROR | \ > + LOG_LEVEL_CRITICAL) > > static FORCEINLINE PVOID > __DriverAllocate( > @@ -122,6 +127,30 @@ DriverGetParametersKey( > return __DriverGetParametersKey(); > } > > +static FORCEINLINE VOID > +__DriverSetConsoleLogLevel( > + IN LOG_LEVEL LogLevel > + ) > +{ > + Driver.ConsoleLogLevel = LogLevel; > +} > + > +static FORCEINLINE LOG_LEVEL > +__DriverGetConsoleLogLevel( > + VOID > + ) > +{ > + return Driver.ConsoleLogLevel; > +} > + > +LOG_LEVEL > +DriverGetConsoleLogLevel( > + VOID > + ) > +{ > + return __DriverGetConsoleLogLevel(); > +} > + > #define MAXNAMELEN 128 > > static FORCEINLINE VOID > @@ -680,6 +709,7 @@ DriverEntry( > HANDLE ServiceKey; > HANDLE ParametersKey; > ULONG Index; > + LOG_LEVEL LogLevel; > NTSTATUS status; > > ASSERT3P(__DriverGetDriverObject(), ==, NULL); > @@ -721,6 +751,13 @@ DriverEntry( > > __DriverSetParametersKey(ParametersKey); > > + status = LogReadLogLevel(ParametersKey, > + "ConsoleLogLevel", > + &LogLevel); > + if (!NT_SUCCESS(status)) > + LogLevel = DEFAULT_CONSOLE_LOG_LEVEL; Need a blank line here otherwise the code looks a little misleading. Paul > + __DriverSetConsoleLogLevel(LogLevel); > + > RegistryCloseKey(ServiceKey); > > status = XenTouch(__MODULE__, > diff --git a/src/xenbus/driver.h b/src/xenbus/driver.h > index dd81e4c..21fb1f7 100644 > --- a/src/xenbus/driver.h > +++ b/src/xenbus/driver.h > @@ -42,6 +42,12 @@ DriverGetParametersKey( > VOID > ); > > +#include <xen.h> > +extern LOG_LEVEL > +DriverGetConsoleLogLevel( > + VOID > + ); > + > extern VOID > DriverRequestReboot( > VOID > diff --git a/src/xenbus/fdo.c b/src/xenbus/fdo.c > index 0aeea3d..c5b5da1 100644 > --- a/src/xenbus/fdo.c > +++ b/src/xenbus/fdo.c > @@ -2680,10 +2680,7 @@ __FdoD3ToD0( > Fdo->Channel, > FALSE); > > - status = LogAddDisposition(LOG_LEVEL_INFO | > - LOG_LEVEL_WARNING | > - LOG_LEVEL_ERROR | > - LOG_LEVEL_CRITICAL, > + status = LogAddDisposition(DriverGetConsoleLogLevel(), > FdoOutputBuffer, > Fdo, > &Fdo->LogDisposition); > -- > 2.8.3 > > > _______________________________________________ > win-pv-devel mailing list > win-pv-devel@xxxxxxxxxxxxxxxxxxxx > https://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel _______________________________________________ win-pv-devel mailing list win-pv-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |