Use atomic ops for the interlocked increment and decrement routines
in subr_ndis and subr_ntoskrnl. This is faster and avoids potential LOR whinage from witness (an LOR couldn't happen with the old code since the interlocked inc/dec routines could not sleep with a lock held, but this will keep witness happy and it's more efficient anyway. I think.)
This commit is contained in:
parent
e3c8d8194c
commit
e157128762
@ -72,6 +72,7 @@ __FBSDID("$FreeBSD$");
|
||||
#include <net/if_dl.h>
|
||||
#include <net/if_media.h>
|
||||
|
||||
#include <machine/atomic.h>
|
||||
#include <machine/bus_memio.h>
|
||||
#include <machine/bus_pio.h>
|
||||
#include <machine/bus.h>
|
||||
@ -1780,9 +1781,7 @@ __stdcall static uint32_t
|
||||
ndis_interlock_inc(addend)
|
||||
uint32_t *addend;
|
||||
{
|
||||
mtx_lock(&ndis_interlock);
|
||||
(*addend)++;
|
||||
mtx_unlock(&ndis_interlock);
|
||||
atomic_add_long((u_long *)addend, 1);
|
||||
return(*addend);
|
||||
}
|
||||
|
||||
@ -1790,9 +1789,7 @@ __stdcall static uint32_t
|
||||
ndis_interlock_dec(addend)
|
||||
uint32_t *addend;
|
||||
{
|
||||
mtx_lock(&ndis_interlock);
|
||||
(*addend)--;
|
||||
mtx_unlock(&ndis_interlock);
|
||||
atomic_subtract_long((u_long *)addend, 1);
|
||||
return(*addend);
|
||||
}
|
||||
|
||||
|
@ -44,6 +44,7 @@ __FBSDID("$FreeBSD$");
|
||||
#include <sys/callout.h>
|
||||
#include <sys/kernel.h>
|
||||
|
||||
#include <machine/atomic.h>
|
||||
#include <machine/clock.h>
|
||||
#include <machine/bus_memio.h>
|
||||
#include <machine/bus_pio.h>
|
||||
@ -578,10 +579,7 @@ ntoskrnl_interlock_inc(/*addend*/ void)
|
||||
|
||||
__asm__ __volatile__ ("" : "=c" (addend));
|
||||
|
||||
mtx_lock(&ntoskrnl_interlock);
|
||||
(*addend)++;
|
||||
mtx_unlock(&ntoskrnl_interlock);
|
||||
|
||||
atomic_add_long((volatile u_long *)addend, 1);
|
||||
return(*addend);
|
||||
}
|
||||
|
||||
@ -592,10 +590,7 @@ ntoskrnl_interlock_dec(/*addend*/ void)
|
||||
|
||||
__asm__ __volatile__ ("" : "=c" (addend));
|
||||
|
||||
mtx_lock(&ntoskrnl_interlock);
|
||||
(*addend)--;
|
||||
mtx_unlock(&ntoskrnl_interlock);
|
||||
|
||||
atomic_subtract_long((volatile u_long *)addend, 1);
|
||||
return(*addend);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user