On 10/5/10, Julian Elischer <jul...@freebsd.org> wrote: > On 10/5/10 1:19 PM, Paul B Mahol wrote: >> Hi, >> >> If clang did not complain, I would probbaly never spot it. >> >> Patch attached. > > personally I think you could use kproc_kthread_add so that a single > NDIS process had three threads.
Patch attached. Now we have single "ndis" kernel process with own threads.
diff --git a/sys/compat/ndis/subr_ntoskrnl.c b/sys/compat/ndis/subr_ntoskrnl.c index 714fcd8..eafbb7c 100644 --- a/sys/compat/ndis/subr_ntoskrnl.c +++ b/sys/compat/ndis/subr_ntoskrnl.c @@ -254,6 +254,7 @@ static int32_t KeDelayExecutionThread(uint8_t, uint8_t, int64_t *); static int32_t KeSetPriorityThread(struct thread *, int32_t); static void dummy(void); +static struct proc *ndisproc; static struct mtx ntoskrnl_dispatchlock; static struct mtx ntoskrnl_interlock; static kspin_lock ntoskrnl_cancellock; @@ -270,7 +271,7 @@ ntoskrnl_libinit() { image_patch_table *patch; int error; - struct proc *p; + struct thread *t; kdpc_queue *kq; callout_entry *e; int i; @@ -320,8 +321,9 @@ ntoskrnl_libinit() #endif kq = kq_queues + i; kq->kq_cpu = i; - error = kproc_create(ntoskrnl_dpc_thread, kq, &p, - RFHIGHPID, NDIS_KSTACK_PAGES, "Windows DPC %d", i); + error = kproc_kthread_add(ntoskrnl_dpc_thread, kq, + &ndisproc, &t, RFHIGHPID, NDIS_KSTACK_PAGES, "ndis", + "Windows DPC %d", i); if (error) panic("failed to launch DPC thread"); } @@ -332,8 +334,9 @@ ntoskrnl_libinit() for (i = 0; i < WORKITEM_THREADS; i++) { kq = wq_queues + i; - error = kproc_create(ntoskrnl_workitem_thread, kq, &p, - RFHIGHPID, NDIS_KSTACK_PAGES, "Windows Workitem %d", i); + error = kproc_kthread_add(ntoskrnl_workitem_thread, kq, + &ndisproc, &t, RFHIGHPID, NDIS_KSTACK_PAGES, "ndis", + "Windows Workitem %d", i); if (error) panic("failed to launch workitem thread"); } @@ -2701,7 +2704,7 @@ ntoskrnl_workitem_thread(arg) #if __FreeBSD_version < 502113 mtx_lock(&Giant); #endif - kproc_exit(0); + kthread_exit(); return; /* notreached */ } @@ -3380,7 +3383,7 @@ PsCreateSystemThread(handle, reqaccess, objattrs, phandle, { int error; thread_context *tc; - struct proc *p; + struct thread *t; tc = malloc(sizeof(thread_context), M_TEMP, M_NOWAIT); if (tc == NULL) @@ -3389,15 +3392,16 @@ PsCreateSystemThread(handle, reqaccess, objattrs, phandle, tc->tc_thrctx = thrctx; tc->tc_thrfunc = thrfunc; - error = kproc_create(ntoskrnl_thrfunc, tc, &p, - RFHIGHPID, NDIS_KSTACK_PAGES, "Windows Kthread %d", ntoskrnl_kth); + error = kproc_kthread_add(ntoskrnl_thrfunc, tc, &ndisproc, &t, + RFHIGHPID, NDIS_KSTACK_PAGES, "ndis", + "Windows Kthread %d", ntoskrnl_kth); if (error) { free(tc, M_TEMP); return (STATUS_INSUFFICIENT_RESOURCES); } - *handle = p; + *handle = t; ntoskrnl_kth++; return (STATUS_SUCCESS); @@ -3432,7 +3436,7 @@ PsTerminateSystemThread(status) #if __FreeBSD_version < 502113 mtx_lock(&Giant); #endif - kproc_exit(0); + kthread_exit(); return (0); /* notreached */ } @@ -3740,7 +3744,7 @@ ntoskrnl_dpc_thread(arg) #if __FreeBSD_version < 502113 mtx_lock(&Giant); #endif - kproc_exit(0); + kthread_exit(); return; /* notreached */ }
_______________________________________________ freebsd-net@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-net To unsubscribe, send any mail to "freebsd-net-unsubscr...@freebsd.org"