Print this page
6583 remove whole-process swapping


 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);