Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 14 Apr 2004 15:04:53 -0700 (PDT)
From:      wpaul@FreeBSD.ORG (Bill Paul)
To:        jhb@FreeBSD.org (John Baldwin)
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:  <20040414220453.7806316A4CF@hub.freebsd.org>
In-Reply-To: <200404141105.43663.jhb@FreeBSD.org> from John Baldwin at "Apr 14, 2004 11:05:43 am"

next in thread | previous in thread | raw e-mail | index | archive | help
> >   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()?

-Bill

--
=============================================================================
-Bill Paul            (510) 749-2329 | Senior Engineer, Master of Unix-Fu
                 wpaul@windriver.com | Wind River Systems
=============================================================================
              <adamw> you're just BEGGING to face the moose
=============================================================================



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