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