socsvn commit: r238991 - in soc2012/rudot: aux sys/kern sys/sys

rudot at FreeBSD.org rudot at FreeBSD.org
Thu Jul 5 10:21:04 UTC 2012


Author: rudot
Date: Thu Jul  5 10:21:01 2012
New Revision: 238991
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=238991

Log:
  trying different approach: instead of modifying scheduler I sleep in userret. It looks well so far to me.

Modified:
  soc2012/rudot/aux/psSum.sh
  soc2012/rudot/sys/kern/kern_racct.c
  soc2012/rudot/sys/kern/sched_4bsd.c
  soc2012/rudot/sys/kern/subr_trap.c
  soc2012/rudot/sys/sys/racct.h
  soc2012/rudot/sys/sys/sched.h

Modified: soc2012/rudot/aux/psSum.sh
==============================================================================
--- soc2012/rudot/aux/psSum.sh	Thu Jul  5 10:06:59 2012	(r238990)
+++ soc2012/rudot/aux/psSum.sh	Thu Jul  5 10:21:01 2012	(r238991)
@@ -66,7 +66,7 @@
 do
 	PCPU=`user_pcpu "$USER"`
 	
-	if [ "$PCPU" = "0" ]; then
+	if echo "$PCPU" "0.2" | awk '{exit !($1 < $2)}'; then
 		sleep $DELAY_SLOT
 		continue
 	fi

Modified: soc2012/rudot/sys/kern/kern_racct.c
==============================================================================
--- soc2012/rudot/sys/kern/kern_racct.c	Thu Jul  5 10:06:59 2012	(r238990)
+++ soc2012/rudot/sys/kern/kern_racct.c	Thu Jul  5 10:21:01 2012	(r238991)
@@ -65,7 +65,7 @@
 
 FEATURE(racct, "Resource Accounting");
 
-static struct mtx racct_lock;
+struct mtx racct_lock;
 MTX_SYSINIT(racct_lock, &racct_lock, "racct lock", MTX_DEF);
 
 static uma_zone_t racct_zone;
