ndis: patch for review

Paul B Mahol onemda at gmail.com
Tue Oct 19 21:53:07 UTC 2010


Hi,

First: we should pin curthread on CPU before we check on which CPU is curthread.

Second: instead of sti & cli use critical sections when saving %fs register.

Third: I do not know what happens if we get preempted while windows
code were running,
so leave critical section only _after_ executing windows code.


diff --git a/sys/compat/ndis/kern_windrv.c b/sys/compat/ndis/kern_windrv.c
index f231863..ba29fd2 100644
--- a/sys/compat/ndis/kern_windrv.c
+++ b/sys/compat/ndis/kern_windrv.c
@@ -613,8 +613,6 @@ struct gdt {
 extern uint16_t	x86_getfs(void);
 extern void x86_setfs(uint16_t);
 extern void *x86_gettid(void);
-extern void x86_critical_enter(void);
-extern void x86_critical_exit(void);
 extern void x86_getldt(struct gdt *, uint16_t *);
 extern void x86_setldt(struct gdt *, uint16_t);

@@ -668,8 +666,10 @@ extern void x86_setldt(struct gdt *, uint16_t);
 void
 ctxsw_utow(void)
 {
-	struct tid		*t;
+	struct tid *t;

+	sched_pin();
+	critical_enter();
 	t = &my_tids[curthread->td_oncpu];

 	/*
@@ -685,12 +685,9 @@ ctxsw_utow(void)
 	if (t->tid_self != t)
 		x86_newldt(NULL);

-	x86_critical_enter();
 	t->tid_oldfs = x86_getfs();
 	t->tid_cpu = curthread->td_oncpu;
-	sched_pin();
 	x86_setfs(SEL_TO_FS(t->tid_selector));
-	x86_critical_exit();

 	/* Now entering Windows land, population: you. */
 }
@@ -706,11 +703,10 @@ ctxsw_wtou(void)
 {
 	struct tid		*t;

-	x86_critical_enter();
 	t = x86_gettid();
 	x86_setfs(t->tid_oldfs);
+	critical_exit();
 	sched_unpin();
-	x86_critical_exit();

 	/* Welcome back to UNIX land, we missed you. */

diff --git a/sys/compat/ndis/winx32_wrap.S b/sys/compat/ndis/winx32_wrap.S
index c051504..fa4aa87 100644
--- a/sys/compat/ndis/winx32_wrap.S
+++ b/sys/compat/ndis/winx32_wrap.S
@@ -375,11 +375,3 @@ ENTRY(x86_setfs)
 ENTRY(x86_gettid)
 	mov	%fs:12,%eax
 	ret
-
-ENTRY(x86_critical_enter)
-	cli
-	ret
-
-ENTRY(x86_critical_exit)
-	sti
-	ret


More information about the freebsd-net mailing list