|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [XENBUS PATCH 12/13] sync: Save/restore IRQL when disabling interrupts
Doing so helps the compiler analyze IRQLs properly and avoids having to
suppress warnings.
Signed-off-by: Tu Dinh <ngoc-tu.dinh@xxxxxxxxxx>
---
src/xenbus/suspend.c | 6 +++---
src/xenbus/sync.c | 50 ++++++++++++++++++++++++--------------------
src/xenbus/sync.h | 6 +++---
3 files changed, 33 insertions(+), 29 deletions(-)
diff --git a/src/xenbus/suspend.c b/src/xenbus/suspend.c
index 510973b..ffab58f 100644
--- a/src/xenbus/suspend.c
+++ b/src/xenbus/suspend.c
@@ -251,13 +251,13 @@ SuspendLate(
}
NTSTATUS
-#pragma prefast(suppress:28167) // Function changes IRQL
SuspendTrigger(
_In_ PINTERFACE Interface
)
{
PXENBUS_SUSPEND_CONTEXT Context = Interface->Context;
KIRQL Irql;
+ KIRQL InterruptIrql;
NTSTATUS status;
KeRaiseIrql(DISPATCH_LEVEL, &Irql);
@@ -266,7 +266,7 @@ SuspendTrigger(
"SUSPEND: ====>\n");
SyncCapture(Context, SuspendEarly, SuspendLate);
- SyncDisableInterrupts();
+ SyncDisableInterrupts(&InterruptIrql);
__SuspendLogTimers("PRE-SUSPEND");
@@ -282,7 +282,7 @@ SuspendTrigger(
if (NT_SUCCESS(status))
SyncRunEarly();
- SyncEnableInterrupts();
+ SyncEnableInterrupts(InterruptIrql);
if (NT_SUCCESS(status))
SyncRunLate();
diff --git a/src/xenbus/sync.c b/src/xenbus/sync.c
index bf7ad0f..804df88 100644
--- a/src/xenbus/sync.c
+++ b/src/xenbus/sync.c
@@ -146,13 +146,13 @@ KDEFERRED_ROUTINE SyncWorker;
#pragma intrinsic(_enable)
#pragma intrinsic(_disable)
-#pragma warning(push)
-#pragma warning(disable:28167) // Function changes IRQL and does not restore
it before exit
-#pragma warning(disable:28156) // Actual IRQL is inconsistent with required
IRQL
-
+_Must_inspect_result_
+_IRQL_requires_(DISPATCH_LEVEL)
+_When_(NT_SUCCESS(return), _IRQL_raises_(HIGH_LEVEL))
static FORCEINLINE NTSTATUS
__SyncProcessorDisableInterrupts(
- VOID
+ _At_(*Irql, _IRQL_saves_)
+ _Out_ PKIRQL Irql
)
{
PSYNC_CONTEXT Context = &SyncContext;
@@ -161,7 +161,7 @@ __SyncProcessorDisableInterrupts(
LONG New;
NTSTATUS status;
- (VOID) KfRaiseIrql(HIGH_LEVEL);
+ KeRaiseIrql(HIGH_LEVEL, Irql);
status = STATUS_SUCCESS;
InterlockedIncrement(&Context->CompletionCount);
@@ -185,8 +185,7 @@ __SyncProcessorDisableInterrupts(
} while (InterlockedCompareExchange(&Context->CompletionCount, New, Old)
!= Old);
if (Old < Context->ProcessorCount) {
-#pragma prefast(suppress:28138) // Use constant rather than variable
- KeLowerIrql(DISPATCH_LEVEL);
+ KeLowerIrql(*Irql);
status = STATUS_UNSUCCESSFUL;
}
@@ -209,17 +208,17 @@ __SyncProcessorRunEarly(
InterlockedIncrement(&Context->CompletionCount);
}
+_IRQL_requires_(HIGH_LEVEL)
static FORCEINLINE VOID
__SyncProcessorEnableInterrupts(
- VOID
+ _In_ _IRQL_restores_ KIRQL Irql
)
{
- PSYNC_CONTEXT Context = &SyncContext;
+ PSYNC_CONTEXT Context = &SyncContext;
_enable();
-#pragma prefast(suppress:28138) // Use constant rather than variable
- KeLowerIrql(DISPATCH_LEVEL);
+ KeLowerIrql(Irql);
InterlockedIncrement(&Context->CompletionCount);
}
@@ -254,8 +253,8 @@ __SyncWait(
}
}
+_Use_decl_annotations_
VOID
-#pragma prefast(suppress:28166) // Function does not restore IRQL
SyncWorker(
PKDPC Dpc,
PVOID _Context,
@@ -267,12 +266,15 @@ SyncWorker(
ULONG Index;
PROCESSOR_NUMBER ProcNumber = { 0 };
SYNC_REQUEST Request;
+ KIRQL Irql;
UNREFERENCED_PARAMETER(Dpc);
UNREFERENCED_PARAMETER(_Context);
UNREFERENCED_PARAMETER(Argument1);
UNREFERENCED_PARAMETER(Argument2);
+ Irql = DISPATCH_LEVEL;
+
Index = KeGetCurrentProcessorNumberEx(&ProcNumber);
ASSERT(SyncOwner >= 0 && Index != (ULONG)SyncOwner);
@@ -298,7 +300,7 @@ SyncWorker(
switch (Context->Request) {
case SYNC_REQUEST_DISABLE_INTERRUPTS:
- status = __SyncProcessorDisableInterrupts();
+ status = __SyncProcessorDisableInterrupts(&Irql);
break;
case SYNC_REQUEST_RUN_EARLY:
@@ -306,7 +308,8 @@ SyncWorker(
break;
case SYNC_REQUEST_ENABLE_INTERRUPTS:
- __SyncProcessorEnableInterrupts();
+ _Analysis_assume_(KeGetCurrentIrql() == HIGH_LEVEL);
+ __SyncProcessorEnableInterrupts(Irql);
break;
case SYNC_REQUEST_RUN_LATE:
@@ -321,6 +324,8 @@ SyncWorker(
Request = Context->Request;
}
+ ASSERT3U(KeGetCurrentIrql(), ==, DISPATCH_LEVEL);
+
Trace("<==== (%u:%u)\n", ProcNumber.Group, ProcNumber.Number);
InterlockedIncrement(&Context->CompletionCount);
}
@@ -391,7 +396,8 @@ _IRQL_requires_(DISPATCH_LEVEL)
_IRQL_raises_(HIGH_LEVEL)
VOID
SyncDisableInterrupts(
- VOID
+ _At_(*Irql, _IRQL_saves_)
+ _Out_ PKIRQL Irql
)
{
PSYNC_CONTEXT Context = &SyncContext;
@@ -408,7 +414,8 @@ SyncDisableInterrupts(
KeMemoryBarrier();
for (;;) {
- status = __SyncProcessorDisableInterrupts();
+ status = __SyncProcessorDisableInterrupts(Irql);
+ _Analysis_assume_(NT_SUCCESS(status));
if (NT_SUCCESS(status))
break;
@@ -437,19 +444,19 @@ SyncRunEarly(
}
_IRQL_requires_(HIGH_LEVEL)
-_IRQL_raises_(DISPATCH_LEVEL)
VOID
SyncEnableInterrupts(
+ _In_ _IRQL_restores_ KIRQL Irql
)
{
- PSYNC_CONTEXT Context = &SyncContext;
+ PSYNC_CONTEXT Context = &SyncContext;
ASSERT(SyncOwner >= 0);
Context->CompletionCount = 0;
KeMemoryBarrier();
- __SyncProcessorEnableInterrupts();
+ __SyncProcessorEnableInterrupts(Irql);
Context->Request = SYNC_REQUEST_ENABLE_INTERRUPTS;
KeMemoryBarrier();
@@ -482,7 +489,6 @@ SyncRunLate(
_IRQL_requires_(DISPATCH_LEVEL)
VOID
-#pragma prefast(suppress:28167) // Function changes IRQL
SyncRelease(
VOID
)
@@ -510,5 +516,3 @@ SyncRelease(
Trace("<====\n");
}
-
-#pragma warning(pop)
diff --git a/src/xenbus/sync.h b/src/xenbus/sync.h
index 9707548..701562f 100644
--- a/src/xenbus/sync.h
+++ b/src/xenbus/sync.h
@@ -56,7 +56,8 @@ _IRQL_requires_(DISPATCH_LEVEL)
_IRQL_raises_(HIGH_LEVEL)
VOID
SyncDisableInterrupts(
- VOID
+ _At_(*Irql, _IRQL_saves_)
+ _Out_ PKIRQL Irql
);
extern
@@ -68,10 +69,9 @@ SyncRunEarly(
extern
_IRQL_requires_(HIGH_LEVEL)
-_IRQL_raises_(DISPATCH_LEVEL)
VOID
SyncEnableInterrupts(
- VOID
+ _In_ _IRQL_restores_ KIRQL Irql
);
extern
--
2.50.0.windows.1
Ngoc Tu Dinh | Vates XCP-ng Developer
XCP-ng & Xen Orchestra - Vates solutions
web: https://vates.tech
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |