[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH] Indirect user space watch events through a thread
It is useful, for diagnostic purposes, to log the path of a user-space registered watch when we are about to signal it. To do this create a thread to handle each user-space watch. Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx> --- src/xeniface/ioctl_store.c | 58 ++++++++++++++++++++++++++++++++++++++++++---- src/xeniface/ioctls.c | 13 ++++++++++- src/xeniface/ioctls.h | 2 ++ 3 files changed, 67 insertions(+), 6 deletions(-) diff --git a/src/xeniface/ioctl_store.c b/src/xeniface/ioctl_store.c index 5bd4649..1725e06 100644 --- a/src/xeniface/ioctl_store.c +++ b/src/xeniface/ioctl_store.c @@ -428,6 +428,36 @@ fail1: return status; } +static NTSTATUS +StoreWatch( + IN PXENIFACE_THREAD Self, + IN PVOID _Context + ) +{ + PXENIFACE_STORE_CONTEXT Context = _Context; + PKEVENT Event; + + Event = ThreadGetEvent(Self); + + for (;;) { + (VOID) KeWaitForSingleObject(Event, + Executive, + KernelMode, + FALSE, + NULL); + KeClearEvent(Event); + + if (ThreadIsAlerted(Self)) + break; + + XenIfaceDebugPrint(INFO, "%s\n", Context->Path); + + KeSetEvent(Context->Event, IO_NO_INCREMENT, FALSE); + } + + return STATUS_SUCCESS; +} + DECLSPEC_NOINLINE NTSTATUS IoctlStoreAddWatch( @@ -483,17 +513,21 @@ IoctlStoreAddWatch( XenIfaceDebugPrint(TRACE, "> Path '%s', Event %p, FO %p\n", Path, In->Event, FileObject); + Context->Path = Path; + + status = ThreadCreate(StoreWatch, Context, &Context->Thread); + if (!NT_SUCCESS(status)) + goto fail6; + status = XENBUS_STORE(WatchAdd, &Fdo->StoreInterface, NULL, // prefix - Path, - Context->Event, + Context->Path, + ThreadGetEvent(Context->Thread), &Context->Watch); if (!NT_SUCCESS(status)) - goto fail6; - - __FreeCapturedBuffer(Path); + goto fail7; ExInterlockedInsertTailList(&Fdo->StoreWatchList, &Context->Entry, &Fdo->StoreWatchLock); @@ -504,6 +538,13 @@ IoctlStoreAddWatch( return status; +fail7: + __FreeCapturedBuffer(Context->Path); + + XenIfaceDebugPrint(ERROR, "Fail7\n"); + ThreadAlert(Context->Thread); + ThreadJoin(Context->Thread); + fail6: XenIfaceDebugPrint(ERROR, "Fail6\n"); ObDereferenceObject(Context->Event); @@ -537,6 +578,8 @@ StoreFreeWatch( { NTSTATUS status; + ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL); + XenIfaceDebugPrint(TRACE, "Context %p, Watch %p, FO %p\n", Context, Context->Watch, Context->FileObject); @@ -546,6 +589,11 @@ StoreFreeWatch( ASSERT(NT_SUCCESS(status)); // this is fatal since we'd leave an active watch without cleaning it up + ThreadAlert(Context->Thread); + ThreadJoin(Context->Thread); + + __FreeCapturedBuffer(Context->Path); + ObDereferenceObject(Context->Event); RtlZeroMemory(Context, sizeof(XENIFACE_STORE_CONTEXT)); ExFreePoolWithTag(Context, XENIFACE_POOL_TAG); diff --git a/src/xeniface/ioctls.c b/src/xeniface/ioctls.c index e47ef6e..8e5648b 100644 --- a/src/xeniface/ioctls.c +++ b/src/xeniface/ioctls.c @@ -157,6 +157,7 @@ XenIfaceCleanup( LIST_ENTRY ToFree; // store watches + InitializeListHead(&ToFree); KeAcquireSpinLock(&Fdo->StoreWatchLock, &Irql); Node = Fdo->StoreWatchList.Flink; while (Node->Flink != Fdo->StoreWatchList.Flink) { @@ -169,10 +170,20 @@ XenIfaceCleanup( XenIfaceDebugPrint(TRACE, "Store context %p\n", StoreContext); RemoveEntryList(&StoreContext->Entry); - StoreFreeWatch(Fdo, StoreContext); + // StoreFreeWatch requires PASSIVE_LEVEL and we're inside a lock + InsertTailList(&ToFree, &StoreContext->Entry); } KeReleaseSpinLock(&Fdo->StoreWatchLock, Irql); + Node = ToFree.Flink; + while (Node->Flink != ToFree.Flink) { + StoreContext = CONTAINING_RECORD(Node, XENIFACE_STORE_CONTEXT, Entry); + Node = Node->Flink; + + RemoveEntryList(&StoreContext->Entry); + StoreFreeWatch(Fdo, StoreContext); + } + // event channels InitializeListHead(&ToFree); KeAcquireSpinLock(&Fdo->EvtchnLock, &Irql); diff --git a/src/xeniface/ioctls.h b/src/xeniface/ioctls.h index 16af0a2..c954e9e 100644 --- a/src/xeniface/ioctls.h +++ b/src/xeniface/ioctls.h @@ -48,6 +48,8 @@ typedef struct _XENIFACE_CONTEXT_ID { typedef struct _XENIFACE_STORE_CONTEXT { LIST_ENTRY Entry; + PCHAR Path; + PXENIFACE_THREAD Thread; PXENBUS_STORE_WATCH Watch; PKEVENT Event; PVOID FileObject; -- 2.5.3 _______________________________________________ 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 |