| 1244 | } |
| 1245 | |
| 1246 | static void |
| 1247 | racctd(void) |
| 1248 | { |
| 1249 | struct thread *td; |
| 1250 | struct proc *p; |
| 1251 | struct timeval wallclock; |
| 1252 | uint64_t pct, pct_estimate, runtime; |
| 1253 | |
| 1254 | ASSERT_RACCT_ENABLED(); |
| 1255 | |
| 1256 | for (;;) { |
| 1257 | racct_decay(); |
| 1258 | |
| 1259 | sx_slock(&allproc_lock); |
| 1260 | |
| 1261 | FOREACH_PROC_IN_SYSTEM(p) { |
| 1262 | PROC_LOCK(p); |
| 1263 | if (p->p_state != PRS_NORMAL) { |
| 1264 | if (p->p_state == PRS_ZOMBIE) |
| 1265 | racct_set(p, RACCT_PCTCPU, 0); |
| 1266 | PROC_UNLOCK(p); |
| 1267 | continue; |
| 1268 | } |
| 1269 | |
| 1270 | microuptime(&wallclock); |
| 1271 | timevalsub(&wallclock, &p->p_stats->p_start); |
| 1272 | PROC_STATLOCK(p); |
| 1273 | FOREACH_THREAD_IN_PROC(p, td) |
| 1274 | ruxagg(p, td); |
| 1275 | runtime = cputick2usec(p->p_rux.rux_runtime); |
| 1276 | PROC_STATUNLOCK(p); |
| 1277 | #ifdef notyet |
| 1278 | KASSERT(runtime >= p->p_prev_runtime, |
| 1279 | ("runtime < p_prev_runtime")); |
| 1280 | #else |
| 1281 | if (runtime < p->p_prev_runtime) |
| 1282 | runtime = p->p_prev_runtime; |
| 1283 | #endif |
| 1284 | p->p_prev_runtime = runtime; |
| 1285 | if (wallclock.tv_sec > 0 || wallclock.tv_usec > 0) { |
| 1286 | pct_estimate = (1000000 * runtime * 100) / |
| 1287 | ((uint64_t)wallclock.tv_sec * 1000000 + |
| 1288 | wallclock.tv_usec); |
| 1289 | } else |
| 1290 | pct_estimate = 0; |
| 1291 | pct = racct_getpcpu(p, pct_estimate); |
| 1292 | RACCT_LOCK(); |
| 1293 | #ifdef RCTL |
| 1294 | rctl_throttle_decay(p->p_racct, RACCT_READBPS); |
| 1295 | rctl_throttle_decay(p->p_racct, RACCT_WRITEBPS); |
| 1296 | rctl_throttle_decay(p->p_racct, RACCT_READIOPS); |
| 1297 | rctl_throttle_decay(p->p_racct, RACCT_WRITEIOPS); |
| 1298 | #endif |
| 1299 | racct_set_locked(p, RACCT_PCTCPU, pct, 1); |
| 1300 | racct_set_locked(p, RACCT_CPU, runtime, 0); |
| 1301 | racct_set_locked(p, RACCT_WALLCLOCK, |
| 1302 | (uint64_t)wallclock.tv_sec * 1000000 + |
| 1303 | wallclock.tv_usec, 0); |
nothing calls this directly
no test coverage detected