Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 30 Oct 2012 15:10:50 +0000 (UTC)
From:      Attilio Rao <attilio@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r242361 - in head/sys: dev/hwpmc kern
Message-ID:  <201210301510.q9UFAoek017087@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: attilio
Date: Tue Oct 30 15:10:50 2012
New Revision: 242361
URL: http://svn.freebsd.org/changeset/base/242361

Log:
  Fixup r240246: hwpmc needs to retain the pinning until ASTs are not
  executed. This means past the point where userret() is generally
  executed.
  
  Skip the td_pinned check if a callchain tracing is currently happening
  and add a more robust check to pmc_capture_user_callchain() in order to
  catch td_pinned leak past ast() in hwpmc case.
  
  Reported and tested by:	fabient
  MFC after:	1 week
  X-MFC:	r240246

Modified:
  head/sys/dev/hwpmc/hwpmc_mod.c
  head/sys/kern/subr_trap.c

Modified: head/sys/dev/hwpmc/hwpmc_mod.c
==============================================================================
--- head/sys/dev/hwpmc/hwpmc_mod.c	Tue Oct 30 13:22:39 2012	(r242360)
+++ head/sys/dev/hwpmc/hwpmc_mod.c	Tue Oct 30 15:10:50 2012	(r242361)
@@ -4248,7 +4248,7 @@ pmc_capture_user_callchain(int cpu, int 
 	    ("[pmc,%d] cpu %d didn't find a sample to collect", __LINE__,
 		cpu));
 
-	KASSERT(td->td_pinned > 0,
+	KASSERT(td->td_pinned == 1,
 	    ("[pmc,%d] invalid td_pinned value", __LINE__));
 	sched_unpin();	/* Can migrate safely now. */
 

Modified: head/sys/kern/subr_trap.c
==============================================================================
--- head/sys/kern/subr_trap.c	Tue Oct 30 13:22:39 2012	(r242360)
+++ head/sys/kern/subr_trap.c	Tue Oct 30 15:10:50 2012	(r242361)
@@ -145,6 +145,11 @@ userret(struct thread *td, struct trapfr
 
 	/*
 	 * Check for misbehavior.
+	 *
+	 * In case there is a callchain tracing ongoing because of
+	 * hwpmc(4), skip the scheduler pinning check.
+	 * hwpmc(4) subsystem, infact, will collect callchain informations
+	 * at ast() checkpoint, which is past userret().
 	 */
 	WITNESS_WARN(WARN_PANIC, NULL, "userret: returning");
 	KASSERT(td->td_critnest == 0,
@@ -155,7 +160,7 @@ userret(struct thread *td, struct trapfr
 	    ("userret: Returning with pagefaults disabled"));
 	KASSERT((td->td_pflags & TDP_NOSLEEPING) == 0,
 	    ("userret: Returning with sleep disabled"));
-	KASSERT(td->td_pinned == 0,
+	KASSERT(td->td_pinned == 0 || (td->td_pflags & TDP_CALLCHAIN) != 0,
 	    ("userret: Returning with with pinned thread"));
 	KASSERT(td->td_vp_reserv == 0,
 	    ("userret: Returning while holding vnode reservation"));



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