Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 1 Oct 2015 21:54:45 +0000 (UTC)
From:      John Baldwin <jhb@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-9@freebsd.org
Subject:   svn commit: r288463 - in stable: 10/sys/kern 9/sys/kern
Message-ID:  <201510012154.t91LsjM3018844@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jhb
Date: Thu Oct  1 21:54:43 2015
New Revision: 288463
URL: https://svnweb.freebsd.org/changeset/base/288463

Log:
  MFC 286256:
  kgdb uses td_oncpu to determine if a thread is running and should use
  a pcb from stoppcbs[] rather than the thread's PCB.  However, exited threads
  retained td_oncpu from the last time they ran, and newborn threads had their
  CPU fields cleared to zero during fork and thread creation since they are
  in the set of fields zeroed when threads are setup.  To fix, explicitly
  update the CPU fields for exiting threads in sched_throw() to reflect the
  switch out and reset the CPU fields for new threads in sched_fork_thread()
  to NOCPU.

Modified:
  stable/9/sys/kern/sched_4bsd.c
  stable/9/sys/kern/sched_ule.c
Directory Properties:
  stable/9/sys/   (props changed)

Changes in other areas also in this revision:
Modified:
  stable/10/sys/kern/sched_4bsd.c
  stable/10/sys/kern/sched_ule.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/9/sys/kern/sched_4bsd.c
==============================================================================
--- stable/9/sys/kern/sched_4bsd.c	Thu Oct  1 21:52:25 2015	(r288462)
+++ stable/9/sys/kern/sched_4bsd.c	Thu Oct  1 21:54:43 2015	(r288463)
@@ -793,6 +793,8 @@ sched_fork_thread(struct thread *td, str
 {
 	struct td_sched *ts;
 
+	childtd->td_oncpu = NOCPU;
+	childtd->td_lastcpu = NOCPU;
 	childtd->td_estcpu = td->td_estcpu;
 	childtd->td_lock = &sched_lock;
 	childtd->td_cpuset = cpuset_ref(td->td_cpuset);
@@ -1671,6 +1673,8 @@ sched_throw(struct thread *td)
 	} else {
 		lock_profile_release_lock(&sched_lock.lock_object);
 		MPASS(td->td_lock == &sched_lock);
+		td->td_lastcpu = td->td_oncpu;
+		td->td_oncpu = NOCPU;
 	}
 	mtx_assert(&sched_lock, MA_OWNED);
 	KASSERT(curthread->td_md.md_spinlock_count == 1, ("invalid count"));

Modified: stable/9/sys/kern/sched_ule.c
==============================================================================
--- stable/9/sys/kern/sched_ule.c	Thu Oct  1 21:52:25 2015	(r288462)
+++ stable/9/sys/kern/sched_ule.c	Thu Oct  1 21:54:43 2015	(r288463)
@@ -2035,6 +2035,8 @@ sched_fork_thread(struct thread *td, str
 	 */
 	ts = td->td_sched;
 	ts2 = child->td_sched;
+	child->td_oncpu = NOCPU;
+	child->td_lastcpu = NOCPU;
 	child->td_lock = TDQ_LOCKPTR(TDQ_SELF());
 	child->td_cpuset = cpuset_ref(td->td_cpuset);
 	ts2->ts_cpu = ts->ts_cpu;
@@ -2656,6 +2658,8 @@ sched_throw(struct thread *td)
 		MPASS(td->td_lock == TDQ_LOCKPTR(tdq));
 		tdq_load_rem(tdq, td);
 		lock_profile_release_lock(&TDQ_LOCKPTR(tdq)->lock_object);
+		td->td_lastcpu = td->td_oncpu;
+		td->td_oncpu = NOCPU;
 	}
 	KASSERT(curthread->td_md.md_spinlock_count == 1, ("invalid count"));
 	newtd = choosethread();



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