Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 15 Apr 2004 14:34:20 -0400
From:      John Baldwin <jhb@FreeBSD.org>
To:        wpaul@FreeBSD.ORG (Bill Paul)
Cc:        cvs-all@FreeBSD.org
Subject:   Re: cvs commit: src/sys/compat/ndis hal_var.h kern_ndis.c ndis_var.h ntoskrnl_var.h pe_var.h subr_hal.c subr_ndis.c subr_ntoskrn
Message-ID:  <200404151434.20428.jhb@FreeBSD.org>
In-Reply-To: <20040414220453.7806316A4CF@hub.freebsd.org>
References:  <20040414220453.7806316A4CF@hub.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Wednesday 14 April 2004 06:04 pm, Bill Paul wrote:
> > >   Now, I'm sure many people will be seized by the urge to criticize
> > >   me for doing an end run around our own spinlock implementation, but
> > >   it makes more sense to do it this way. Well, it does to me anyway.
> >
> > If you don't use atomic ops with memory barriers somewhere (like the
> > mutex implementation does) then NDIS won't work on SMP.  Really, IRQL is
> > basically spl()s, and we don't use an spl-like model anymore.  Just using
> > mutexes for locking should give you all the protection you need.
>
> Protection is all well and good, but I need to provide the right semantics
> as well. I need to fool the drivers into thinking they can depend on the
> usual Windows behavior, and make it easy to use the Windows data types,
> and it's a pain in the butt to do that with regular mutexes.
>
> And besides, I wanna.
>
> Now, from subr_ntoskrnl.c:
>
> __stdcall void
> ntoskrnl_lock_dpc(/*lock*/ void)
> {
>         kspin_lock              *lock;
>
>         __asm__ __volatile__ ("" : "=c" (lock));
>
>         while (atomic_cmpset_int((volatile u_int *)lock, 0, 1) == 0)
>                 /* do nothing */;
>
>         return;
> }
>
> __stdcall void
> ntoskrnl_unlock_dpc(/*lock*/ void)
> {
>         kspin_lock              *lock;
>
>         __asm__ __volatile__ ("" : "=c" (lock));
>
>         atomic_cmpset_int((volatile u_int *)lock, 1, 0);
>
>         return;
> }
>
> These two routines do the actual work of acquiring and releasing the
> lock (they map to KefAcquireSpinLockAtDpcLevel() and
> KefReleaseSpinLockFromDpcLevel). Are you saying the former routine
> should use atomic_cmpset_acq_int() and the latter atomic_cmpset_rel_int()?

Yes.

-- 
John Baldwin <jhb@FreeBSD.org>  <><  http://www.FreeBSD.org/~jhb/
"Power Users Use the Power to Serve"  =  http://www.FreeBSD.org



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200404151434.20428.jhb>