svn commit: r221284 - in projects/largeSMP/sys: amd64/amd64 amd64/include i386/i386 i386/include i386/xen

Attilio Rao attilio at FreeBSD.org
Sat Apr 30 23:12:38 UTC 2011


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.


More information about the svn-src-projects mailing list