Date: Thu, 05 Jul 2012 10:21:02 +0000 From: rudot@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r238991 - in soc2012/rudot: aux sys/kern sys/sys Message-ID: <20120705102102.706A5106566B@hub.freebsd.org>
next in thread | raw e-mail | index | archive | help
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
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20120705102102.706A5106566B>