From 87ff20ed78c9e06677db2ed9ad29837cf35cbea7 Mon Sep 17 00:00:00 2001 From: Bill Paul Date: Fri, 21 Oct 2005 05:23:20 +0000 Subject: [PATCH] Correct the macro definition for KeRaiseIrql(). The official API is KeRaiseIrql(newirql, &oldirql), not oldirql = KeRaiseIrql(newirql). (The macro ultimately translates to KfRaiseIrql() which does use the latter API, so this has no effect on generated code.) Also, wait for thread termination the right way: kthread_exit() will ultimately do a wakeup(td->td_proc). This is the event we should wait on. Eliminate the previous synchronization machinery for this since it was never guaranteed to work correctly. --- sys/compat/ndis/ntoskrnl_var.h | 4 ++-- sys/compat/ndis/subr_hal.c | 2 +- sys/compat/ndis/subr_ntoskrnl.c | 27 +++++---------------------- 3 files changed, 8 insertions(+), 25 deletions(-) diff --git a/sys/compat/ndis/ntoskrnl_var.h b/sys/compat/ndis/ntoskrnl_var.h index 5ec1f54b2864..836f56eb051c 100644 --- a/sys/compat/ndis/ntoskrnl_var.h +++ b/sys/compat/ndis/ntoskrnl_var.h @@ -1397,7 +1397,7 @@ extern void IoQueueWorkItem(io_workitem *, io_workitem_func, #ifdef __i386__ #define KeAcquireSpinLock(a, b) *(b) = KfAcquireSpinLock(a) #define KeReleaseSpinLock(a, b) KfReleaseSpinLock(a, b) -#define KeRaiseIrql(a) KfRaiseIrql(a) +#define KeRaiseIrql(a, b) *(b) = KfRaiseIrql(a) #define KeLowerIrql(a) KfLowerIrql(a) #define KeAcquireSpinLockAtDpcLevel(a) KefAcquireSpinLockAtDpcLevel(a) #define KeReleaseSpinLockFromDpcLevel(a) KefReleaseSpinLockFromDpcLevel(a) @@ -1411,7 +1411,7 @@ extern void IoQueueWorkItem(io_workitem *, io_workitem_func, * These may need to be redefined later; * not sure where they live on amd64 yet. */ -#define KeRaiseIrql(a) KfRaiseIrql(a) +#define KeRaiseIrql(a, b) *(b) = KfRaiseIrql(a) #define KeLowerIrql(a) KfLowerIrql(a) #endif /* __amd64__ */ diff --git a/sys/compat/ndis/subr_hal.c b/sys/compat/ndis/subr_hal.c index fa376bf0eecb..73e574ad5fbb 100644 --- a/sys/compat/ndis/subr_hal.c +++ b/sys/compat/ndis/subr_hal.c @@ -374,7 +374,7 @@ KfAcquireSpinLock(lock) if (KeGetCurrentIrql() > DISPATCH_LEVEL) panic("IRQL_NOT_LESS_THAN_OR_EQUAL"); - oldirql = KeRaiseIrql(DISPATCH_LEVEL); + KeRaiseIrql(DISPATCH_LEVEL, &oldirql); KeAcquireSpinLockAtDpcLevel(lock); return(oldirql); diff --git a/sys/compat/ndis/subr_ntoskrnl.c b/sys/compat/ndis/subr_ntoskrnl.c index ac87f5308514..b2a231bc519c 100644 --- a/sys/compat/ndis/subr_ntoskrnl.c +++ b/sys/compat/ndis/subr_ntoskrnl.c @@ -95,7 +95,6 @@ struct kdpc_queue { kspin_lock kq_lock; nt_kevent kq_proc; nt_kevent kq_done; - nt_kevent kq_dead; }; typedef struct kdpc_queue kdpc_queue; @@ -2309,7 +2308,7 @@ KeAcquireSpinLockRaiseToDpc(kspin_lock *lock) if (KeGetCurrentIrql() > DISPATCH_LEVEL) panic("IRQL_NOT_LESS_THAN_OR_EQUAL"); - oldirql = KeRaiseIrql(DISPATCH_LEVEL); + KeRaiseIrql(DISPATCH_LEVEL, &oldirql); KeAcquireSpinLockAtDpcLevel(lock); return(oldirql); @@ -2555,19 +2554,6 @@ ntoskrnl_workitem_thread(arg) kq->kq_exit = 0; KeInitializeSpinLock(&kq->kq_lock); KeInitializeEvent(&kq->kq_proc, EVENT_TYPE_SYNC, FALSE); - KeInitializeEvent(&kq->kq_dead, EVENT_TYPE_SYNC, FALSE); - - /* - * Boost the priority of the workitem threads, - * though don't boost it as much as the DPC threads. - */ - - mtx_lock_spin(&sched_lock); - sched_prio(curthread, PRIBIO); -#if __FreeBSD_version < 600000 - curthread->td_base_pri = PRIBIO; -#endif - mtx_unlock_spin(&sched_lock); while (1) { KeWaitForSingleObject(&kq->kq_proc, 0, 0, TRUE, NULL); @@ -2576,7 +2562,6 @@ ntoskrnl_workitem_thread(arg) if (kq->kq_exit) { KeReleaseSpinLock(&kq->kq_lock, irql); - KeSetEvent(&kq->kq_dead, IO_NO_INCREMENT, FALSE); break; } @@ -2612,7 +2597,7 @@ ntoskrnl_destroy_workitem_threads(void) kq = wq_queues + i; kq->kq_exit = 1; KeSetEvent(&kq->kq_proc, IO_NO_INCREMENT, FALSE); - KeWaitForSingleObject(&kq->kq_dead, 0, 0, TRUE, NULL); + tsleep(kq->kq_td->td_proc, PWAIT, "waitiw", 0); } return; @@ -3565,7 +3550,6 @@ ntoskrnl_dpc_thread(arg) KeInitializeSpinLock(&kq->kq_lock); KeInitializeEvent(&kq->kq_proc, EVENT_TYPE_SYNC, FALSE); KeInitializeEvent(&kq->kq_done, EVENT_TYPE_SYNC, FALSE); - KeInitializeEvent(&kq->kq_dead, EVENT_TYPE_SYNC, FALSE); /* * Elevate our priority. DPCs are used to run interrupt @@ -3590,7 +3574,6 @@ ntoskrnl_dpc_thread(arg) if (kq->kq_exit) { KeReleaseSpinLock(&kq->kq_lock, irql); - KeSetEvent(&kq->kq_dead, IO_NO_INCREMENT, FALSE); break; } @@ -3635,7 +3618,7 @@ ntoskrnl_destroy_dpc_threads(void) KeInitializeDpc(&dpc, NULL, NULL); KeSetTargetProcessorDpc(&dpc, i); KeInsertQueueDpc(&dpc, NULL, NULL); - KeWaitForSingleObject(&kq->kq_dead, 0, 0, TRUE, NULL); + tsleep(kq->kq_td->td_proc, PWAIT, "dpcw", 0); } return; @@ -3697,7 +3680,7 @@ KeInsertQueueDpc(dpc, sysarg1, sysarg2) if (dpc == NULL) return(FALSE); - irql = KeRaiseIrql(DISPATCH_LEVEL); + KeRaiseIrql(DISPATCH_LEVEL, &irql); /* * By default, the DPC is queued to run on the same CPU @@ -3736,7 +3719,7 @@ KeRemoveQueueDpc(dpc) if (dpc == NULL) return(FALSE); - irql = KeRaiseIrql(DISPATCH_LEVEL); + KeRaiseIrql(DISPATCH_LEVEL, &irql); kq = kq_queues + dpc->k_num;