Index: sys/sparc64/pci/schizo.c =================================================================== --- sys/sparc64/pci/schizo.c (revisione 242468) +++ sys/sparc64/pci/schizo.c (copia locale) @@ -51,6 +51,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include Index: sys/sparc64/pci/fire.c =================================================================== --- sys/sparc64/pci/fire.c (revisione 242468) +++ sys/sparc64/pci/fire.c (copia locale) @@ -53,6 +53,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include Index: sys/i386/i386/i686_mem.c =================================================================== --- sys/i386/i386/i686_mem.c (revisione 242468) +++ sys/i386/i386/i686_mem.c (copia locale) @@ -32,6 +32,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include Index: sys/i386/pci/pci_cfgreg.c =================================================================== --- sys/i386/pci/pci_cfgreg.c (revisione 242468) +++ sys/i386/pci/pci_cfgreg.c (copia locale) @@ -39,6 +39,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include Index: sys/amd64/amd64/amd64_mem.c =================================================================== --- sys/amd64/amd64/amd64_mem.c (revisione 242468) +++ sys/amd64/amd64/amd64_mem.c (copia locale) @@ -32,6 +32,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include Index: sys/sys/buf_ring.h =================================================================== --- sys/sys/buf_ring.h (revisione 242468) +++ sys/sys/buf_ring.h (copia locale) @@ -30,6 +30,8 @@ #ifndef _SYS_BUF_RING_H_ #define _SYS_BUF_RING_H_ +#include + #include #if defined(INVARIANTS) && !defined(DEBUG_BUFRING) Index: sys/sys/systm.h =================================================================== --- sys/sys/systm.h (revisione 242468) +++ sys/sys/systm.h (copia locale) @@ -171,10 +171,24 @@ void g_waitidle(void); void panic(const char *, ...) __dead2 __printflike(1, 2); +void _critical_enter(const char *, int); + +#define _critical_acquire(td) ((td)->td_critnest++) + +#define _critical_enter_fast() do { \ + _critical_acquire(curthread); \ + __compiler_membar(); \ +} while (0) + +#ifdef KTR +#define critical_enter() _critical_enter(__FILE__, __LINE__) +#else +#define critical_enter() _critical_enter_fast() +#endif + void cpu_boot(int); void cpu_flush_dcache(void *, size_t); void cpu_rootconf(void); -void critical_enter(void); void critical_exit(void); void init_param1(void); void init_param2(long physpages); Index: sys/kern/kern_switch.c =================================================================== --- sys/kern/kern_switch.c (revisione 242468) +++ sys/kern/kern_switch.c (copia locale) @@ -174,20 +174,28 @@ retry: } /* - * Kernel thread preemption implementation. Critical sections mark + * Kernel thread preemption implementation, hard path. Critical sections mark * regions of code in which preemptions are not allowed. */ void -critical_enter(void) +_critical_enter(const char *file, int line) { struct thread *td; td = curthread; - td->td_critnest++; - CTR4(KTR_CRITICAL, "critical_enter by thread %p (%ld, %s) to %d", td, - (long)td->td_proc->p_pid, td->td_name, td->td_critnest); + _critical_acquire(td); + CTR6(KTR_CRITICAL, "critical_enter: thread %p (%ld, %s) to %d @ %s:%d", + td, (long)td->td_proc->p_pid, td->td_name, td->td_critnest, file, + line); } +/* + * Mark the end of critical section. + * This function has not a fast version because nested critical sections are + * pretty much rare and then a function call will happen anyway (besides other + * minor factor to carefully evaluate like possible branch misprediction, + * performance burden of __compile_membar(), text size increase, etc.). + */ void critical_exit(void) { Index: sys/kern/subr_smp.c =================================================================== --- sys/kern/subr_smp.c (revisione 242468) +++ sys/kern/subr_smp.c (copia locale) @@ -368,7 +368,7 @@ smp_rendezvous_action(void) * during this routine. */ td = curthread; - td->td_critnest++; + critical_enter(); #ifdef INVARIANTS owepreempt = td->td_owepreempt; #endif Index: sys/kern/kern_rmlock.c =================================================================== --- sys/kern/kern_rmlock.c (revisione 242468) +++ sys/kern/kern_rmlock.c (copia locale) @@ -347,10 +347,8 @@ _rm_rlock(struct rmlock *rm, struct rm_priotracker tracker->rmp_thread = td; tracker->rmp_rmlock = rm; - td->td_critnest++; /* critical_enter(); */ + critical_enter(); - __compiler_membar(); - pc = cpuid_to_pcpu[td->td_oncpu]; /* pcpu_find(td->td_oncpu); */ rm_tracker_add(pc, tracker); @@ -415,7 +413,7 @@ _rm_runlock(struct rmlock *rm, struct rm_priotrack if (SCHEDULER_STOPPED()) return; - td->td_critnest++; /* critical_enter(); */ + critical_enter(); pc = cpuid_to_pcpu[td->td_oncpu]; /* pcpu_find(td->td_oncpu); */ rm_tracker_remove(pc, tracker); td->td_critnest--; Index: sys/mips/nlm/tick.c =================================================================== --- sys/mips/nlm/tick.c (revisione 242468) +++ sys/mips/nlm/tick.c (copia locale) @@ -43,6 +43,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include Index: sys/mips/nlm/intr_machdep.c =================================================================== --- sys/mips/nlm/intr_machdep.c (revisione 242468) +++ sys/mips/nlm/intr_machdep.c (copia locale) @@ -35,6 +35,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include Index: sys/mips/mips/tick.c =================================================================== --- sys/mips/mips/tick.c (revisione 242468) +++ sys/mips/mips/tick.c (copia locale) @@ -41,6 +41,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include Index: sys/dev/scd/scd.c =================================================================== --- sys/dev/scd/scd.c (revisione 242468) +++ sys/dev/scd/scd.c (copia locale) @@ -55,6 +55,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include Index: sys/dev/mcd/mcd.c =================================================================== --- sys/dev/mcd/mcd.c (revisione 242468) +++ sys/dev/mcd/mcd.c (copia locale) @@ -55,6 +55,7 @@ static const char COPYRIGHT[] = "mcd-driver (C)199 #include #include #include +#include #include #include Index: sys/dev/glxiic/glxiic.c =================================================================== --- sys/dev/glxiic/glxiic.c (revisione 242468) +++ sys/dev/glxiic/glxiic.c (copia locale) @@ -42,6 +42,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #ifdef GLXIIC_DEBUG #include