@@ -896,67 +896,50 @@
 racct_proc_disable(struct proc *p)
 {
 	struct thread *td;
+	int cpuid;
 
 	PROC_LOCK_ASSERT(p, MA_OWNED);
+	mtx_assert(&racct_lock, MA_OWNED);
+
+	p->p_racct->r_pflags |= R_PCPUEXCEEDED;
+
 	FOREACH_THREAD_IN_PROC(p, td) {
-		if (td->td_critnest > 1)
-			continue;
-		if ((td->td_flags & TDF_RACCT_PCTCPU) == 0) {
+		switch (td->td_state) {
+		case TDS_RUNQ:
 			thread_lock(td);
-			td->td_flags |= TDF_RACCT_PCTCPU;
-			switch (td->td_state) {
-			case TDS_RUNQ:
-				sched_rem(td);
-				td->td_flags |= TDF_RACCT_RQ;
-				break;
-			case TDS_RUNNING:
-				td->td_flags |= TDF_NEEDRESCHED;
-#ifdef SMP
-				if (td != curthread)
-					ipi_cpu(td->td_oncpu, IPI_AST);
-#endif
-				break;
-			default:
-				break;	
-			}
-
+			td->td_flags |= TDF_NEEDRESCHED;
 			thread_unlock(td);
+			break;
+		case TDS_RUNNING:
+			thread_lock(td);
+			cpuid = td->td_oncpu;
+			td->td_flags |= TDF_NEEDRESCHED;
+			if ((cpuid != NOCPU) && (td != curthread))
+				ipi_cpu(cpuid, IPI_AST);
+			thread_unlock(td);
+			break;
+		default:
+			break;
 		}
 	}
 }
 
-/*
- * Returns true if at least one of the process threads
- * has been disabled.
- */
-static int
+int
 racct_proc_disabled(struct proc *p)
 {
-	struct thread *td;
-
-	PROC_LOCK_ASSERT(p, MA_OWNED);
-	FOREACH_THREAD_IN_PROC(p, td) {
-		if (td->td_flags & TDF_RACCT_PCTCPU)
-			return (1);	
-	}
+	mtx_assert(&racct_lock, MA_OWNED);
 
-	return (0);
+	return (p->p_racct->r_pflags & R_PCPUEXCEEDED);
 }
 
 static void
 racct_proc_enable(struct proc *p)
 {
-	struct thread *td;
+	mtx_assert(&racct_lock, MA_OWNED);
 
-	PROC_LOCK_ASSERT(p, MA_OWNED);
-	FOREACH_THREAD_IN_PROC(p, td) {
-		thread_lock(td);
-		td->td_flags &= ~TDF_RACCT_PCTCPU;
-		if (td->td_flags & TDF_RACCT_RQ) {
-			td->td_flags &= ~TDF_RACCT_RQ;
-			sched_add(td, SRQ_BORING);
-		}
-		thread_unlock(td);
+	if (racct_proc_disabled(p)) {
+		p->p_racct->r_pflags &= ~R_PCPUEXCEEDED;
+		wakeup(p->p_racct);
 	}
 }
 

Modified: soc2012/rudot/sys/kern/sched_4bsd.c
==============================================================================
--- soc2012/rudot/sys/kern/sched_4bsd.c	Thu Jul  5 10:06:59 2012	(r238990)
+++ soc2012/rudot/sys/kern/sched_4bsd.c	Thu Jul  5 10:21:01 2012	(r238991)
@@ -1260,18 +1260,6 @@
 	SDT_PROBE4(sched, , , enqueue, td, td->td_proc, NULL, 
 	    flags & SRQ_PREEMPTED);
 
-#ifdef RACCT
-	/*
-	 * Skip adding threads to the rq that have exceeded their racct
-	 * pctcpu limits. Also set a flag that says when the thread is
-	 * again within its pctcpu limits, it should be also added to
-	 * the rq.
-	 */
-	if (td->td_flags & TDF_RACCT_PCTCPU) {
-		td->td_flags |= TDF_RACCT_RQ;
-		return;
-	}
-#endif
 	/*
 	 * Now that the thread is moving to the run-queue, set the lock
 	 * to the scheduler's lock.
@@ -1578,6 +1566,7 @@
 	return (ts->ts_pctcpu);
 }
 
+#ifdef	RACCT
 fixpt_t
 sched_pctcpu_delta(struct thread *td)
 {
@@ -1605,6 +1594,7 @@
 
 	return (delta);
 }
+#endif
 
 void
 sched_tick(int cnt)

Modified: soc2012/rudot/sys/kern/subr_trap.c
==============================================================================
--- soc2012/rudot/sys/kern/subr_trap.c	Thu Jul  5 10:06:59 2012	(r238990)
+++ soc2012/rudot/sys/kern/subr_trap.c	Thu Jul  5 10:21:01 2012	(r238991)
@@ -68,6 +68,7 @@
 #include <sys/sysent.h>
 #include <sys/systm.h>
 #include <sys/vmmeter.h>
+#include <sys/racct.h>
 #ifdef KTRACE
 #include <sys/uio.h>
 #include <sys/ktrace.h>
@@ -92,6 +93,8 @@
 
 #include <security/mac/mac_framework.h>
 
+extern struct mtx racct_lock;
+
 /*
  * Define the code needed before returning to user mode, for trap and
  * syscall.
@@ -148,6 +151,13 @@
 #ifdef XEN
 	PT_UPDATES_FLUSH();
 #endif
+#ifdef	RACCT
+	mtx_lock(&racct_lock);
+	while (racct_proc_disabled(p)) {
+		msleep(p->p_racct, &racct_lock, 0, "racct", 0);
+	}
+	mtx_unlock(&racct_lock);
+#endif
 }
 
 /*

Modified: soc2012/rudot/sys/sys/racct.h
==============================================================================
--- soc2012/rudot/sys/sys/racct.h	Thu Jul  5 10:06:59 2012	(r238990)
+++ soc2012/rudot/sys/sys/racct.h	Thu Jul  5 10:21:01 2012	(r238991)
@@ -122,8 +122,16 @@
 struct racct {
 	int64_t				r_resources[RACCT_MAX + 1];
 	LIST_HEAD(, rctl_rule_link)	r_rule_links;
+
+	/*
+	 * The racct extension to the process flags
+	 */
+	int				r_pflags;
 };
 
+/* Flags kept in r_pflags. */
+#define	R_PCPUEXCEEDED	0x00001 /* Process %cpu limits have been exceeded. */
+
 int	racct_add(struct proc *p, int resource, uint64_t amount);
 void	racct_add_cred(struct ucred *cred, int resource, uint64_t amount);
 void	racct_add_force(struct proc *p, int resource, uint64_t amount);
@@ -145,5 +153,6 @@
 	    struct ucred *newcred);
 void	racct_move(struct racct *dest, struct racct *src);
 u_int	racct_getpcpu(struct proc *p);
+int	racct_proc_disabled(struct proc *p);
 
 #endif /* !_RACCT_H_ */

Modified: soc2012/rudot/sys/sys/sched.h
==============================================================================
--- soc2012/rudot/sys/sys/sched.h	Thu Jul  5 10:06:59 2012	(r238990)
+++ soc2012/rudot/sys/sys/sched.h	Thu Jul  5 10:21:01 2012	(r238991)
@@ -94,7 +94,6 @@
 void	sched_lend_prio(struct thread *td, u_char prio);
 void	sched_lend_user_prio(struct thread *td, u_char pri);
 fixpt_t	sched_pctcpu(struct thread *td);
-fixpt_t	sched_pctcpu_delta(struct thread *td);
 void	sched_prio(struct thread *td, u_char prio);
 void	sched_sleep(struct thread *td, int prio);
 void	sched_switch(struct thread *td, struct thread *newtd, int flags);
@@ -104,6 +103,9 @@
 void	sched_userret(struct thread *td);
 void	sched_wakeup(struct thread *td);
 void	sched_preempt(struct thread *td);
+#ifdef	RACCT
+fixpt_t	sched_pctcpu_delta(struct thread *td);
+#endif
 
 /*
  * Threads are moved on and off of run queues


More information about the svn-soc-all mailing list