Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 26 May 2012 17:18:50 +0000
From:      rudot@FreeBSD.org
To:        svn-soc-all@FreeBSD.org
Subject:   socsvn commit: r236507 - in soc2012/rudot: aux sys/kern
Message-ID:  <20120526171850.EDEB81065674@hub.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: rudot
Date: Sat May 26 17:18:50 2012
New Revision: 236507
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=236507

Log:
  rctl can add rule specifying per process %cpu limit. The rules do take effect.
  The scheduler pauses processes that are over limit. This will probably change.

Added:
  soc2012/rudot/aux/enter_kdb.sh   (contents, props changed)
Modified:
  soc2012/rudot/aux/add.sh
  soc2012/rudot/aux/build_kernel.sh
  soc2012/rudot/aux/dummy_process.c
  soc2012/rudot/sys/kern/sched_4bsd.c

Modified: soc2012/rudot/aux/add.sh
==============================================================================
--- soc2012/rudot/aux/add.sh	Sat May 26 16:42:47 2012	(r236506)
+++ soc2012/rudot/aux/add.sh	Sat May 26 17:18:50 2012	(r236507)
@@ -1,8 +1,14 @@
-if [ ! $# == 1 ]; then
-	echo "Usage: $0 pid"
+if [ $# == 0 ]; then
+	echo "Usage: $0 pid [pct]"
 	exit
 fi
 
 PID=$1
 
-rctl -a process:${PID}:pcpu:deny=50
+if [ -z $2 ]; then
+	PCT=50
+else
+	PCT=$2
+fi
+
+rctl -a process:${PID}:pcpu:deny=${PCT}

Modified: soc2012/rudot/aux/build_kernel.sh
==============================================================================
--- soc2012/rudot/aux/build_kernel.sh	Sat May 26 16:42:47 2012	(r236506)
+++ soc2012/rudot/aux/build_kernel.sh	Sat May 26 17:18:50 2012	(r236507)
@@ -1,5 +1,9 @@
 # check http://www.mail-archive.com/freebsd-hackers@freebsd.org/msg23424.html
 
+if [ `hostname` != "target" ]; then
+	echo "You can run it only on the target machine."
+	exit
+fi
+
 cd /usr/src
-make buildkernel -DNO_MODULES KERNCONF=RCTL
-make installkernel -DNO_MODULES KERNCONF=RCTL
+make buildkernel -DNO_MODULES -DNO_CLEAN KERNCONF=RCTL && make installkernel -DNO_MODULES KERNCONF=RCTL

Modified: soc2012/rudot/aux/dummy_process.c
==============================================================================
--- soc2012/rudot/aux/dummy_process.c	Sat May 26 16:42:47 2012	(r236506)
+++ soc2012/rudot/aux/dummy_process.c	Sat May 26 17:18:50 2012	(r236507)
@@ -8,7 +8,14 @@
 	pid_t myPid = getpid();
 	printf("%d\n", myPid);
 
-	pause();
+	// pause();
+
+	int i = 75;
+	for (;;) {
+		i++;
+		if (i % 48 == 13)
+			i++;
+	}
 
 	return (0);
 }

Added: soc2012/rudot/aux/enter_kdb.sh
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ soc2012/rudot/aux/enter_kdb.sh	Sat May 26 17:18:50 2012	(r236507)
@@ -0,0 +1 @@
+sysctl debug.kdb.enter=1

Modified: soc2012/rudot/sys/kern/sched_4bsd.c
==============================================================================
--- soc2012/rudot/sys/kern/sched_4bsd.c	Sat May 26 16:42:47 2012	(r236506)
+++ soc2012/rudot/sys/kern/sched_4bsd.c	Sat May 26 17:18:50 2012	(r236507)
@@ -511,9 +511,6 @@
 #endif
 				ts->ts_cpticks = 0;
 			}
-#ifdef RACCT
-			racct_set(p, RACCT_PCTCPU, ts->ts_pctcpu);
-#endif						
 			/*
 			 * If there are ANY running threads in this process,
 			 * then don't count it as sleeping.
@@ -677,18 +674,6 @@
 	return (sched_quantum);
 }
 
-#ifdef RACCT
-static int
-sched_racct_pcpu_deny(struct thread *td)
-{
-	struct proc *p;
-
-	p = td->td_proc;
-
-	return (0);
-}
-#endif
-
 /*
  * We adjust the priority of the current process.  The priority of
  * a process gets worse as it accumulates CPU time.  The cpu usage
@@ -708,6 +693,12 @@
 {
 	struct pcpuidlestat *stat;
 	struct td_sched *ts;
+#ifdef RACCT
+	int error;
+	int pct_human;
+	fixpt_t pctcpu;
+	struct thread *tdp;
+#endif
 
 	THREAD_LOCK_ASSERT(td, MA_OWNED);
 	ts = td->td_sched;
@@ -727,15 +718,26 @@
 	    ticks - PCPU_GET(switchticks) >= sched_quantum)
 		td->td_flags |= TDF_NEEDRESCHED;
 
-#ifdef RACCT
-	if (!TD_IS_IDLETHREAD(td) &&
-	    sched_racct_pcpu_deny(td))
-		td->td_flags |= TDF_NEEDRESCHED;
-#endif
-
 	stat = DPCPU_PTR(idlestat);
 	stat->oldidlecalls = stat->idlecalls;
 	stat->idlecalls = 0;
+
+#ifdef RACCT
+	pctcpu = sched_pctcpu(td);
+	FOREACH_THREAD_IN_PROC(td->td_proc, tdp) {
+		if (td == tdp)
+		    continue;
+		thread_lock(tdp);
+		pctcpu += sched_pctcpu(tdp);
+		thread_unlock(tdp);
+	}
+	pct_human = (100 * pctcpu) / FSCALE;
+	error = racct_set(td->td_proc, RACCT_PCTCPU, pct_human);
+	if ((error != 0) ||
+	    (pct_human >= racct_get_limit(td->td_proc, RACCT_PCTCPU))) {
+		pause("racct", hz);
+	}
+#endif
 }
 
 /*



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