284 { "inv_swtch", KSTAT_DATA_UINT64 },
285 { "nthreads", KSTAT_DATA_UINT64 },
286 { "cpumigrate", KSTAT_DATA_UINT64 },
287 { "xcalls", KSTAT_DATA_UINT64 },
288 { "mutex_adenters", KSTAT_DATA_UINT64 },
289 { "rw_rdfails", KSTAT_DATA_UINT64 },
290 { "rw_wrfails", KSTAT_DATA_UINT64 },
291 { "modload", KSTAT_DATA_UINT64 },
292 { "modunload", KSTAT_DATA_UINT64 },
293 { "bawrite", KSTAT_DATA_UINT64 },
294 { "iowait", KSTAT_DATA_UINT64 },
295 };
296
297 static struct cpu_vm_stats_ks_data {
298 kstat_named_t pgrec;
299 kstat_named_t pgfrec;
300 kstat_named_t pgin;
301 kstat_named_t pgpgin;
302 kstat_named_t pgout;
303 kstat_named_t pgpgout;
304 kstat_named_t swapin;
305 kstat_named_t pgswapin;
306 kstat_named_t swapout;
307 kstat_named_t pgswapout;
308 kstat_named_t zfod;
309 kstat_named_t dfree;
310 kstat_named_t scan;
311 kstat_named_t rev;
312 kstat_named_t hat_fault;
313 kstat_named_t as_fault;
314 kstat_named_t maj_fault;
315 kstat_named_t cow_fault;
316 kstat_named_t prot_fault;
317 kstat_named_t softlock;
318 kstat_named_t kernel_asflt;
319 kstat_named_t pgrrun;
320 kstat_named_t execpgin;
321 kstat_named_t execpgout;
322 kstat_named_t execfree;
323 kstat_named_t anonpgin;
324 kstat_named_t anonpgout;
325 kstat_named_t anonfree;
326 kstat_named_t fspgin;
327 kstat_named_t fspgout;
328 kstat_named_t fsfree;
329 } cpu_vm_stats_ks_data_template = {
330 { "pgrec", KSTAT_DATA_UINT64 },
331 { "pgfrec", KSTAT_DATA_UINT64 },
332 { "pgin", KSTAT_DATA_UINT64 },
333 { "pgpgin", KSTAT_DATA_UINT64 },
334 { "pgout", KSTAT_DATA_UINT64 },
335 { "pgpgout", KSTAT_DATA_UINT64 },
336 { "swapin", KSTAT_DATA_UINT64 },
337 { "pgswapin", KSTAT_DATA_UINT64 },
338 { "swapout", KSTAT_DATA_UINT64 },
339 { "pgswapout", KSTAT_DATA_UINT64 },
340 { "zfod", KSTAT_DATA_UINT64 },
341 { "dfree", KSTAT_DATA_UINT64 },
342 { "scan", KSTAT_DATA_UINT64 },
343 { "rev", KSTAT_DATA_UINT64 },
344 { "hat_fault", KSTAT_DATA_UINT64 },
345 { "as_fault", KSTAT_DATA_UINT64 },
346 { "maj_fault", KSTAT_DATA_UINT64 },
347 { "cow_fault", KSTAT_DATA_UINT64 },
348 { "prot_fault", KSTAT_DATA_UINT64 },
349 { "softlock", KSTAT_DATA_UINT64 },
350 { "kernel_asflt", KSTAT_DATA_UINT64 },
351 { "pgrrun", KSTAT_DATA_UINT64 },
352 { "execpgin", KSTAT_DATA_UINT64 },
353 { "execpgout", KSTAT_DATA_UINT64 },
354 { "execfree", KSTAT_DATA_UINT64 },
355 { "anonpgin", KSTAT_DATA_UINT64 },
356 { "anonpgout", KSTAT_DATA_UINT64 },
357 { "anonfree", KSTAT_DATA_UINT64 },
358 { "fspgin", KSTAT_DATA_UINT64 },
359 { "fspgout", KSTAT_DATA_UINT64 },
2665 * on the right queue, but since this isn't
2666 * a performance-critical operation it doesn't
2667 * seem worth the extra code and complexity.
2668 *
2669 * If the thread is weakbound to the cpu then it will
2670 * resist the new binding request until the weak
2671 * binding drops. The cpu_surrender or requeueing
2672 * below could be skipped in such cases (since it
2673 * will have no effect), but that would require
2674 * thread_allowmigrate to acquire thread_lock so
2675 * we'll take the very occasional hit here instead.
2676 */
2677 if (tp->t_state == TS_ONPROC) {
2678 cpu_surrender(tp);
2679 } else if (tp->t_state == TS_RUN) {
2680 cpu_t *ocp = tp->t_cpu;
2681
2682 (void) dispdeq(tp);
2683 setbackdq(tp);
2684 /*
2685 * Either on the bound CPU's disp queue now,
2686 * or swapped out or on the swap queue.
2687 */
2688 ASSERT(tp->t_disp_queue == cp->cpu_disp ||
2689 tp->t_weakbound_cpu == ocp ||
2690 (tp->t_schedflag & (TS_LOAD | TS_ON_SWAPQ))
2691 != TS_LOAD);
2692 }
2693 }
2694 }
2695
2696 /*
2697 * Our binding has changed; set TP_CHANGEBIND.
2698 */
2699 tp->t_proc_flag |= TP_CHANGEBIND;
2700 aston(tp);
2701
2702 thread_unlock(tp);
2703
2704 return (0);
2705 }
2706
2707 #if CPUSET_WORDS > 1
2708
2709 /*
2710 * Functions for implementing cpuset operations when a cpuset is more
2711 * than one word. On platforms where a cpuset is a single word these
3274 cpu_vm_stats_ks_update(kstat_t *ksp, int rw)
3275 {
3276 cpu_t *cp = (cpu_t *)ksp->ks_private;
3277 struct cpu_vm_stats_ks_data *cvskd;
3278 cpu_vm_stats_t *cvs;
3279
3280 if (rw == KSTAT_WRITE)
3281 return (EACCES);
3282
3283 cvs = &cp->cpu_stats.vm;
3284 cvskd = ksp->ks_data;
3285
3286 bcopy(&cpu_vm_stats_ks_data_template, ksp->ks_data,
3287 sizeof (cpu_vm_stats_ks_data_template));
3288 cvskd->pgrec.value.ui64 = cvs->pgrec;
3289 cvskd->pgfrec.value.ui64 = cvs->pgfrec;
3290 cvskd->pgin.value.ui64 = cvs->pgin;
3291 cvskd->pgpgin.value.ui64 = cvs->pgpgin;
3292 cvskd->pgout.value.ui64 = cvs->pgout;
3293 cvskd->pgpgout.value.ui64 = cvs->pgpgout;
3294 cvskd->swapin.value.ui64 = cvs->swapin;
3295 cvskd->pgswapin.value.ui64 = cvs->pgswapin;
3296 cvskd->swapout.value.ui64 = cvs->swapout;
3297 cvskd->pgswapout.value.ui64 = cvs->pgswapout;
3298 cvskd->zfod.value.ui64 = cvs->zfod;
3299 cvskd->dfree.value.ui64 = cvs->dfree;
3300 cvskd->scan.value.ui64 = cvs->scan;
3301 cvskd->rev.value.ui64 = cvs->rev;
3302 cvskd->hat_fault.value.ui64 = cvs->hat_fault;
3303 cvskd->as_fault.value.ui64 = cvs->as_fault;
3304 cvskd->maj_fault.value.ui64 = cvs->maj_fault;
3305 cvskd->cow_fault.value.ui64 = cvs->cow_fault;
3306 cvskd->prot_fault.value.ui64 = cvs->prot_fault;
3307 cvskd->softlock.value.ui64 = cvs->softlock;
3308 cvskd->kernel_asflt.value.ui64 = cvs->kernel_asflt;
3309 cvskd->pgrrun.value.ui64 = cvs->pgrrun;
3310 cvskd->execpgin.value.ui64 = cvs->execpgin;
3311 cvskd->execpgout.value.ui64 = cvs->execpgout;
3312 cvskd->execfree.value.ui64 = cvs->execfree;
3313 cvskd->anonpgin.value.ui64 = cvs->anonpgin;
3314 cvskd->anonpgout.value.ui64 = cvs->anonpgout;
3315 cvskd->anonfree.value.ui64 = cvs->anonfree;
3316 cvskd->fspgin.value.ui64 = cvs->fspgin;
3317 cvskd->fspgout.value.ui64 = cvs->fspgout;
3404 cso->cpu_sysinfo.modload = CPU_STATS(cp, sys.modload);
3405 cso->cpu_sysinfo.modunload = CPU_STATS(cp, sys.modunload);
3406 cso->cpu_sysinfo.bawrite = CPU_STATS(cp, sys.bawrite);
3407 cso->cpu_sysinfo.rw_enters = 0;
3408 cso->cpu_sysinfo.win_uo_cnt = 0;
3409 cso->cpu_sysinfo.win_uu_cnt = 0;
3410 cso->cpu_sysinfo.win_so_cnt = 0;
3411 cso->cpu_sysinfo.win_su_cnt = 0;
3412 cso->cpu_sysinfo.win_suo_cnt = 0;
3413
3414 cso->cpu_syswait.iowait = CPU_STATS(cp, sys.iowait);
3415 cso->cpu_syswait.swap = 0;
3416 cso->cpu_syswait.physio = 0;
3417
3418 cso->cpu_vminfo.pgrec = CPU_STATS(cp, vm.pgrec);
3419 cso->cpu_vminfo.pgfrec = CPU_STATS(cp, vm.pgfrec);
3420 cso->cpu_vminfo.pgin = CPU_STATS(cp, vm.pgin);
3421 cso->cpu_vminfo.pgpgin = CPU_STATS(cp, vm.pgpgin);
3422 cso->cpu_vminfo.pgout = CPU_STATS(cp, vm.pgout);
3423 cso->cpu_vminfo.pgpgout = CPU_STATS(cp, vm.pgpgout);
3424 cso->cpu_vminfo.swapin = CPU_STATS(cp, vm.swapin);
3425 cso->cpu_vminfo.pgswapin = CPU_STATS(cp, vm.pgswapin);
3426 cso->cpu_vminfo.swapout = CPU_STATS(cp, vm.swapout);
3427 cso->cpu_vminfo.pgswapout = CPU_STATS(cp, vm.pgswapout);
3428 cso->cpu_vminfo.zfod = CPU_STATS(cp, vm.zfod);
3429 cso->cpu_vminfo.dfree = CPU_STATS(cp, vm.dfree);
3430 cso->cpu_vminfo.scan = CPU_STATS(cp, vm.scan);
3431 cso->cpu_vminfo.rev = CPU_STATS(cp, vm.rev);
3432 cso->cpu_vminfo.hat_fault = CPU_STATS(cp, vm.hat_fault);
3433 cso->cpu_vminfo.as_fault = CPU_STATS(cp, vm.as_fault);
3434 cso->cpu_vminfo.maj_fault = CPU_STATS(cp, vm.maj_fault);
3435 cso->cpu_vminfo.cow_fault = CPU_STATS(cp, vm.cow_fault);
3436 cso->cpu_vminfo.prot_fault = CPU_STATS(cp, vm.prot_fault);
3437 cso->cpu_vminfo.softlock = CPU_STATS(cp, vm.softlock);
3438 cso->cpu_vminfo.kernel_asflt = CPU_STATS(cp, vm.kernel_asflt);
3439 cso->cpu_vminfo.pgrrun = CPU_STATS(cp, vm.pgrrun);
3440 cso->cpu_vminfo.execpgin = CPU_STATS(cp, vm.execpgin);
3441 cso->cpu_vminfo.execpgout = CPU_STATS(cp, vm.execpgout);
3442 cso->cpu_vminfo.execfree = CPU_STATS(cp, vm.execfree);
3443 cso->cpu_vminfo.anonpgin = CPU_STATS(cp, vm.anonpgin);
3444 cso->cpu_vminfo.anonpgout = CPU_STATS(cp, vm.anonpgout);
3445 cso->cpu_vminfo.anonfree = CPU_STATS(cp, vm.anonfree);
3446 cso->cpu_vminfo.fspgin = CPU_STATS(cp, vm.fspgin);
3447 cso->cpu_vminfo.fspgout = CPU_STATS(cp, vm.fspgout);
|
284 { "inv_swtch", KSTAT_DATA_UINT64 },
285 { "nthreads", KSTAT_DATA_UINT64 },
286 { "cpumigrate", KSTAT_DATA_UINT64 },
287 { "xcalls", KSTAT_DATA_UINT64 },
288 { "mutex_adenters", KSTAT_DATA_UINT64 },
289 { "rw_rdfails", KSTAT_DATA_UINT64 },
290 { "rw_wrfails", KSTAT_DATA_UINT64 },
291 { "modload", KSTAT_DATA_UINT64 },
292 { "modunload", KSTAT_DATA_UINT64 },
293 { "bawrite", KSTAT_DATA_UINT64 },
294 { "iowait", KSTAT_DATA_UINT64 },
295 };
296
297 static struct cpu_vm_stats_ks_data {
298 kstat_named_t pgrec;
299 kstat_named_t pgfrec;
300 kstat_named_t pgin;
301 kstat_named_t pgpgin;
302 kstat_named_t pgout;
303 kstat_named_t pgpgout;
304 kstat_named_t zfod;
305 kstat_named_t dfree;
306 kstat_named_t scan;
307 kstat_named_t rev;
308 kstat_named_t hat_fault;
309 kstat_named_t as_fault;
310 kstat_named_t maj_fault;
311 kstat_named_t cow_fault;
312 kstat_named_t prot_fault;
313 kstat_named_t softlock;
314 kstat_named_t kernel_asflt;
315 kstat_named_t pgrrun;
316 kstat_named_t execpgin;
317 kstat_named_t execpgout;
318 kstat_named_t execfree;
319 kstat_named_t anonpgin;
320 kstat_named_t anonpgout;
321 kstat_named_t anonfree;
322 kstat_named_t fspgin;
323 kstat_named_t fspgout;
324 kstat_named_t fsfree;
325 } cpu_vm_stats_ks_data_template = {
326 { "pgrec", KSTAT_DATA_UINT64 },
327 { "pgfrec", KSTAT_DATA_UINT64 },
328 { "pgin", KSTAT_DATA_UINT64 },
329 { "pgpgin", KSTAT_DATA_UINT64 },
330 { "pgout", KSTAT_DATA_UINT64 },
331 { "pgpgout", KSTAT_DATA_UINT64 },
332 { "zfod", KSTAT_DATA_UINT64 },
333 { "dfree", KSTAT_DATA_UINT64 },
334 { "scan", KSTAT_DATA_UINT64 },
335 { "rev", KSTAT_DATA_UINT64 },
336 { "hat_fault", KSTAT_DATA_UINT64 },
337 { "as_fault", KSTAT_DATA_UINT64 },
338 { "maj_fault", KSTAT_DATA_UINT64 },
339 { "cow_fault", KSTAT_DATA_UINT64 },
340 { "prot_fault", KSTAT_DATA_UINT64 },
341 { "softlock", KSTAT_DATA_UINT64 },
342 { "kernel_asflt", KSTAT_DATA_UINT64 },
343 { "pgrrun", KSTAT_DATA_UINT64 },
344 { "execpgin", KSTAT_DATA_UINT64 },
345 { "execpgout", KSTAT_DATA_UINT64 },
346 { "execfree", KSTAT_DATA_UINT64 },
347 { "anonpgin", KSTAT_DATA_UINT64 },
348 { "anonpgout", KSTAT_DATA_UINT64 },
349 { "anonfree", KSTAT_DATA_UINT64 },
350 { "fspgin", KSTAT_DATA_UINT64 },
351 { "fspgout", KSTAT_DATA_UINT64 },
2657 * on the right queue, but since this isn't
2658 * a performance-critical operation it doesn't
2659 * seem worth the extra code and complexity.
2660 *
2661 * If the thread is weakbound to the cpu then it will
2662 * resist the new binding request until the weak
2663 * binding drops. The cpu_surrender or requeueing
2664 * below could be skipped in such cases (since it
2665 * will have no effect), but that would require
2666 * thread_allowmigrate to acquire thread_lock so
2667 * we'll take the very occasional hit here instead.
2668 */
2669 if (tp->t_state == TS_ONPROC) {
2670 cpu_surrender(tp);
2671 } else if (tp->t_state == TS_RUN) {
2672 cpu_t *ocp = tp->t_cpu;
2673
2674 (void) dispdeq(tp);
2675 setbackdq(tp);
2676 /*
2677 * On the bound CPU's disp queue now.
2678 */
2679 ASSERT(tp->t_disp_queue == cp->cpu_disp ||
2680 tp->t_weakbound_cpu == ocp);
2681 }
2682 }
2683 }
2684
2685 /*
2686 * Our binding has changed; set TP_CHANGEBIND.
2687 */
2688 tp->t_proc_flag |= TP_CHANGEBIND;
2689 aston(tp);
2690
2691 thread_unlock(tp);
2692
2693 return (0);
2694 }
2695
2696 #if CPUSET_WORDS > 1
2697
2698 /*
2699 * Functions for implementing cpuset operations when a cpuset is more
2700 * than one word. On platforms where a cpuset is a single word these
3263 cpu_vm_stats_ks_update(kstat_t *ksp, int rw)
3264 {
3265 cpu_t *cp = (cpu_t *)ksp->ks_private;
3266 struct cpu_vm_stats_ks_data *cvskd;
3267 cpu_vm_stats_t *cvs;
3268
3269 if (rw == KSTAT_WRITE)
3270 return (EACCES);
3271
3272 cvs = &cp->cpu_stats.vm;
3273 cvskd = ksp->ks_data;
3274
3275 bcopy(&cpu_vm_stats_ks_data_template, ksp->ks_data,
3276 sizeof (cpu_vm_stats_ks_data_template));
3277 cvskd->pgrec.value.ui64 = cvs->pgrec;
3278 cvskd->pgfrec.value.ui64 = cvs->pgfrec;
3279 cvskd->pgin.value.ui64 = cvs->pgin;
3280 cvskd->pgpgin.value.ui64 = cvs->pgpgin;
3281 cvskd->pgout.value.ui64 = cvs->pgout;
3282 cvskd->pgpgout.value.ui64 = cvs->pgpgout;
3283 cvskd->zfod.value.ui64 = cvs->zfod;
3284 cvskd->dfree.value.ui64 = cvs->dfree;
3285 cvskd->scan.value.ui64 = cvs->scan;
3286 cvskd->rev.value.ui64 = cvs->rev;
3287 cvskd->hat_fault.value.ui64 = cvs->hat_fault;
3288 cvskd->as_fault.value.ui64 = cvs->as_fault;
3289 cvskd->maj_fault.value.ui64 = cvs->maj_fault;
3290 cvskd->cow_fault.value.ui64 = cvs->cow_fault;
3291 cvskd->prot_fault.value.ui64 = cvs->prot_fault;
3292 cvskd->softlock.value.ui64 = cvs->softlock;
3293 cvskd->kernel_asflt.value.ui64 = cvs->kernel_asflt;
3294 cvskd->pgrrun.value.ui64 = cvs->pgrrun;
3295 cvskd->execpgin.value.ui64 = cvs->execpgin;
3296 cvskd->execpgout.value.ui64 = cvs->execpgout;
3297 cvskd->execfree.value.ui64 = cvs->execfree;
3298 cvskd->anonpgin.value.ui64 = cvs->anonpgin;
3299 cvskd->anonpgout.value.ui64 = cvs->anonpgout;
3300 cvskd->anonfree.value.ui64 = cvs->anonfree;
3301 cvskd->fspgin.value.ui64 = cvs->fspgin;
3302 cvskd->fspgout.value.ui64 = cvs->fspgout;
3389 cso->cpu_sysinfo.modload = CPU_STATS(cp, sys.modload);
3390 cso->cpu_sysinfo.modunload = CPU_STATS(cp, sys.modunload);
3391 cso->cpu_sysinfo.bawrite = CPU_STATS(cp, sys.bawrite);
3392 cso->cpu_sysinfo.rw_enters = 0;
3393 cso->cpu_sysinfo.win_uo_cnt = 0;
3394 cso->cpu_sysinfo.win_uu_cnt = 0;
3395 cso->cpu_sysinfo.win_so_cnt = 0;
3396 cso->cpu_sysinfo.win_su_cnt = 0;
3397 cso->cpu_sysinfo.win_suo_cnt = 0;
3398
3399 cso->cpu_syswait.iowait = CPU_STATS(cp, sys.iowait);
3400 cso->cpu_syswait.swap = 0;
3401 cso->cpu_syswait.physio = 0;
3402
3403 cso->cpu_vminfo.pgrec = CPU_STATS(cp, vm.pgrec);
3404 cso->cpu_vminfo.pgfrec = CPU_STATS(cp, vm.pgfrec);
3405 cso->cpu_vminfo.pgin = CPU_STATS(cp, vm.pgin);
3406 cso->cpu_vminfo.pgpgin = CPU_STATS(cp, vm.pgpgin);
3407 cso->cpu_vminfo.pgout = CPU_STATS(cp, vm.pgout);
3408 cso->cpu_vminfo.pgpgout = CPU_STATS(cp, vm.pgpgout);
3409 cso->cpu_vminfo.zfod = CPU_STATS(cp, vm.zfod);
3410 cso->cpu_vminfo.dfree = CPU_STATS(cp, vm.dfree);
3411 cso->cpu_vminfo.scan = CPU_STATS(cp, vm.scan);
3412 cso->cpu_vminfo.rev = CPU_STATS(cp, vm.rev);
3413 cso->cpu_vminfo.hat_fault = CPU_STATS(cp, vm.hat_fault);
3414 cso->cpu_vminfo.as_fault = CPU_STATS(cp, vm.as_fault);
3415 cso->cpu_vminfo.maj_fault = CPU_STATS(cp, vm.maj_fault);
3416 cso->cpu_vminfo.cow_fault = CPU_STATS(cp, vm.cow_fault);
3417 cso->cpu_vminfo.prot_fault = CPU_STATS(cp, vm.prot_fault);
3418 cso->cpu_vminfo.softlock = CPU_STATS(cp, vm.softlock);
3419 cso->cpu_vminfo.kernel_asflt = CPU_STATS(cp, vm.kernel_asflt);
3420 cso->cpu_vminfo.pgrrun = CPU_STATS(cp, vm.pgrrun);
3421 cso->cpu_vminfo.execpgin = CPU_STATS(cp, vm.execpgin);
3422 cso->cpu_vminfo.execpgout = CPU_STATS(cp, vm.execpgout);
3423 cso->cpu_vminfo.execfree = CPU_STATS(cp, vm.execfree);
3424 cso->cpu_vminfo.anonpgin = CPU_STATS(cp, vm.anonpgin);
3425 cso->cpu_vminfo.anonpgout = CPU_STATS(cp, vm.anonpgout);
3426 cso->cpu_vminfo.anonfree = CPU_STATS(cp, vm.anonfree);
3427 cso->cpu_vminfo.fspgin = CPU_STATS(cp, vm.fspgin);
3428 cso->cpu_vminfo.fspgout = CPU_STATS(cp, vm.fspgout);
|