Date: Sat, 30 Apr 2011 23:12:38 +0000 (UTC) From: Attilio Rao <attilio@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r221284 - in projects/largeSMP/sys: amd64/amd64 amd64/include i386/i386 i386/include i386/xen Message-ID: <201104302312.p3UNCc1Y066595@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: attilio Date: Sat Apr 30 23:12:37 2011 New Revision: 221284 URL: http://svn.freebsd.org/changeset/base/221284 Log: Add the function md_assert_nopreempt(), which is a very consistent function on the possibility of a thread to not preempt. As this function is very tied to x86 (interrupts disabled checkings) it is not intended to be used in MI code. Modified: projects/largeSMP/sys/amd64/amd64/mp_machdep.c projects/largeSMP/sys/amd64/include/smp.h projects/largeSMP/sys/i386/i386/mp_machdep.c projects/largeSMP/sys/i386/include/smp.h projects/largeSMP/sys/i386/xen/mp_machdep.c Modified: projects/largeSMP/sys/amd64/amd64/mp_machdep.c ============================================================================== --- projects/largeSMP/sys/amd64/amd64/mp_machdep.c Sat Apr 30 23:02:17 2011 (r221283) +++ projects/largeSMP/sys/amd64/amd64/mp_machdep.c Sat Apr 30 23:12:37 2011 (r221284) @@ -1428,6 +1428,22 @@ cpususpend_handler(void) intr_restore(rf); } +void +md_assert_nopreempt(void) +{ +#ifdef INVARIANTS + struct thread *td; + register_t rflags; + + td = curthread; + rflags = read_rflags(); + + if ((rflags & PSL_I) != 0 && td->td_critnest <= 0) + panic("Preemption still allowed, thread %s\n", + (td->td_pinned <= 0) ? "not pinned" : "pinned"); +#endif +} + /* * This is called once the rest of the system is up and running and we're * ready to let the AP's out of the pen. Modified: projects/largeSMP/sys/amd64/include/smp.h ============================================================================== --- projects/largeSMP/sys/amd64/include/smp.h Sat Apr 30 23:02:17 2011 (r221283) +++ projects/largeSMP/sys/amd64/include/smp.h Sat Apr 30 23:12:37 2011 (r221284) @@ -64,6 +64,7 @@ void ipi_bitmap_handler(struct trapfram void ipi_cpu(int cpu, u_int ipi); int ipi_nmi_handler(void); void ipi_selected(cpumask_t cpus, u_int ipi); +void md_assert_nopreempt(void); u_int mp_bootaddress(u_int); int mp_grab_cpu_hlt(void); void smp_cache_flush(void); Modified: projects/largeSMP/sys/i386/i386/mp_machdep.c ============================================================================== --- projects/largeSMP/sys/i386/i386/mp_machdep.c Sat Apr 30 23:02:17 2011 (r221283) +++ projects/largeSMP/sys/i386/i386/mp_machdep.c Sat Apr 30 23:12:37 2011 (r221284) @@ -1486,6 +1486,22 @@ cpustop_handler(void) } } +void +md_assert_nopreempt(void) +{ +#ifdef INVARIANTS + struct thread *td; + register_t rflags; + + td = curthread; + rflags = read_rflags(); + + if ((rflags & PSL_I) != 0 && td->td_critnest <= 0) + panic("Preemption still allowed, thread %s\n", + (td->td_pinned <= 0) ? "not pinned" : "pinned"); +#endif +} + /* * This is called once the rest of the system is up and running and we're * ready to let the AP's out of the pen. Modified: projects/largeSMP/sys/i386/include/smp.h ============================================================================== --- projects/largeSMP/sys/i386/include/smp.h Sat Apr 30 23:02:17 2011 (r221283) +++ projects/largeSMP/sys/i386/include/smp.h Sat Apr 30 23:12:37 2011 (r221284) @@ -65,6 +65,7 @@ void ipi_bitmap_handler(struct trapfram void ipi_cpu(int cpu, u_int ipi); int ipi_nmi_handler(void); void ipi_selected(cpumask_t cpus, u_int ipi); +void md_assert_nopreempt(void); u_int mp_bootaddress(u_int); int mp_grab_cpu_hlt(void); void smp_cache_flush(void); Modified: projects/largeSMP/sys/i386/xen/mp_machdep.c ============================================================================== --- projects/largeSMP/sys/i386/xen/mp_machdep.c Sat Apr 30 23:02:17 2011 (r221283) +++ projects/largeSMP/sys/i386/xen/mp_machdep.c Sat Apr 30 23:12:37 2011 (r221284) @@ -1241,6 +1241,22 @@ cpustop_handler(void) } } +void +md_assert_nopreempt(void) +{ +#ifdef INVARIANTS + struct thread *td; + register_t rflags; + + td = curthread; + rflags = read_rflags(); + + if ((rflags & PSL_I) != 0 && td->td_critnest <= 0) + panic("Preemption still allowed, thread %s\n", + (td->td_pinned <= 0) ? "not pinned" : "pinned"); +#endif +} + /* * This is called once the rest of the system is up and running and we're * ready to let the AP's out of the pen.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201104302312.p3UNCc1Y066595>