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