head 1.46; access; symbols netbsd-10-0-RELEASE:1.46 netbsd-10-0-RC6:1.46 netbsd-10-0-RC5:1.46 netbsd-10-0-RC4:1.46 netbsd-10-0-RC3:1.46 netbsd-10-0-RC2:1.46 thorpej-ifq:1.46.0.24 thorpej-ifq-base:1.46 thorpej-altq-separation:1.46.0.22 thorpej-altq-separation-base:1.46 netbsd-10-0-RC1:1.46 netbsd-10:1.46.0.20 netbsd-10-base:1.46 bouyer-sunxi-drm:1.46.0.18 bouyer-sunxi-drm-base:1.46 netbsd-9-3-RELEASE:1.40 thorpej-i2c-spi-conf2:1.46.0.16 thorpej-i2c-spi-conf2-base:1.46 thorpej-futex2:1.46.0.14 thorpej-futex2-base:1.46 thorpej-cfargs2:1.46.0.12 thorpej-cfargs2-base:1.46 cjep_sun2x-base1:1.46 cjep_sun2x:1.46.0.10 cjep_sun2x-base:1.46 cjep_staticlib_x-base1:1.46 netbsd-9-2-RELEASE:1.40 cjep_staticlib_x:1.46.0.8 cjep_staticlib_x-base:1.46 thorpej-i2c-spi-conf:1.46.0.6 thorpej-i2c-spi-conf-base:1.46 thorpej-cfargs:1.46.0.4 thorpej-cfargs-base:1.46 thorpej-futex:1.46.0.2 thorpej-futex-base:1.46 netbsd-9-1-RELEASE:1.40 bouyer-xenpvh-base2:1.43 phil-wifi-20200421:1.43 bouyer-xenpvh-base1:1.43 phil-wifi-20200411:1.43 bouyer-xenpvh:1.43.0.6 bouyer-xenpvh-base:1.43 is-mlppp:1.43.0.4 is-mlppp-base:1.43 phil-wifi-20200406:1.43 netbsd-8-2-RELEASE:1.38 ad-namecache-base3:1.43 netbsd-9-0-RELEASE:1.40 netbsd-9-0-RC2:1.40 ad-namecache-base2:1.43 ad-namecache-base1:1.43 ad-namecache:1.43.0.2 ad-namecache-base:1.43 netbsd-9-0-RC1:1.40 phil-wifi-20191119:1.40 netbsd-9:1.40.0.2 netbsd-9-base:1.40 phil-wifi-20190609:1.40 netbsd-8-1-RELEASE:1.38 netbsd-8-1-RC1:1.38 isaki-audio2:1.39.0.6 isaki-audio2-base:1.39 pgoyette-compat-merge-20190127:1.39 pgoyette-compat-20190127:1.39 pgoyette-compat-20190118:1.39 pgoyette-compat-1226:1.39 pgoyette-compat-1126:1.39 pgoyette-compat-1020:1.39 pgoyette-compat-0930:1.39 pgoyette-compat-0906:1.39 netbsd-7-2-RELEASE:1.37 pgoyette-compat-0728:1.39 netbsd-8-0-RELEASE:1.38 phil-wifi:1.39.0.4 phil-wifi-base:1.39 pgoyette-compat-0625:1.39 netbsd-8-0-RC2:1.38 pgoyette-compat-0521:1.39 pgoyette-compat-0502:1.39 pgoyette-compat-0422:1.39 netbsd-8-0-RC1:1.38 pgoyette-compat-0415:1.39 pgoyette-compat-0407:1.39 pgoyette-compat-0330:1.39 pgoyette-compat-0322:1.39 pgoyette-compat-0315:1.39 netbsd-7-1-2-RELEASE:1.37 pgoyette-compat:1.39.0.2 pgoyette-compat-base:1.39 netbsd-7-1-1-RELEASE:1.37 tls-maxphys-base-20171202:1.39 matt-nb8-mediatek:1.38.0.12 matt-nb8-mediatek-base:1.38 nick-nhusb-base-20170825:1.38 perseant-stdc-iso10646:1.38.0.10 perseant-stdc-iso10646-base:1.38 netbsd-8:1.38.0.8 netbsd-8-base:1.38 prg-localcount2-base3:1.38 prg-localcount2-base2:1.38 prg-localcount2-base1:1.38 prg-localcount2:1.38.0.6 prg-localcount2-base:1.38 pgoyette-localcount-20170426:1.38 bouyer-socketcan-base1:1.38 jdolecek-ncq:1.38.0.4 jdolecek-ncq-base:1.38 pgoyette-localcount-20170320:1.38 netbsd-7-1:1.37.0.40 netbsd-7-1-RELEASE:1.37 netbsd-7-1-RC2:1.37 nick-nhusb-base-20170204:1.38 netbsd-7-nhusb-base-20170116:1.37 bouyer-socketcan:1.38.0.2 bouyer-socketcan-base:1.38 pgoyette-localcount-20170107:1.38 netbsd-7-1-RC1:1.37 nick-nhusb-base-20161204:1.38 pgoyette-localcount-20161104:1.37 netbsd-7-0-2-RELEASE:1.37 nick-nhusb-base-20161004:1.37 localcount-20160914:1.37 netbsd-7-nhusb:1.37.0.38 netbsd-7-nhusb-base:1.37 pgoyette-localcount-20160806:1.37 pgoyette-localcount-20160726:1.37 pgoyette-localcount:1.37.0.36 pgoyette-localcount-base:1.37 nick-nhusb-base-20160907:1.37 nick-nhusb-base-20160529:1.37 netbsd-7-0-1-RELEASE:1.37 nick-nhusb-base-20160422:1.37 nick-nhusb-base-20160319:1.37 nick-nhusb-base-20151226:1.37 netbsd-7-0:1.37.0.34 netbsd-7-0-RELEASE:1.37 nick-nhusb-base-20150921:1.37 netbsd-7-0-RC3:1.37 netbsd-7-0-RC2:1.37 netbsd-7-0-RC1:1.37 nick-nhusb-base-20150606:1.37 nick-nhusb-base-20150406:1.37 nick-nhusb:1.37.0.32 nick-nhusb-base:1.37 netbsd-5-2-3-RELEASE:1.31 netbsd-5-1-5-RELEASE:1.31 netbsd-6-0-6-RELEASE:1.37 netbsd-6-1-5-RELEASE:1.37 netbsd-7:1.37.0.30 netbsd-7-base:1.37 yamt-pagecache-base9:1.37 yamt-pagecache-tag8:1.37 netbsd-6-1-4-RELEASE:1.37 netbsd-6-0-5-RELEASE:1.37 tls-earlyentropy:1.37.0.28 tls-earlyentropy-base:1.37 riastradh-xf86-video-intel-2-7-1-pre-2-21-15:1.37 riastradh-drm2-base3:1.37 netbsd-6-1-3-RELEASE:1.37 netbsd-6-0-4-RELEASE:1.37 netbsd-5-2-2-RELEASE:1.31 netbsd-5-1-4-RELEASE:1.31 netbsd-6-1-2-RELEASE:1.37 netbsd-6-0-3-RELEASE:1.37 netbsd-5-2-1-RELEASE:1.31 netbsd-5-1-3-RELEASE:1.31 rmind-smpnet-nbase:1.37 netbsd-6-1-1-RELEASE:1.37 riastradh-drm2-base2:1.37 riastradh-drm2-base1:1.37 riastradh-drm2:1.37.0.26 riastradh-drm2-base:1.37 rmind-smpnet:1.37.0.18 rmind-smpnet-base:1.37 netbsd-6-1:1.37.0.24 netbsd-6-0-2-RELEASE:1.37 netbsd-6-1-RELEASE:1.37 khorben-n900:1.37.0.22 netbsd-6-1-RC4:1.37 netbsd-6-1-RC3:1.37 agc-symver:1.37.0.20 agc-symver-base:1.37 netbsd-6-1-RC2:1.37 netbsd-6-1-RC1:1.37 yamt-pagecache-base8:1.37 netbsd-5-2:1.31.0.18 netbsd-6-0-1-RELEASE:1.37 yamt-pagecache-base7:1.37 netbsd-5-2-RELEASE:1.31 netbsd-5-2-RC1:1.31 matt-nb6-plus-nbase:1.37 yamt-pagecache-base6:1.37 netbsd-6-0:1.37.0.16 netbsd-6-0-RELEASE:1.37 netbsd-6-0-RC2:1.37 tls-maxphys:1.37.0.14 tls-maxphys-base:1.37 matt-nb6-plus:1.37.0.12 matt-nb6-plus-base:1.37 netbsd-6-0-RC1:1.37 jmcneill-usbmp-base10:1.37 yamt-pagecache-base5:1.37 jmcneill-usbmp-base9:1.37 yamt-pagecache-base4:1.37 jmcneill-usbmp-base8:1.37 jmcneill-usbmp-base7:1.37 jmcneill-usbmp-base6:1.37 jmcneill-usbmp-base5:1.37 jmcneill-usbmp-base4:1.37 jmcneill-usbmp-base3:1.37 jmcneill-usbmp-pre-base2:1.37 jmcneill-usbmp-base2:1.37 netbsd-6:1.37.0.10 netbsd-6-base:1.37 netbsd-5-1-2-RELEASE:1.31 netbsd-5-1-1-RELEASE:1.31 jmcneill-usbmp:1.37.0.8 jmcneill-usbmp-base:1.37 jmcneill-audiomp3:1.37.0.6 jmcneill-audiomp3-base:1.37 yamt-pagecache-base3:1.37 yamt-pagecache-base2:1.37 yamt-pagecache:1.37.0.4 yamt-pagecache-base:1.37 rmind-uvmplock-nbase:1.37 cherry-xenmp:1.37.0.2 cherry-xenmp-base:1.37 uebayasi-xip-base7:1.36 bouyer-quota2-nbase:1.36 bouyer-quota2:1.35.0.4 bouyer-quota2-base:1.36 jruoho-x86intr:1.35.0.2 jruoho-x86intr-base:1.35 matt-mips64-premerge-20101231:1.33 matt-nb5-mips64-premerge-20101231:1.31.12.1 matt-nb5-pq3:1.31.0.16 matt-nb5-pq3-base:1.31 netbsd-5-1:1.31.0.14 uebayasi-xip-base6:1.32 uebayasi-xip-base5:1.32 netbsd-5-1-RELEASE:1.31 uebayasi-xip-base4:1.32 uebayasi-xip-base3:1.32 yamt-nfs-mp-base11:1.32 netbsd-5-1-RC4:1.31 matt-nb5-mips64-k15:1.31.12.1 uebayasi-xip-base2:1.32 yamt-nfs-mp-base10:1.32 netbsd-5-1-RC3:1.31 netbsd-5-1-RC2:1.31 uebayasi-xip-base1:1.32 netbsd-5-1-RC1:1.31 rmind-uvmplock:1.32.0.4 rmind-uvmplock-base:1.37 yamt-nfs-mp-base9:1.32 uebayasi-xip:1.32.0.2 uebayasi-xip-base:1.32 netbsd-5-0-2-RELEASE:1.31 matt-nb5-mips64-premerge-20091211:1.31 matt-premerge-20091211:1.32 yamt-nfs-mp-base8:1.31 matt-nb5-mips64-u2-k2-k4-k7-k8-k9:1.31 matt-nb4-mips64-k7-u2a-k9b:1.31 matt-nb5-mips64-u1-k1-k5:1.31 yamt-nfs-mp-base7:1.31 matt-nb5-mips64:1.31.0.12 netbsd-5-0-1-RELEASE:1.31 jymxensuspend-base:1.31 yamt-nfs-mp-base6:1.31 yamt-nfs-mp-base5:1.31 yamt-nfs-mp-base4:1.31 jym-xensuspend-nbase:1.32 yamt-nfs-mp-base3:1.31 nick-hppapmap-base4:1.31 nick-hppapmap-base3:1.31 netbsd-5-0:1.31.0.10 netbsd-5-0-RELEASE:1.31 netbsd-5-0-RC4:1.31 netbsd-5-0-RC3:1.31 nick-hppapmap-base2:1.31 netbsd-5-0-RC2:1.31 jym-xensuspend:1.31.0.8 jym-xensuspend-base:1.31 netbsd-5-0-RC1:1.31 haad-dm-base2:1.31 haad-nbase2:1.31 ad-audiomp2:1.31.0.6 ad-audiomp2-base:1.31 netbsd-5:1.31.0.4 netbsd-5-base:1.31 nick-hppapmap:1.31.0.2 nick-hppapmap-base:1.31 matt-mips64-base2:1.31 matt-mips64:1.30.0.62 haad-dm-base1:1.31 wrstuden-revivesa-base-4:1.31 netbsd-4-0-1-RELEASE:1.30 wrstuden-revivesa-base-3:1.31 wrstuden-revivesa-base-2:1.31 wrstuden-fixsa-newbase:1.30 nick-csl-alignment-base5:1.30 haad-dm:1.30.0.60 haad-dm-base:1.31 wrstuden-revivesa-base-1:1.30 simonb-wapbl-nbase:1.30 yamt-pf42-base4:1.30 simonb-wapbl:1.30.0.58 simonb-wapbl-base:1.30 yamt-pf42-base3:1.30 hpcarm-cleanup-nbase:1.30 yamt-pf42-baseX:1.30 yamt-pf42-base2:1.30 yamt-nfs-mp-base2:1.30 wrstuden-revivesa:1.30.0.56 wrstuden-revivesa-base:1.30 yamt-nfs-mp:1.30.0.54 yamt-nfs-mp-base:1.30 yamt-pf42:1.30.0.52 yamt-pf42-base:1.30 ad-socklock-base1:1.30 yamt-lazymbuf-base15:1.30 yamt-lazymbuf-base14:1.30 keiichi-mipv6-nbase:1.30 mjf-devfs2:1.30.0.50 mjf-devfs2-base:1.31 nick-net80211-sync:1.30.0.48 nick-net80211-sync-base:1.30 keiichi-mipv6:1.30.0.46 keiichi-mipv6-base:1.30 bouyer-xeni386-merge1:1.30 matt-armv6-prevmlocking:1.30 wrstuden-fixsa-base-1:1.30 vmlocking2-base3:1.30 netbsd-4-0:1.30.0.44 netbsd-4-0-RELEASE:1.30 bouyer-xeni386-nbase:1.30 yamt-kmem-base3:1.30 cube-autoconf:1.30.0.42 cube-autoconf-base:1.30 yamt-kmem-base2:1.30 bouyer-xeni386:1.30.0.40 bouyer-xeni386-base:1.30 yamt-kmem:1.30.0.38 yamt-kmem-base:1.30 vmlocking2-base2:1.30 reinoud-bufcleanup-nbase:1.30 vmlocking2:1.30.0.36 vmlocking2-base1:1.30 netbsd-4-0-RC5:1.30 matt-nb4-arm:1.30.0.34 matt-nb4-arm-base:1.30 matt-armv6-nbase:1.30 jmcneill-base:1.30 netbsd-4-0-RC4:1.30 mjf-devfs:1.30.0.32 mjf-devfs-base:1.30 bouyer-xenamd64-base2:1.30 vmlocking-nbase:1.30 yamt-x86pmap-base4:1.30 bouyer-xenamd64:1.30.0.30 bouyer-xenamd64-base:1.30 netbsd-4-0-RC3:1.30 yamt-x86pmap-base3:1.30 yamt-x86pmap-base2:1.30 netbsd-4-0-RC2:1.30 yamt-x86pmap:1.30.0.28 yamt-x86pmap-base:1.30 netbsd-4-0-RC1:1.30 matt-armv6:1.30.0.26 matt-armv6-base:1.30 matt-mips64-base:1.30 jmcneill-pm:1.30.0.24 jmcneill-pm-base:1.30 hpcarm-cleanup:1.30.0.22 hpcarm-cleanup-base:1.30 nick-csl-alignment:1.30.0.20 nick-csl-alignment-base:1.30 netbsd-3-1-1-RELEASE:1.25 netbsd-3-0-3-RELEASE:1.25 yamt-idlelwp-base8:1.30 wrstuden-fixsa:1.30.0.18 wrstuden-fixsa-base:1.30 thorpej-atomic:1.30.0.16 thorpej-atomic-base:1.30 reinoud-bufcleanup:1.30.0.14 reinoud-bufcleanup-base:1.30 mjf-ufs-trans:1.30.0.12 mjf-ufs-trans-base:1.30 vmlocking:1.30.0.10 vmlocking-base:1.30 ad-audiomp:1.30.0.8 ad-audiomp-base:1.30 yamt-idlelwp:1.30.0.6 post-newlock2-merge:1.30 newlock2-nbase:1.30 yamt-splraiseipl-base5:1.30 yamt-splraiseipl-base4:1.30 yamt-splraiseipl-base3:1.30 abandoned-netbsd-4-base:1.29 abandoned-netbsd-4:1.29.0.18 netbsd-3-1:1.25.0.14 netbsd-3-1-RELEASE:1.25 netbsd-3-0-2-RELEASE:1.25 yamt-splraiseipl-base2:1.30 netbsd-3-1-RC4:1.25 yamt-splraiseipl:1.30.0.2 yamt-splraiseipl-base:1.30 netbsd-3-1-RC3:1.25 yamt-pdpolicy-base9:1.29 newlock2:1.29.0.20 newlock2-base:1.30 yamt-pdpolicy-base8:1.29 netbsd-3-1-RC2:1.25 netbsd-3-1-RC1:1.25 yamt-pdpolicy-base7:1.29 netbsd-4:1.30.0.4 netbsd-4-base:1.30 yamt-pdpolicy-base6:1.29 chap-midi-nbase:1.29 netbsd-3-0-1-RELEASE:1.25 gdamore-uart:1.29.0.16 gdamore-uart-base:1.29 simonb-timcounters-final:1.29 yamt-pdpolicy-base5:1.29 chap-midi:1.29.0.14 chap-midi-base:1.29 yamt-pdpolicy-base4:1.29 yamt-pdpolicy-base3:1.29 peter-altq-base:1.29 peter-altq:1.29.0.12 yamt-pdpolicy-base2:1.29 elad-kernelauth-base:1.29 elad-kernelauth:1.29.0.10 yamt-pdpolicy:1.29.0.8 yamt-pdpolicy-base:1.29 yamt-uio_vmspace-base5:1.29 simonb-timecounters:1.29.0.6 simonb-timecounters-base:1.29 rpaulo-netinet-merge-pcb:1.29.0.4 rpaulo-netinet-merge-pcb-base:1.29 yamt-uio_vmspace:1.29.0.2 netbsd-3-0:1.25.0.12 netbsd-3-0-RELEASE:1.25 netbsd-3-0-RC6:1.25 yamt-readahead-base3:1.29 netbsd-3-0-RC5:1.25 netbsd-3-0-RC4:1.25 netbsd-3-0-RC3:1.25 yamt-readahead-base2:1.28 netbsd-3-0-RC2:1.25 yamt-readahead-pervnode:1.28 yamt-readahead-perfile:1.28 yamt-readahead:1.28.0.8 yamt-readahead-base:1.28 netbsd-3-0-RC1:1.25 yamt-vop-base3:1.28 netbsd-2-0-3-RELEASE:1.23.2.1 netbsd-2-1:1.23.2.1.0.4 yamt-vop-base2:1.28 thorpej-vnode-attr:1.28.0.6 thorpej-vnode-attr-base:1.28 netbsd-2-1-RELEASE:1.23.2.1 yamt-vop:1.28.0.4 yamt-vop-base:1.28 netbsd-2-1-RC6:1.23.2.1 netbsd-2-1-RC5:1.23.2.1 netbsd-2-1-RC4:1.23.2.1 netbsd-2-1-RC3:1.23.2.1 netbsd-2-1-RC2:1.23.2.1 netbsd-2-1-RC1:1.23.2.1 yamt-lazymbuf:1.28.0.2 yamt-km-base4:1.25 netbsd-2-0-2-RELEASE:1.23.2.1 yamt-km-base3:1.25 netbsd-3:1.25.0.10 netbsd-3-base:1.25 yamt-km-base2:1.25 yamt-km:1.25.0.6 yamt-km-base:1.25 kent-audio2:1.25.0.4 kent-audio2-base:1.26 netbsd-2-0-1-RELEASE:1.23.2.1 kent-audio1-beforemerge:1.25 netbsd-2:1.23.2.1.0.2 netbsd-2-base:1.23.2.1 kent-audio1:1.25.0.2 kent-audio1-base:1.25 netbsd-2-0-RELEASE:1.23.2.1 netbsd-2-0-RC5:1.23.2.1 netbsd-2-0-RC4:1.23.2.1 netbsd-2-0-RC3:1.23.2.1 netbsd-2-0-RC2:1.23.2.1 netbsd-2-0-RC1:1.23.2.1 netbsd-2-0:1.23.0.2 netbsd-2-0-base:1.23 netbsd-1-6-PATCH002-RELEASE:1.22 netbsd-1-6-PATCH002:1.22 netbsd-1-6-PATCH002-RC4:1.22 netbsd-1-6-PATCH002-RC3:1.22 netbsd-1-6-PATCH002-RC2:1.22 netbsd-1-6-PATCH002-RC1:1.22 ktrace-lwp:1.22.0.16 ktrace-lwp-base:1.29 netbsd-1-6-PATCH001:1.22 netbsd-1-6-PATCH001-RELEASE:1.22 netbsd-1-6-PATCH001-RC3:1.22 netbsd-1-6-PATCH001-RC2:1.22 netbsd-1-6-PATCH001-RC1:1.22 nathanw_sa_end:1.17.2.5 nathanw_sa_before_merge:1.22 fvdl_fs64_base:1.22 gmcgarry_ctxsw:1.22.0.14 gmcgarry_ctxsw_base:1.22 gmcgarry_ucred:1.22.0.12 gmcgarry_ucred_base:1.22 nathanw_sa_base:1.22 kqueue-aftermerge:1.22 kqueue-beforemerge:1.22 netbsd-1-6-RELEASE:1.22 netbsd-1-6-RC3:1.22 netbsd-1-6-RC2:1.22 netbsd-1-6-RC1:1.22 netbsd-1-6:1.22.0.10 netbsd-1-6-base:1.22 gehenna-devsw:1.22.0.8 gehenna-devsw-base:1.22 netbsd-1-5-PATCH003:1.13 eeh-devprop:1.22.0.6 eeh-devprop-base:1.22 newlock:1.22.0.4 newlock-base:1.22 ifpoll-base:1.22 thorpej-mips-cache:1.20.0.2 thorpej-mips-cache-base:1.21 thorpej-devvp-base3:1.20 thorpej-devvp-base2:1.20 post-chs-ubcperf:1.20 pre-chs-ubcperf:1.19 thorpej-devvp:1.19.0.4 thorpej-devvp-base:1.19 netbsd-1-5-PATCH002:1.13 kqueue:1.19.0.2 kqueue-base:1.22 netbsd-1-5-PATCH001:1.13 thorpej_scsipi_beforemerge:1.18 nathanw_sa:1.17.0.2 thorpej_scsipi_nbase:1.18 netbsd-1-5-RELEASE:1.13 netbsd-1-5-BETA2:1.13 netbsd-1-5-BETA:1.13 netbsd-1-4-PATCH003:1.12 netbsd-1-5-ALPHA2:1.13 netbsd-1-5:1.13.0.4 netbsd-1-5-base:1.13 minoura-xpg4dl-base:1.13 minoura-xpg4dl:1.13.0.2 netbsd-1-4-PATCH002:1.12 chs-ubc2-newbase:1.13 wrstuden-devbsize-19991221:1.12 wrstuden-devbsize:1.12.0.14 wrstuden-devbsize-base:1.12 kame_141_19991130:1.12 comdex-fall-1999:1.12.0.12 comdex-fall-1999-base:1.12 fvdl-softdep:1.12.0.10 fvdl-softdep-base:1.12 thorpej_scsipi:1.12.0.8 thorpej_scsipi_base:1.18 netbsd-1-4-PATCH001:1.12 kame_14_19990705:1.12 kame_14_19990628:1.12 kame:1.12.0.6 chs-ubc2:1.12.0.4 chs-ubc2-base:1.12 netbsd-1-4-RELEASE:1.12 netbsd-1-4:1.12.0.2 netbsd-1-4-base:1.12 kenh-if-detach:1.10.0.6 kenh-if-detach-base:1.10 chs-ubc:1.10.0.4 chs-ubc-base:1.10 eeh-paddr_t:1.10.0.2 eeh-paddr_t-base:1.10 uvm980205:1.1.1.1 CDC:1.1.1; locks; strict; comment @ * @; 1.46 date 2020.06.14.21.41.42; author ad; state Exp; branches; next 1.45; commitid pETN8EdR4ozgTecC; 1.45 date 2020.06.11.22.21.05; author ad; state Exp; branches; next 1.44; commitid aO7X5gz54qP0cRbC; 1.44 date 2020.06.11.19.20.47; author ad; state Exp; branches; next 1.43; commitid jTCHRbpHeFCNcQbC; 1.43 date 2019.12.31.13.07.14; author ad; state Exp; branches; next 1.42; commitid 1enRDiWCklcrnRQB; 1.42 date 2019.12.21.13.00.25; author ad; state Exp; branches; next 1.41; commitid 2Hkby7ms2MReFzPB; 1.41 date 2019.12.16.22.47.55; author ad; state Exp; branches; next 1.40; commitid v7oZdpKCmLHV3ZOB; 1.40 date 2019.05.09.08.16.15; author skrll; state Exp; branches; next 1.39; commitid EoFWWpUrNL61mvmB; 1.39 date 2017.12.02.08.15.43; author mrg; state Exp; branches 1.39.4.1; next 1.38; commitid Qd469to6OryJ9ihA; 1.38 date 2016.12.01.01.59.17; author mrg; state Exp; branches; next 1.37; 1.37 date 2011.05.17.04.18.07; author mrg; state Exp; branches 1.37.14.1 1.37.32.1 1.37.36.1; next 1.36; 1.36 date 2011.02.02.15.13.34; author chuck; state Exp; branches; next 1.35; 1.35 date 2011.01.05.21.20.44; author enami; state Exp; branches 1.35.2.1 1.35.4.1; next 1.34; 1.34 date 2011.01.04.08.17.01; author matt; state Exp; branches; next 1.33; 1.33 date 2010.12.20.00.25.48; author matt; state Exp; branches; next 1.32; 1.32 date 2009.10.21.21.12.07; author rmind; state Exp; branches 1.32.4.1; next 1.31; 1.31 date 2008.08.08.17.09.28; author skrll; state Exp; branches 1.31.12.1; next 1.30; 1.30 date 2006.09.15.15.51.13; author yamt; state Exp; branches 1.30.50.1 1.30.54.1 1.30.56.1 1.30.58.1 1.30.60.1; next 1.29; 1.29 date 2005.11.29.15.45.28; author yamt; state Exp; branches 1.29.8.1 1.29.20.1; next 1.28; 1.28 date 2005.06.27.02.19.48; author thorpej; state Exp; branches 1.28.2.1 1.28.8.1; next 1.27; 1.27 date 2005.05.15.08.01.06; author yamt; state Exp; branches; next 1.26; 1.26 date 2005.04.27.11.02.43; author yamt; state Exp; branches; next 1.25; 1.25 date 2004.11.23.04.51.56; author yamt; state Exp; branches 1.25.4.1; next 1.24; 1.24 date 2004.05.01.19.40.39; author petrov; state Exp; branches; next 1.23; 1.23 date 2004.03.24.07.55.01; author junyoung; state Exp; branches 1.23.2.1; next 1.22; 1.22 date 2001.12.09.03.07.20; author chs; state Exp; branches 1.22.16.1; next 1.21; 1.21 date 2001.11.10.07.37.01; author lukem; state Exp; branches; next 1.20; 1.20 date 2001.09.15.20.36.47; author chs; state Exp; branches 1.20.2.1; next 1.19; 1.19 date 2001.05.25.04.06.17; author chs; state Exp; branches 1.19.2.1 1.19.4.1; next 1.18; 1.18 date 2001.03.09.01.02.13; author chs; state Exp; branches; next 1.17; 1.17 date 2001.02.04.10.55.58; author mrg; state Exp; branches 1.17.2.1; next 1.16; 1.16 date 2000.12.01.09.48.56; author chs; state Exp; branches; next 1.15; 1.15 date 2000.11.24.07.25.52; author chs; state Exp; branches; next 1.14; 1.14 date 2000.06.27.17.29.35; author mrg; state Exp; branches; next 1.13; 1.13 date 2000.01.11.06.57.50; author chs; state Exp; branches; next 1.12; 1.12 date 99.03.26.17.34.16; author chs; state Exp; branches 1.12.4.1 1.12.8.1; next 1.11; 1.11 date 99.03.25.18.48.56; author mrg; state Exp; branches; next 1.10; 1.10 date 98.06.20.13.19.00; author mrg; state Exp; branches 1.10.4.1; next 1.9; 1.9 date 98.03.10.14.36.55; author chuck; state Exp; branches; next 1.8; 1.8 date 98.02.13.05.34.30; author thorpej; state Exp; branches; next 1.7; 1.7 date 98.02.13.05.33.55; author thorpej; state Exp; branches; next 1.6; 1.6 date 98.02.13.04.52.00; author thorpej; state Exp; branches; next 1.5; 1.5 date 98.02.12.20.10.15; author thorpej; state Exp; branches; next 1.4; 1.4 date 98.02.10.14.12.29; author mrg; state Exp; branches; next 1.3; 1.3 date 98.02.07.11.09.38; author mrg; state Exp; branches; next 1.2; 1.2 date 98.02.06.22.32.27; author thorpej; state Exp; branches; next 1.1; 1.1 date 98.02.05.06.25.09; author mrg; state Exp; branches 1.1.1.1; next ; 1.39.4.1 date 2019.06.10.22.09.58; author christos; state Exp; branches; next 1.39.4.2; commitid jtc8rnCzWiEEHGqB; 1.39.4.2 date 2020.04.08.14.09.05; author martin; state Exp; branches; next ; commitid Qli2aW9E74UFuA3C; 1.37.14.1 date 2017.12.03.11.39.22; author jdolecek; state Exp; branches; next ; commitid XcIYRZTAh1LmerhA; 1.37.32.1 date 2016.12.05.10.55.30; author skrll; state Exp; branches; next ; 1.37.36.1 date 2017.01.07.08.56.53; author pgoyette; state Exp; branches; next ; 1.35.2.1 date 2011.06.06.09.10.24; author jruoho; state Exp; branches; next ; 1.35.4.1 date 2011.02.08.16.20.07; author bouyer; state Exp; branches; next ; 1.32.4.1 date 2011.03.05.20.56.38; author rmind; state Exp; branches; next 1.32.4.2; 1.32.4.2 date 2011.05.31.03.05.15; author rmind; state Exp; branches; next ; 1.31.12.1 date 2010.01.22.04.03.21; author matt; state Exp; branches; next 1.31.12.2; 1.31.12.2 date 2012.02.09.03.05.01; author matt; state Exp; branches; next 1.31.12.3; 1.31.12.3 date 2012.02.16.04.20.46; author matt; state Exp; branches; next 1.31.12.4; 1.31.12.4 date 2012.04.12.01.40.27; author matt; state Exp; branches; next ; 1.30.50.1 date 2008.09.28.10.41.07; author mjf; state Exp; branches; next ; 1.30.54.1 date 2009.05.04.08.14.40; author yamt; state Exp; branches; next 1.30.54.2; 1.30.54.2 date 2010.03.11.15.04.47; author yamt; state Exp; branches; next ; 1.30.56.1 date 2008.09.18.04.37.07; author wrstuden; state Exp; branches; next ; 1.30.58.1 date 2008.06.27.15.11.55; author simonb; state Exp; branches; next 1.30.58.2; 1.30.58.2 date 2008.06.27.15.52.16; author simonb; state Exp; branches; next ; 1.30.60.1 date 2008.10.19.22.18.11; author haad; state Exp; branches; next ; 1.29.8.1 date 2006.03.05.12.51.09; author yamt; state Exp; branches; next ; 1.29.20.1 date 2006.11.18.21.39.50; author ad; state Exp; branches; next ; 1.28.2.1 date 2006.06.21.15.12.40; author yamt; state Exp; branches; next 1.28.2.2; 1.28.2.2 date 2006.12.30.20.51.06; author yamt; state Exp; branches; next ; 1.28.8.1 date 2005.11.29.21.23.34; author yamt; state Exp; branches; next ; 1.25.4.1 date 2005.04.29.11.29.45; author kent; state Exp; branches; next ; 1.23.2.1 date 2004.05.09.08.55.12; author jdc; state Exp; branches; next ; 1.22.16.1 date 2004.08.03.10.57.09; author skrll; state Exp; branches; next 1.22.16.2; 1.22.16.2 date 2004.09.18.14.57.12; author skrll; state Exp; branches; next 1.22.16.3; 1.22.16.3 date 2004.09.21.13.39.31; author skrll; state Exp; branches; next 1.22.16.4; 1.22.16.4 date 2004.11.29.07.25.05; author skrll; state Exp; branches; next 1.22.16.5; 1.22.16.5 date 2005.11.10.14.12.40; author skrll; state Exp; branches; next 1.22.16.6; 1.22.16.6 date 2005.12.11.10.29.42; author christos; state Exp; branches; next ; 1.20.2.1 date 2001.11.12.21.19.58; author thorpej; state Exp; branches; next ; 1.19.2.1 date 2002.01.10.20.05.47; author thorpej; state Exp; branches; next ; 1.19.4.1 date 2001.10.01.12.48.47; author fvdl; state Exp; branches; next ; 1.17.2.1 date 2001.04.09.01.59.23; author nathanw; state Exp; branches; next 1.17.2.2; 1.17.2.2 date 2001.06.21.20.10.48; author nathanw; state Exp; branches; next 1.17.2.3; 1.17.2.3 date 2001.09.21.22.37.18; author nathanw; state Exp; branches; next 1.17.2.4; 1.17.2.4 date 2001.11.14.19.19.09; author nathanw; state Exp; branches; next 1.17.2.5; 1.17.2.5 date 2002.01.08.00.35.07; author nathanw; state Exp; branches; next ; 1.12.4.1 date 99.06.07.04.25.37; author chs; state Exp; branches; next ; 1.12.8.1 date 2000.11.20.18.12.06; author bouyer; state Exp; branches; next 1.12.8.2; 1.12.8.2 date 2000.12.08.09.21.06; author bouyer; state Exp; branches; next 1.12.8.3; 1.12.8.3 date 2001.02.11.19.17.51; author bouyer; state Exp; branches; next 1.12.8.4; 1.12.8.4 date 2001.03.12.13.32.15; author bouyer; state Exp; branches; next ; 1.10.4.1 date 98.11.09.06.06.39; author chs; state Exp; branches; next 1.10.4.2; 1.10.4.2 date 99.02.25.04.35.55; author chs; state Exp; branches; next ; 1.1.1.1 date 98.02.05.06.25.09; author mrg; state Exp; branches; next ; desc @@ 1.46 log @Remove PG_ZERO. It worked brilliantly on x86 machines from the mid-90s but having spent an age experimenting with it over the last 6 months on various machines and with different use cases it's always either break-even or a slight net loss for me. @ text @/* $NetBSD: uvm_stat.c,v 1.45 2020/06/11 22:21:05 ad Exp $ */ /* * Copyright (c) 1997 Charles D. Cranor and Washington University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * from: Id: uvm_stat.c,v 1.1.2.3 1997/12/19 15:01:00 mrg Exp */ /* * uvm_stat.c */ #include __KERNEL_RCSID(0, "$NetBSD: uvm_stat.c,v 1.45 2020/06/11 22:21:05 ad Exp $"); #include "opt_readahead.h" #include "opt_ddb.h" #include #include #include #include #include #ifdef DDB #include /* * uvmexp_print: ddb hook to print interesting uvm counters */ void uvmexp_print(void (*pr)(const char *, ...) __attribute__((__format__(__printf__,1,2)))) { int64_t anonpg, execpg, filepg; int active, inactive; int poolpages, freepg; uvm_estimatepageable(&active, &inactive); poolpages = pool_totalpages_locked(); /* this will sync all counters. */ freepg = uvm_availmem(false); anonpg = cpu_count_get(CPU_COUNT_ANONCLEAN) + cpu_count_get(CPU_COUNT_ANONDIRTY) + cpu_count_get(CPU_COUNT_ANONUNKNOWN); execpg = cpu_count_get(CPU_COUNT_EXECPAGES); filepg = cpu_count_get(CPU_COUNT_FILECLEAN) + cpu_count_get(CPU_COUNT_FILEDIRTY) + cpu_count_get(CPU_COUNT_FILEUNKNOWN) - execpg; (*pr)("Current UVM status:\n"); (*pr)(" pagesize=%d (0x%x), pagemask=0x%x, pageshift=%d, ncolors=%d\n", uvmexp.pagesize, uvmexp.pagesize, uvmexp.pagemask, uvmexp.pageshift, uvmexp.ncolors); (*pr)(" %d VM pages: %d active, %d inactive, %d wired, %d free\n", uvmexp.npages, active, inactive, uvmexp.wired, freepg); (*pr)(" pages %" PRId64 " anon, %" PRId64 " file, %" PRId64 " exec\n", anonpg, filepg, execpg); (*pr)(" freemin=%d, free-target=%d, wired-max=%d\n", uvmexp.freemin, uvmexp.freetarg, uvmexp.wiredmax); (*pr)(" resv-pg=%d, resv-kernel=%d\n", uvmexp.reserve_pagedaemon, uvmexp.reserve_kernel); (*pr)(" bootpages=%d, poolpages=%d\n", uvmexp.bootpages, poolpages); (*pr)(" faults=%" PRId64 ", traps=%" PRId64 ", " "intrs=%" PRId64 ", ctxswitch=%" PRId64 "\n", cpu_count_get(CPU_COUNT_NFAULT), cpu_count_get(CPU_COUNT_NTRAP), cpu_count_get(CPU_COUNT_NINTR), cpu_count_get(CPU_COUNT_NSWTCH)); (*pr)(" softint=%" PRId64 ", syscalls=%" PRId64 "\n", cpu_count_get(CPU_COUNT_NSOFT), cpu_count_get(CPU_COUNT_NSYSCALL)); (*pr)(" fault counts:\n"); (*pr)(" noram=%" PRId64 ", noanon=%" PRId64 ", pgwait=%" PRId64 ", pgrele=%" PRId64 "\n", cpu_count_get(CPU_COUNT_FLTNORAM), cpu_count_get(CPU_COUNT_FLTNOANON), cpu_count_get(CPU_COUNT_FLTPGWAIT), cpu_count_get(CPU_COUNT_FLTPGRELE)); (*pr)(" ok relocks(total)=%" PRId64 "(%" PRId64 "), " "anget(retrys)=%" PRId64 "(%" PRId64 "), amapcopy=%" PRId64 "\n", cpu_count_get(CPU_COUNT_FLTRELCKOK), cpu_count_get(CPU_COUNT_FLTRELCK), cpu_count_get(CPU_COUNT_FLTANGET), cpu_count_get(CPU_COUNT_FLTANRETRY), cpu_count_get(CPU_COUNT_FLTAMCOPY)); (*pr)(" neighbor anon/obj pg=%" PRId64 "/%" PRId64 ", gets(lock/unlock)=%" PRId64 "/%" PRId64 "\n", cpu_count_get(CPU_COUNT_FLTNAMAP), cpu_count_get(CPU_COUNT_FLTNOMAP), cpu_count_get(CPU_COUNT_FLTLGET), cpu_count_get(CPU_COUNT_FLTGET)); (*pr)(" cases: anon=%" PRId64 ", anoncow=%" PRId64 ", obj=%" PRId64 ", prcopy=%" PRId64 ", przero=%" PRId64 "\n", cpu_count_get(CPU_COUNT_FLT_ANON), cpu_count_get(CPU_COUNT_FLT_ACOW), cpu_count_get(CPU_COUNT_FLT_OBJ), cpu_count_get(CPU_COUNT_FLT_PRCOPY), cpu_count_get(CPU_COUNT_FLT_PRZERO)); (*pr)(" daemon and swap counts:\n"); (*pr)(" woke=%d, revs=%d, scans=%d, obscans=%d, anscans=%d\n", uvmexp.pdwoke, uvmexp.pdrevs, uvmexp.pdscans, uvmexp.pdobscan, uvmexp.pdanscan); (*pr)(" busy=%d, freed=%d, reactivate=%d, deactivate=%d\n", uvmexp.pdbusy, uvmexp.pdfreed, uvmexp.pdreact, uvmexp.pddeact); (*pr)(" pageouts=%d, pending=%d, nswget=%d\n", uvmexp.pdpageouts, uvmexp.pdpending, uvmexp.nswget); (*pr)(" nswapdev=%d, swpgavail=%d\n", uvmexp.nswapdev, uvmexp.swpgavail); (*pr)(" swpages=%d, swpginuse=%d, swpgonly=%d, paging=%d\n", uvmexp.swpages, uvmexp.swpginuse, uvmexp.swpgonly, uvmexp.paging); } #endif #if defined(READAHEAD_STATS) #define UVM_RA_EVCNT_DEFINE(name) \ struct evcnt uvm_ra_##name = \ EVCNT_INITIALIZER(EVCNT_TYPE_MISC, NULL, "readahead", #name); \ EVCNT_ATTACH_STATIC(uvm_ra_##name); UVM_RA_EVCNT_DEFINE(total); UVM_RA_EVCNT_DEFINE(hit); UVM_RA_EVCNT_DEFINE(miss); #endif /* defined(READAHEAD_STATS) */ @ 1.45 log @Counter tweaks: - Don't need to count anonpages+filepages any more; clean+unknown+dirty for each kind of page can be summed to get the totals. - Track the number of free pages with a counter so that it's one less thing for the allocator to do, which opens up further options there. - Remove cpu_count_sync_one(). It has no users and doesn't save a whole lot. For the cheap option, give cpu_count_sync() a boolean parameter indicating that a cached value is okay, and rate limit the updates for cached values to hz. @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.44 2020/06/11 19:20:47 ad Exp $ */ d35 1 a35 1 __KERNEL_RCSID(0, "$NetBSD: uvm_stat.c,v 1.44 2020/06/11 19:20:47 ad Exp $"); d87 2 a88 3 (*pr)(" resv-pg=%d, resv-kernel=%d, zeropages=%" PRId64 "\n", uvmexp.reserve_pagedaemon, uvmexp.reserve_kernel, cpu_count_get(CPU_COUNT_ZEROPAGES)); @ 1.44 log @uvm_availmem(): give it a boolean argument to specify whether a recent cached value will do, or if the very latest total must be fetched. It can be called thousands of times a second and fetching the totals impacts not only the calling LWP but other CPUs doing unrelated activity in the VM system. @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.43 2019/12/31 13:07:14 ad Exp $ */ d35 1 a35 1 __KERNEL_RCSID(0, "$NetBSD: uvm_stat.c,v 1.43 2019/12/31 13:07:14 ad Exp $"); d58 1 d60 1 a60 1 int poolpages; d65 12 a76 1 cpu_count_sync_all(); d82 1 a82 1 uvmexp.npages, active, inactive, uvmexp.wired, uvm_availmem(false)); d84 1 a84 3 cpu_count_get(CPU_COUNT_ANONPAGES), cpu_count_get(CPU_COUNT_FILEPAGES), cpu_count_get(CPU_COUNT_EXECPAGES)); @ 1.43 log @Rename uvm_free() -> uvm_availmem(). @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.42 2019/12/21 13:00:25 ad Exp $ */ d35 1 a35 1 __KERNEL_RCSID(0, "$NetBSD: uvm_stat.c,v 1.42 2019/12/21 13:00:25 ad Exp $"); d70 1 a70 1 uvmexp.npages, active, inactive, uvmexp.wired, uvm_availmem()); @ 1.42 log @uvmexp.free -> uvm_free() @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.41 2019/12/16 22:47:55 ad Exp $ */ d35 1 a35 1 __KERNEL_RCSID(0, "$NetBSD: uvm_stat.c,v 1.41 2019/12/16 22:47:55 ad Exp $"); d70 1 a70 1 uvmexp.npages, active, inactive, uvmexp.wired, uvm_free()); @ 1.41 log @- Extend the per-CPU counters matt@@ did to include all of the hot counters in UVM, excluding uvmexp.free, which needs special treatment and will be done with a separate commit. Cuts system time for a build by 20-25% on a 48 CPU machine w/DIAGNOSTIC. - Avoid 64-bit integer divide on every fault (for rnd_add_uint32). @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.40 2019/05/09 08:16:15 skrll Exp $ */ d35 1 a35 1 __KERNEL_RCSID(0, "$NetBSD: uvm_stat.c,v 1.40 2019/05/09 08:16:15 skrll Exp $"); d70 1 a70 1 uvmexp.npages, active, inactive, uvmexp.wired, uvmexp.free); @ 1.40 log @Avoid KASSERT(!cpu_intr_p()) when breaking into ddb and issuing show uvmexp @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.39 2017/12/02 08:15:43 mrg Exp $ */ d35 1 a35 1 __KERNEL_RCSID(0, "$NetBSD: uvm_stat.c,v 1.39 2017/12/02 08:15:43 mrg Exp $"); a59 2 CPU_INFO_ITERATOR cii; struct cpu_info *ci; d64 1 d70 5 a74 4 uvmexp.npages, active, inactive, uvmexp.wired, uvmexp.free); (*pr)(" pages %d anon, %d file, %d exec\n", uvmexp.anonpages, uvmexp.filepages, uvmexp.execpages); d77 3 a79 2 (*pr)(" resv-pg=%d, resv-kernel=%d, zeropages=%d\n", uvmexp.reserve_pagedaemon, uvmexp.reserve_kernel, uvmexp.zeropages); d83 9 a91 9 for (CPU_INFO_FOREACH(cii, ci)) { (*pr)(" cpu%u:\n", cpu_index(ci)); (*pr)(" faults=%" PRIu64 ", traps=%" PRIu64 ", " "intrs=%" PRIu64 ", ctxswitch=%" PRIu64 "\n", ci->ci_data.cpu_nfault, ci->ci_data.cpu_ntrap, ci->ci_data.cpu_nintr, ci->ci_data.cpu_nswtch); (*pr)(" softint=%" PRIu64 ", syscalls=%" PRIu64 "\n", ci->ci_data.cpu_nsoft, ci->ci_data.cpu_nsyscall); } d94 26 a119 11 (*pr)(" noram=%d, noanon=%d, pgwait=%d, pgrele=%d\n", uvmexp.fltnoram, uvmexp.fltnoanon, uvmexp.fltpgwait, uvmexp.fltpgrele); (*pr)(" ok relocks(total)=%d(%d), anget(retrys)=%d(%d), " "amapcopy=%d\n", uvmexp.fltrelckok, uvmexp.fltrelck, uvmexp.fltanget, uvmexp.fltanretry, uvmexp.fltamcopy); (*pr)(" neighbor anon/obj pg=%d/%d, gets(lock/unlock)=%d/%d\n", uvmexp.fltnamap, uvmexp.fltnomap, uvmexp.fltlget, uvmexp.fltget); (*pr)(" cases: anon=%d, anoncow=%d, obj=%d, prcopy=%d, przero=%d\n", uvmexp.flt_anon, uvmexp.flt_acow, uvmexp.flt_obj, uvmexp.flt_prcopy, uvmexp.flt_przero); @ 1.39 log @add two new members to uvmexp_sysctl{}: bootpages and poolpages. bootpages is set to the pages allocated via uvm_pageboot_alloc(). poolpages is calculated from the list of pools nr_pages members. this brings us closer to having a valid total of pages known by the system, vs actual pages originally managed. XXX: poolpages needs some handling for PR_RECURSIVE pools still. @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.38 2016/12/01 01:59:17 mrg Exp $ */ d35 1 a35 1 __KERNEL_RCSID(0, "$NetBSD: uvm_stat.c,v 1.38 2016/12/01 01:59:17 mrg Exp $"); d64 1 a64 1 poolpages = pool_totalpages(); @ 1.39.4.1 log @Sync with HEAD @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.40 2019/05/09 08:16:15 skrll Exp $ */ d35 1 a35 1 __KERNEL_RCSID(0, "$NetBSD: uvm_stat.c,v 1.40 2019/05/09 08:16:15 skrll Exp $"); d64 1 a64 1 poolpages = pool_totalpages_locked(); @ 1.39.4.2 log @Merge changes from current as of 20200406 @ text @d1 1 a1 1 /* $NetBSD$ */ d35 1 a35 1 __KERNEL_RCSID(0, "$NetBSD$"); d60 2 a65 1 cpu_count_sync_all(); d71 4 a74 5 uvmexp.npages, active, inactive, uvmexp.wired, uvm_availmem()); (*pr)(" pages %" PRId64 " anon, %" PRId64 " file, %" PRId64 " exec\n", cpu_count_get(CPU_COUNT_ANONPAGES), cpu_count_get(CPU_COUNT_FILEPAGES), cpu_count_get(CPU_COUNT_EXECPAGES)); d77 2 a78 3 (*pr)(" resv-pg=%d, resv-kernel=%d, zeropages=%" PRId64 "\n", uvmexp.reserve_pagedaemon, uvmexp.reserve_kernel, cpu_count_get(CPU_COUNT_ZEROPAGES)); d82 9 a90 9 (*pr)(" faults=%" PRId64 ", traps=%" PRId64 ", " "intrs=%" PRId64 ", ctxswitch=%" PRId64 "\n", cpu_count_get(CPU_COUNT_NFAULT), cpu_count_get(CPU_COUNT_NTRAP), cpu_count_get(CPU_COUNT_NINTR), cpu_count_get(CPU_COUNT_NSWTCH)); (*pr)(" softint=%" PRId64 ", syscalls=%" PRId64 "\n", cpu_count_get(CPU_COUNT_NSOFT), cpu_count_get(CPU_COUNT_NSYSCALL)); d93 11 a103 26 (*pr)(" noram=%" PRId64 ", noanon=%" PRId64 ", pgwait=%" PRId64 ", pgrele=%" PRId64 "\n", cpu_count_get(CPU_COUNT_FLTNORAM), cpu_count_get(CPU_COUNT_FLTNOANON), cpu_count_get(CPU_COUNT_FLTPGWAIT), cpu_count_get(CPU_COUNT_FLTPGRELE)); (*pr)(" ok relocks(total)=%" PRId64 "(%" PRId64 "), " "anget(retrys)=%" PRId64 "(%" PRId64 "), amapcopy=%" PRId64 "\n", cpu_count_get(CPU_COUNT_FLTRELCKOK), cpu_count_get(CPU_COUNT_FLTRELCK), cpu_count_get(CPU_COUNT_FLTANGET), cpu_count_get(CPU_COUNT_FLTANRETRY), cpu_count_get(CPU_COUNT_FLTAMCOPY)); (*pr)(" neighbor anon/obj pg=%" PRId64 "/%" PRId64 ", gets(lock/unlock)=%" PRId64 "/%" PRId64 "\n", cpu_count_get(CPU_COUNT_FLTNAMAP), cpu_count_get(CPU_COUNT_FLTNOMAP), cpu_count_get(CPU_COUNT_FLTLGET), cpu_count_get(CPU_COUNT_FLTGET)); (*pr)(" cases: anon=%" PRId64 ", anoncow=%" PRId64 ", obj=%" PRId64 ", prcopy=%" PRId64 ", przero=%" PRId64 "\n", cpu_count_get(CPU_COUNT_FLT_ANON), cpu_count_get(CPU_COUNT_FLT_ACOW), cpu_count_get(CPU_COUNT_FLT_OBJ), cpu_count_get(CPU_COUNT_FLT_PRCOPY), cpu_count_get(CPU_COUNT_FLT_PRZERO)); @ 1.38 log @fix the output of ddb's "show uvmexp" and also print the reserve_pagedaemon, reserve_kernel, and zeropages values. @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.37 2011/05/17 04:18:07 mrg Exp $ */ d35 1 a35 1 __KERNEL_RCSID(0, "$NetBSD: uvm_stat.c,v 1.37 2011/05/17 04:18:07 mrg Exp $"); d49 2 d59 1 d64 1 d79 2 @ 1.37 log @move and rename the uvm history code out of uvm_stat to "kernhist". rename "UVMHIST" option to enable the uvm histories. TODO: - make UVMHIST properly depend upon KERNHIST - enable dynamic registration of histories. this is mostly just allocating something in a bitmap, and is only for viewing multiple histories in a merged form. tested on amd64 and sparc64. @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.36 2011/02/02 15:13:34 chuck Exp $ */ d35 1 a35 1 __KERNEL_RCSID(0, "$NetBSD: uvm_stat.c,v 1.36 2011/02/02 15:13:34 chuck Exp $"); d63 1 a63 1 (*pr)(" pagesize=%d (0x%x), pagemask=0x%x, pageshift=%d\n, ncolors=%d", d73 2 @ 1.37.14.1 log @update from HEAD @ text @d1 1 a1 1 /* $NetBSD$ */ d35 1 a35 1 __KERNEL_RCSID(0, "$NetBSD$"); a48 2 #include a56 1 int poolpages; a60 1 poolpages = pool_totalpages(); d63 1 a63 1 (*pr)(" pagesize=%d (0x%x), pagemask=0x%x, pageshift=%d, ncolors=%d\n", a72 4 (*pr)(" resv-pg=%d, resv-kernel=%d, zeropages=%d\n", uvmexp.reserve_pagedaemon, uvmexp.reserve_kernel, uvmexp.zeropages); (*pr)(" bootpages=%d, poolpages=%d\n", uvmexp.bootpages, poolpages); @ 1.37.36.1 log @Sync with HEAD. (Note that most of these changes are simply $NetBSD$ tag issues.) @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.38 2016/12/01 01:59:17 mrg Exp $ */ d35 1 a35 1 __KERNEL_RCSID(0, "$NetBSD: uvm_stat.c,v 1.38 2016/12/01 01:59:17 mrg Exp $"); d63 1 a63 1 (*pr)(" pagesize=%d (0x%x), pagemask=0x%x, pageshift=%d, ncolors=%d\n", a72 2 (*pr)(" resv-pg=%d, resv-kernel=%d, zeropages=%d\n", uvmexp.reserve_pagedaemon, uvmexp.reserve_kernel, uvmexp.zeropages); @ 1.37.32.1 log @Sync with HEAD @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.38 2016/12/01 01:59:17 mrg Exp $ */ d35 1 a35 1 __KERNEL_RCSID(0, "$NetBSD: uvm_stat.c,v 1.38 2016/12/01 01:59:17 mrg Exp $"); d63 1 a63 1 (*pr)(" pagesize=%d (0x%x), pagemask=0x%x, pageshift=%d, ncolors=%d\n", a72 2 (*pr)(" resv-pg=%d, resv-kernel=%d, zeropages=%d\n", uvmexp.reserve_pagedaemon, uvmexp.reserve_kernel, uvmexp.zeropages); @ 1.36 log @udpate license clauses on my code to match the new-style BSD licenses. based on diff that rmind@@ sent me. no functional change with this commit. @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.35 2011/01/05 21:20:44 enami Exp $ */ d35 1 a35 1 __KERNEL_RCSID(0, "$NetBSD: uvm_stat.c,v 1.35 2011/01/05 21:20:44 enami Exp $"); a36 1 #include "opt_uvmhist.h" a46 12 /* * globals */ #ifdef UVMHIST struct uvm_history_head uvm_histories; #endif #ifdef UVMHIST_PRINT int uvmhist_print_enabled = 1; #endif a49 136 * prototypes */ #ifdef UVMHIST void uvmhist_dump(struct uvm_history *); void uvm_hist(u_int32_t); static void uvmhist_dump_histories(struct uvm_history *[]); #endif void uvmcnt_dump(void); #ifdef UVMHIST /* call this from ddb */ void uvmhist_dump(struct uvm_history *l) { int lcv, s; s = splhigh(); lcv = l->f; do { if (l->e[lcv].fmt) uvmhist_entry_print(&l->e[lcv]); lcv = (lcv + 1) % l->n; } while (lcv != l->f); splx(s); } /* * print a merged list of uvm_history structures */ static void uvmhist_dump_histories(struct uvm_history *hists[]) { struct timeval tv; int cur[MAXHISTS]; int s, lcv, hi; /* so we don't get corrupted lists! */ s = splhigh(); /* find the first of each list */ for (lcv = 0; hists[lcv]; lcv++) cur[lcv] = hists[lcv]->f; /* * here we loop "forever", finding the next earliest * history entry and printing it. cur[X] is the current * entry to test for the history in hists[X]. if it is * -1, then this history is finished. */ for (;;) { hi = -1; tv.tv_sec = tv.tv_usec = 0; /* loop over each history */ for (lcv = 0; hists[lcv]; lcv++) { restart: if (cur[lcv] == -1) continue; /* * if the format is empty, go to the next entry * and retry. */ if (hists[lcv]->e[cur[lcv]].fmt == NULL) { cur[lcv] = (cur[lcv] + 1) % (hists[lcv]->n); if (cur[lcv] == hists[lcv]->f) cur[lcv] = -1; goto restart; } /* * if the time hasn't been set yet, or this entry is * earlier than the current tv, set the time and history * index. */ if (tv.tv_sec == 0 || timercmp(&hists[lcv]->e[cur[lcv]].tv, &tv, <)) { tv = hists[lcv]->e[cur[lcv]].tv; hi = lcv; } } /* if we didn't find any entries, we must be done */ if (hi == -1) break; /* print and move to the next entry */ uvmhist_entry_print(&hists[hi]->e[cur[hi]]); cur[hi] = (cur[hi] + 1) % (hists[hi]->n); if (cur[hi] == hists[hi]->f) cur[hi] = -1; } splx(s); } /* * call this from ddb. `bitmask' is from . it * merges the named histories. */ void uvm_hist(u_int32_t bitmask) /* XXX only support 32 hists */ { struct uvm_history *hists[MAXHISTS + 1]; int i = 0; if ((bitmask & UVMHIST_MAPHIST) || bitmask == 0) hists[i++] = &maphist; if ((bitmask & UVMHIST_PDHIST) || bitmask == 0) hists[i++] = &pdhist; if ((bitmask & UVMHIST_UBCHIST) || bitmask == 0) hists[i++] = &ubchist; if ((bitmask & UVMHIST_LOANHIST) || bitmask == 0) hists[i++] = &loanhist; hists[i] = NULL; uvmhist_dump_histories(hists); } /* * uvmhist_print: ddb hook to print uvm history */ void uvmhist_print(void (*pr)(const char *, ...)) { uvmhist_dump(LIST_FIRST(&uvm_histories)); } #endif /* UVMHIST */ /* @ 1.35 log @Fix format string; use PRIu64 for uint64_t. @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.34 2011/01/04 08:17:01 matt Exp $ */ a3 1 * a14 6 * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by Charles D. Cranor and * Washington University. * 4. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. d35 1 a35 1 __KERNEL_RCSID(0, "$NetBSD: uvm_stat.c,v 1.34 2011/01/04 08:17:01 matt Exp $"); @ 1.35.2.1 log @Sync with HEAD. @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.37 2011/05/17 04:18:07 mrg Exp $ */ d4 1 d16 6 d42 1 a42 1 __KERNEL_RCSID(0, "$NetBSD: uvm_stat.c,v 1.37 2011/05/17 04:18:07 mrg Exp $"); d44 1 d55 12 d70 136 @ 1.35.4.1 log @Sync with HEAD @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.36 2011/02/02 15:13:34 chuck Exp $ */ d4 1 d16 6 d42 1 a42 1 __KERNEL_RCSID(0, "$NetBSD: uvm_stat.c,v 1.36 2011/02/02 15:13:34 chuck Exp $"); @ 1.34 log @Print the number of page colors in use with db> show uvm @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.33 2010/12/20 00:25:48 matt Exp $ */ d42 1 a42 1 __KERNEL_RCSID(0, "$NetBSD: uvm_stat.c,v 1.33 2010/12/20 00:25:48 matt Exp $"); d209 2 a210 1 uvmexp_print(void (*pr)(const char *, ...)) d233 1 a233 1 "intrs=%llu, ctxswitch=%llu\n", @ 1.33 log @Move counting of faults, traps, intrs, soft[intr]s, syscalls, and nswtch from uvmexp to per-cpu cpu_data and move them to 64bits. Remove unneeded includes of and/or . @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.32 2009/10/21 21:12:07 rmind Exp $ */ d42 1 a42 1 __KERNEL_RCSID(0, "$NetBSD: uvm_stat.c,v 1.32 2009/10/21 21:12:07 rmind Exp $"); d218 1 a218 1 (*pr)(" pagesize=%d (0x%x), pagemask=0x%x, pageshift=%d\n", d220 1 a220 1 uvmexp.pageshift); @ 1.32 log @Remove uarea swap-out functionality: - Addresses the issue described in PR/38828. - Some simplification in threading and sleepq subsystems. - Eliminates pmap_collect() and, as a side note, allows pmap optimisations. - Eliminates XS_CTL_DATA_ONSTACK in scsipi code. - Avoids few scans on LWP list and thus potentially long holds of proc_lock. - Cuts ~1.5k lines of code. Reduces amd64 kernel size by ~4k. - Removes __SWAP_BROKEN cases. Tested on x86, mips, acorn32 (thanks ) and partly tested on acorn26 (thanks to ). Discussed on , reviewed by . @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.31 2008/08/08 17:09:28 skrll Exp $ */ d42 1 a42 1 __KERNEL_RCSID(0, "$NetBSD: uvm_stat.c,v 1.31 2008/08/08 17:09:28 skrll Exp $"); d50 1 d212 2 d228 10 a237 3 (*pr)(" faults=%d, traps=%d, intrs=%d, ctxswitch=%d\n", uvmexp.faults, uvmexp.traps, uvmexp.intrs, uvmexp.swtch); (*pr)(" softint=%d, syscalls=%d\n", uvmexp.softs, uvmexp.syscalls); @ 1.32.4.1 log @sync with head @ text @d1 1 a1 1 /* $NetBSD$ */ d4 1 d16 6 d42 1 a42 1 __KERNEL_RCSID(0, "$NetBSD$"); a49 1 #include d208 1 a208 2 uvmexp_print(void (*pr)(const char *, ...) __attribute__((__format__(__printf__,1,2)))) a210 2 CPU_INFO_ITERATOR cii; struct cpu_info *ci; d215 1 a215 1 (*pr)(" pagesize=%d (0x%x), pagemask=0x%x, pageshift=%d\n, ncolors=%d", d217 1 a217 1 uvmexp.pageshift, uvmexp.ncolors); d225 3 a227 10 for (CPU_INFO_FOREACH(cii, ci)) { (*pr)(" cpu%u:\n", cpu_index(ci)); (*pr)(" faults=%" PRIu64 ", traps=%" PRIu64 ", " "intrs=%" PRIu64 ", ctxswitch=%" PRIu64 "\n", ci->ci_data.cpu_nfault, ci->ci_data.cpu_ntrap, ci->ci_data.cpu_nintr, ci->ci_data.cpu_nswtch); (*pr)(" softint=%" PRIu64 ", syscalls=%" PRIu64 "\n", ci->ci_data.cpu_nsoft, ci->ci_data.cpu_nsyscall); } @ 1.32.4.2 log @sync with head @ text @d37 1 d48 12 d63 136 @ 1.31 log @Make "show uvmhist" available to all arches (not just sparc*) in ddb. @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.30 2006/09/15 15:51:13 yamt Exp $ */ d42 1 a42 1 __KERNEL_RCSID(0, "$NetBSD: uvm_stat.c,v 1.30 2006/09/15 15:51:13 yamt Exp $"); d227 1 a227 2 (*pr)(" softint=%d, syscalls=%d, swapins=%d, swapouts=%d\n", uvmexp.softs, uvmexp.syscalls, uvmexp.swapins, uvmexp.swapouts); @ 1.31.12.1 log @Print out colors in uvmexp_print @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.31 2008/08/08 17:09:28 skrll Exp $ */ d42 1 a42 1 __KERNEL_RCSID(0, "$NetBSD: uvm_stat.c,v 1.31 2008/08/08 17:09:28 skrll Exp $"); d215 1 a215 1 (*pr)(" pagesize=%d (0x%x), pagemask=0x%x, pageshift=%d, ncolors=%d\n", d217 1 a217 1 uvmexp.pageshift, uvmexp.ncolors); @ 1.31.12.2 log @Major changes to uvm. Support multiple collections (groups) of free pages and run the page reclaimation algorithm on each group independently. @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.31.12.1 2010/01/22 04:03:21 matt Exp $ */ d42 1 a42 1 __KERNEL_RCSID(0, "$NetBSD: uvm_stat.c,v 1.31.12.1 2010/01/22 04:03:21 matt Exp $"); a49 1 #include a209 1 struct uvm_pggroup *grp; d215 1 a215 2 (*pr)(" pagesize=%d (0x%x), pagemask=0x%x, pageshift=%d," " ncolors=%d, npggroups=%d\n", d217 1 a217 1 uvmexp.pageshift, uvmexp.ncolors, uvmexp.npggroups); a224 17 STAILQ_FOREACH(grp, &uvm.page_groups, pgrp_uvm_link) { if (uvmexp.npggroups > 1) { (*pr)(" [%zd]: pages=%u, free=%u, freemin=%u," " free-target=%u, wired-max=%u\n", grp - uvm.pggroups, grp->pgrp_npages, grp->pgrp_free, grp->pgrp_freemin, grp->pgrp_freetarg, grp->pgrp_wiredmax); (*pr)(" active=%u, inactive=%u, kmem=%u," " anon=%u, file=%u, exec=%u\n", grp->pgrp_active, grp->pgrp_inactive, grp->pgrp_kmempages, grp->pgrp_anonpages, grp->pgrp_filepages, grp->pgrp_execpages); } else { (*pr)(" active=%u, inactive=%u\n", grp->pgrp_active, grp->pgrp_inactive); } } a229 32 (*pr)(" color counts:\n"); for (u_int pggroup = 0; pggroup < uvmexp.ncolors; pggroup++) { const struct pgfreelist * const gpgfl = &uvm.page_free[pggroup]; (*pr)(" color#%u: hit=%"PRIu64", miss=%"PRIu64 ", fail=%"PRIu64", any=%"PRIu64"\n", pggroup, gpgfl->pgfl_colorhit, gpgfl->pgfl_colormiss, gpgfl->pgfl_colorfail, gpgfl->pgfl_colorany); #if defined(MULTIPROCESSOR) if (ncpu > 1) { CPU_INFO_ITERATOR cii; struct cpu_info *ci; for (CPU_INFO_FOREACH(cii, ci)) { const struct uvm_cpu * const ucpu = &uvm.cpus[cpu_index(ci)]; const struct pgfreelist * const pgfl = &ucpu->page_free[pggroup]; (*pr)(" cpu#%u: hit=%"PRIu64", miss=%"PRIu64 ", fail=%"PRIu64", any=%"PRIu64"\n", cpu_index(ci), pgfl->pgfl_colorhit, pgfl->pgfl_colormiss, pgfl->pgfl_colorfail, pgfl->pgfl_colorany); } for (CPU_INFO_FOREACH(cii, ci)) { const struct uvm_cpu * const ucpu = &uvm.cpus[cpu_index(ci)]; (*pr)(" cpu%u: cpuhit=%"PRIu64", cpumiss=%"PRIu64"\n", cpu_index(ci), ucpu->page_cpuhit, ucpu->page_cpumiss); } } #endif } d243 9 a251 19 (*pr)(" page daemon counts:\n"); (*pr)(" woke=%d\n", uvmexp.pdwoke); STAILQ_FOREACH(grp, &uvm.page_groups, pgrp_uvm_link) { (*pr)(" group#%zd\n", grp - uvm.pggroups); (*pr)(" revs=%"PRIu64", scans=%"PRIu64 ", obscans=%"PRIu64", anscans=%"PRIu64"\n", grp->pgrp_pdrevs, grp->pgrp_pdscans, grp->pgrp_pdobscan, grp->pgrp_pdanscan); (*pr)(" busy=%"PRIu64", freed=%"PRIu64", reactivate=%"PRIu64 ", deactivate=%"PRIu64"\n", grp->pgrp_pdbusy, grp->pgrp_pdfreed, grp->pgrp_pdreact, grp->pgrp_pddeact); (*pr)(" pageouts=%"PRIu64", pending=%"PRIu64 ", paging=%"PRIu64"\n", grp->pgrp_pdpageouts, grp->pgrp_pdpending, grp->pgrp_paging); } (*pr)(" swap counts:\n"); (*pr)(" nswapdev=%"PRIu64", swpgavail=%"PRIu64"\n", d253 2 a254 2 (*pr)(" swpages=%d, swpginuse=%d, swpgonly=%d, nswget=%"PRIu64"\n", uvmexp.swpages, uvmexp.swpginuse, uvmexp.swpgonly, uvmexp.nswget); @ 1.31.12.3 log @Track the victims selected by the pagedaemon and what happens to then. Keep a hint for what page group has the most free pages for a given color. @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.31.12.2 2012/02/09 03:05:01 matt Exp $ */ d42 1 a42 1 __KERNEL_RCSID(0, "$NetBSD: uvm_stat.c,v 1.31.12.2 2012/02/09 03:05:01 matt Exp $"); a239 2 (*pr)(" hints=%"PRIu64" (failed=%"PRIu64")\n", grp->pgrp_hints, grp->pgrp_hintfails); d299 3 a301 6 (*pr)(" revs=%"PRIu64 ", scans=%"PRIu64 " (null=%"PRIu64 ", obj=%"PRIu64 ", anon=%"PRIu64")\n", grp->pgrp_pdrevs, grp->pgrp_pdscans, grp->pgrp_pdnullscans, d303 1 a303 4 (*pr)(" victims=%"PRIu64 ", busy=%"PRIu64 ", freed=%"PRIu64 ", reactivate=%"PRIu64 d305 3 a307 4 grp->pgrp_pdvictims, grp->pgrp_pdbusy, grp->pgrp_pdfreed, grp->pgrp_pdreact, grp->pgrp_pddeact); (*pr)(" pageouts=%"PRIu64 ", pending=%"PRIu64 @ 1.31.12.4 log @Separate object-less anon pages out of the active list if there is no swap device. Make uvm_reclaimable and uvm.*estimatable understand colors and kmem allocations. @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.31.12.3 2012/02/16 04:20:46 matt Exp $ */ d42 1 a42 1 __KERNEL_RCSID(0, "$NetBSD: uvm_stat.c,v 1.31.12.3 2012/02/16 04:20:46 matt Exp $"); d214 1 a214 1 uvm_estimatepageable(NULL, &active, &inactive); @ 1.30 log @merge yamt-pdpolicy branch. - separate page replacement policy from the rest of kernel - implement an alternative replacement policy @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.29 2005/11/29 15:45:28 yamt Exp $ */ d42 1 a42 1 __KERNEL_RCSID(0, "$NetBSD: uvm_stat.c,v 1.29 2005/11/29 15:45:28 yamt Exp $"); d91 1 a91 1 uvmhist_print(&l->e[lcv]); d158 1 a158 1 uvmhist_print(&hists[hi]->e[cur[hi]]); d192 10 @ 1.30.54.1 log @sync with head. @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.30 2006/09/15 15:51:13 yamt Exp $ */ d42 1 a42 1 __KERNEL_RCSID(0, "$NetBSD: uvm_stat.c,v 1.30 2006/09/15 15:51:13 yamt Exp $"); d91 1 a91 1 uvmhist_entry_print(&l->e[lcv]); d158 1 a158 1 uvmhist_entry_print(&hists[hi]->e[cur[hi]]); a191 10 /* * uvmhist_print: ddb hook to print uvm history */ void uvmhist_print(void (*pr)(const char *, ...)) { uvmhist_dump(LIST_FIRST(&uvm_histories)); } @ 1.30.54.2 log @sync with head @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.30.54.1 2009/05/04 08:14:40 yamt Exp $ */ d42 1 a42 1 __KERNEL_RCSID(0, "$NetBSD: uvm_stat.c,v 1.30.54.1 2009/05/04 08:14:40 yamt Exp $"); d227 2 a228 1 (*pr)(" softint=%d, syscalls=%d\n", uvmexp.softs, uvmexp.syscalls); @ 1.30.60.1 log @Sync with HEAD. @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.31 2008/08/08 17:09:28 skrll Exp $ */ d42 1 a42 1 __KERNEL_RCSID(0, "$NetBSD: uvm_stat.c,v 1.31 2008/08/08 17:09:28 skrll Exp $"); d91 1 a91 1 uvmhist_entry_print(&l->e[lcv]); d158 1 a158 1 uvmhist_entry_print(&hists[hi]->e[cur[hi]]); a191 10 /* * uvmhist_print: ddb hook to print uvm history */ void uvmhist_print(void (*pr)(const char *, ...)) { uvmhist_dump(LIST_FIRST(&uvm_histories)); } @ 1.30.50.1 log @Sync with HEAD. @ text @d1 1 a1 1 /* $NetBSD$ */ d42 1 a42 1 __KERNEL_RCSID(0, "$NetBSD$"); d91 1 a91 1 uvmhist_entry_print(&l->e[lcv]); d158 1 a158 1 uvmhist_entry_print(&hists[hi]->e[cur[hi]]); a191 10 /* * uvmhist_print: ddb hook to print uvm history */ void uvmhist_print(void (*pr)(const char *, ...)) { uvmhist_dump(LIST_FIRST(&uvm_histories)); } @ 1.30.56.1 log @Sync with wrstuden-revivesa-base-2. @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.30 2006/09/15 15:51:13 yamt Exp $ */ d42 1 a42 1 __KERNEL_RCSID(0, "$NetBSD: uvm_stat.c,v 1.30 2006/09/15 15:51:13 yamt Exp $"); d91 1 a91 1 uvmhist_entry_print(&l->e[lcv]); d158 1 a158 1 uvmhist_entry_print(&hists[hi]->e[cur[hi]]); a191 10 /* * uvmhist_print: ddb hook to print uvm history */ void uvmhist_print(void (*pr)(const char *, ...)) { uvmhist_dump(LIST_FIRST(&uvm_histories)); } @ 1.30.58.1 log @Sync with head. @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.30 2006/09/15 15:51:13 yamt Exp $ */ d42 1 a42 1 __KERNEL_RCSID(0, "$NetBSD: uvm_stat.c,v 1.30 2006/09/15 15:51:13 yamt Exp $"); d87 1 a87 1 s = 0; //XXXXXXXXXXXXXXXXXXXXXXX s = splhigh(); d94 1 a94 1 //XXXXXXXXXXXXXXXXXXXXXXX splx(s); d108 1 a108 1 s = 0; //XXXXXXXXXXXXXXXXXXXXXXX s = splhigh(); d163 1 a163 1 //XXXXXXXXXXXXXXXXXXXXXXX splx(s); @ 1.30.58.2 log @Revert local changes that were not meant to be in previous "sync with head" commit. @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.30.58.1 2008/06/27 15:11:55 simonb Exp $ */ d42 1 a42 1 __KERNEL_RCSID(0, "$NetBSD: uvm_stat.c,v 1.30.58.1 2008/06/27 15:11:55 simonb Exp $"); d87 1 a87 1 s = splhigh(); d94 1 a94 1 splx(s); d108 1 a108 1 s = splhigh(); d163 1 a163 1 splx(s); @ 1.29 log @read-ahead statistics. @ text @d1 1 a1 1 /* $NetBSD$ */ d42 1 a42 1 __KERNEL_RCSID(0, "$NetBSD$"); d200 3 d209 1 a209 1 uvmexp.npages, uvmexp.active, uvmexp.inactive, uvmexp.wired, a210 6 (*pr)(" min %d%% (%d) anon, %d%% (%d) file, %d%% (%d) exec\n", uvmexp.anonminpct, uvmexp.anonmin, uvmexp.fileminpct, uvmexp.filemin, uvmexp.execminpct, uvmexp.execmin); (*pr)(" max %d%% (%d) anon, %d%% (%d) file, %d%% (%d) exec\n", uvmexp.anonmaxpct, uvmexp.anonmax, uvmexp.filemaxpct, uvmexp.filemax, uvmexp.execmaxpct, uvmexp.execmax); d213 2 a214 3 (*pr)(" freemin=%d, free-target=%d, inactive-target=%d, " "wired-max=%d\n", uvmexp.freemin, uvmexp.freetarg, uvmexp.inactarg, uvmexp.wiredmax); @ 1.29.20.1 log @Sync with head. @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.30 2006/09/15 15:51:13 yamt Exp $ */ d42 1 a42 1 __KERNEL_RCSID(0, "$NetBSD: uvm_stat.c,v 1.30 2006/09/15 15:51:13 yamt Exp $"); a199 3 int active, inactive; uvm_estimatepageable(&active, &inactive); d206 1 a206 1 uvmexp.npages, active, inactive, uvmexp.wired, d208 6 d216 3 a218 2 (*pr)(" freemin=%d, free-target=%d, wired-max=%d\n", uvmexp.freemin, uvmexp.freetarg, uvmexp.wiredmax); @ 1.29.8.1 log @separate page replacement policy from the rest of kernel. @ text @a199 3 int active, inactive; uvm_estimatepageable(&active, &inactive); d206 1 a206 1 uvmexp.npages, active, inactive, uvmexp.wired, d208 6 d216 3 a218 2 (*pr)(" freemin=%d, free-target=%d, wired-max=%d\n", uvmexp.freemin, uvmexp.freetarg, uvmexp.wiredmax); @ 1.28 log @Use ANSI function decls. @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.27 2005/05/15 08:01:06 yamt Exp $ */ d42 1 a42 1 __KERNEL_RCSID(0, "$NetBSD: uvm_stat.c,v 1.27 2005/05/15 08:01:06 yamt Exp $"); d45 1 d251 13 @ 1.28.2.1 log @sync with head. @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.28 2005/06/27 02:19:48 thorpej Exp $ */ d42 1 a42 1 __KERNEL_RCSID(0, "$NetBSD: uvm_stat.c,v 1.28 2005/06/27 02:19:48 thorpej Exp $"); a44 1 #include "opt_readahead.h" a249 13 #if defined(READAHEAD_STATS) #define UVM_RA_EVCNT_DEFINE(name) \ struct evcnt uvm_ra_##name = \ EVCNT_INITIALIZER(EVCNT_TYPE_MISC, NULL, "readahead", #name); \ EVCNT_ATTACH_STATIC(uvm_ra_##name); UVM_RA_EVCNT_DEFINE(total); UVM_RA_EVCNT_DEFINE(hit); UVM_RA_EVCNT_DEFINE(miss); #endif /* defined(READAHEAD_STATS) */ @ 1.28.2.2 log @sync with head. @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.28.2.1 2006/06/21 15:12:40 yamt Exp $ */ d42 1 a42 1 __KERNEL_RCSID(0, "$NetBSD: uvm_stat.c,v 1.28.2.1 2006/06/21 15:12:40 yamt Exp $"); a199 3 int active, inactive; uvm_estimatepageable(&active, &inactive); d206 1 a206 1 uvmexp.npages, active, inactive, uvmexp.wired, d208 6 d216 3 a218 2 (*pr)(" freemin=%d, free-target=%d, wired-max=%d\n", uvmexp.freemin, uvmexp.freetarg, uvmexp.wiredmax); @ 1.28.8.1 log @sync with head. @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.28 2005/06/27 02:19:48 thorpej Exp $ */ d42 1 a42 1 __KERNEL_RCSID(0, "$NetBSD: uvm_stat.c,v 1.28 2005/06/27 02:19:48 thorpej Exp $"); a44 1 #include "opt_readahead.h" a249 13 #if defined(READAHEAD_STATS) #define UVM_RA_EVCNT_DEFINE(name) \ struct evcnt uvm_ra_##name = \ EVCNT_INITIALIZER(EVCNT_TYPE_MISC, NULL, "readahead", #name); \ EVCNT_ATTACH_STATIC(uvm_ra_##name); UVM_RA_EVCNT_DEFINE(total); UVM_RA_EVCNT_DEFINE(hit); UVM_RA_EVCNT_DEFINE(miss); #endif /* defined(READAHEAD_STATS) */ @ 1.27 log @remove anon related statistics which are no longer used. @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.26 2005/04/27 11:02:43 yamt Exp $ */ d42 1 a42 1 __KERNEL_RCSID(0, "$NetBSD: uvm_stat.c,v 1.26 2005/04/27 11:02:43 yamt Exp $"); d82 1 a82 2 uvmhist_dump(l) struct uvm_history *l; d100 1 a100 2 uvmhist_dump_histories(hists) struct uvm_history *hists[]; d170 1 a170 2 uvm_hist(bitmask) u_int32_t bitmask; /* XXX only support 32 hists */ @ 1.26 log @uvmexp_print: print swpgavail as well. @ text @d1 1 a1 1 /* $NetBSD$ */ d42 1 a42 1 __KERNEL_RCSID(0, "$NetBSD$"); d247 3 a249 4 (*pr)(" nswapdev=%d, nanon=%d, nanonneeded=%d nfreeanon=%d\n", uvmexp.nswapdev, uvmexp.nanon, uvmexp.nanonneeded, uvmexp.nfreeanon); (*pr)(" swpages=%d, swpginuse=%d, swpgonly=%d paging=%d\n", a250 2 (*pr)(" swpgavail=%d\n", uvmexp.swpgavail); @ 1.25 log @introduce UVMHIST_LOANHIST and sprinkle UVMHIST_LOGs. @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.24 2004/05/01 19:40:39 petrov Exp $ */ d42 1 a42 1 __KERNEL_RCSID(0, "$NetBSD: uvm_stat.c,v 1.24 2004/05/01 19:40:39 petrov Exp $"); d252 2 @ 1.25.4.1 log @sync with -current @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.26 2005/04/27 11:02:43 yamt Exp $ */ d42 1 a42 1 __KERNEL_RCSID(0, "$NetBSD: uvm_stat.c,v 1.26 2005/04/27 11:02:43 yamt Exp $"); a251 2 (*pr)(" swpgavail=%d\n", uvmexp.swpgavail); @ 1.24 log @Replace uvm counters with evcnt, initialize them through __link_set (from Matt Thomas), disable counters by default and add configuration option UVMMAP_COUNTERS. @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.23 2004/03/24 07:55:01 junyoung Exp $ */ d42 1 a42 1 __KERNEL_RCSID(0, "$NetBSD: uvm_stat.c,v 1.23 2004/03/24 07:55:01 junyoung Exp $"); d187 3 @ 1.23 log @Nuke __P(). @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.22 2001/12/09 03:07:20 chs Exp $ */ d42 1 a42 1 __KERNEL_RCSID(0, "$NetBSD: uvm_stat.c,v 1.22 2001/12/09 03:07:20 chs Exp $"); a56 2 struct uvm_cnt *uvm_cnt_head = NULL; a192 13 void uvmcnt_dump() { struct uvm_cnt *uvc = uvm_cnt_head; while (uvc) { if ((uvc->t & UVMCNT_MASK) != UVMCNT_CNT) continue; printf("%s = %d\n", uvc->name, uvc->c); uvc = uvc->next; } } @ 1.23.2.1 log @Pull up revision 1.24 (requested by petrov in ticket #269) Replace uvm counters with evcnt, initialize them through __link_set (from Matt Thomas), disable counters by default and add configuration option UVMMAP_COUNTERS. @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.23 2004/03/24 07:55:01 junyoung Exp $ */ d42 1 a42 1 __KERNEL_RCSID(0, "$NetBSD: uvm_stat.c,v 1.23 2004/03/24 07:55:01 junyoung Exp $"); d57 2 d195 13 @ 1.22 log @add {anon,file,exec}max as a upper bound on the amount of memory that will be allocated for the respective usage types when there is contention for memory. replace "vnode" and "vtext" with "file" and "exec" in uvmexp field names and sysctl names. @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.21 2001/11/10 07:37:01 lukem Exp $ */ d42 1 a42 1 __KERNEL_RCSID(0, "$NetBSD: uvm_stat.c,v 1.21 2001/11/10 07:37:01 lukem Exp $"); d74 3 a76 3 void uvmhist_dump __P((struct uvm_history *)); void uvm_hist __P((u_int32_t)); static void uvmhist_dump_histories __P((struct uvm_history *[])); d78 1 a78 1 void uvmcnt_dump __P((void)); @ 1.22.16.1 log @Sync with HEAD @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.24 2004/05/01 19:40:39 petrov Exp $ */ d42 1 a42 1 __KERNEL_RCSID(0, "$NetBSD: uvm_stat.c,v 1.24 2004/05/01 19:40:39 petrov Exp $"); d57 2 d74 3 a76 3 void uvmhist_dump(struct uvm_history *); void uvm_hist(u_int32_t); static void uvmhist_dump_histories(struct uvm_history *[]); d78 1 a78 1 void uvmcnt_dump(void); d195 13 @ 1.22.16.2 log @Sync with HEAD. @ text @@ 1.22.16.3 log @Fix the sync with head I botched. @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.22.16.1 2004/08/03 10:57:09 skrll Exp $ */ d42 1 a42 1 __KERNEL_RCSID(0, "$NetBSD: uvm_stat.c,v 1.22.16.1 2004/08/03 10:57:09 skrll Exp $"); @ 1.22.16.4 log @Sync with HEAD. @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.22.16.3 2004/09/21 13:39:31 skrll Exp $ */ d42 1 a42 1 __KERNEL_RCSID(0, "$NetBSD: uvm_stat.c,v 1.22.16.3 2004/09/21 13:39:31 skrll Exp $"); a186 3 if ((bitmask & UVMHIST_LOANHIST) || bitmask == 0) hists[i++] = &loanhist; @ 1.22.16.5 log @Sync with HEAD. Here we go again... @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.22.16.4 2004/11/29 07:25:05 skrll Exp $ */ d42 1 a42 1 __KERNEL_RCSID(0, "$NetBSD: uvm_stat.c,v 1.22.16.4 2004/11/29 07:25:05 skrll Exp $"); d82 2 a83 1 uvmhist_dump(struct uvm_history *l) d101 2 a102 1 uvmhist_dump_histories(struct uvm_history *hists[]) d172 2 a173 1 uvm_hist(u_int32_t bitmask) /* XXX only support 32 hists */ d247 4 a250 3 (*pr)(" nswapdev=%d, swpgavail=%d\n", uvmexp.nswapdev, uvmexp.swpgavail); (*pr)(" swpages=%d, swpginuse=%d, swpgonly=%d, paging=%d\n", @ 1.22.16.6 log @Sync with head. @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.29 2005/11/29 15:45:28 yamt Exp $ */ d42 1 a42 1 __KERNEL_RCSID(0, "$NetBSD: uvm_stat.c,v 1.29 2005/11/29 15:45:28 yamt Exp $"); a44 1 #include "opt_readahead.h" a249 13 #if defined(READAHEAD_STATS) #define UVM_RA_EVCNT_DEFINE(name) \ struct evcnt uvm_ra_##name = \ EVCNT_INITIALIZER(EVCNT_TYPE_MISC, NULL, "readahead", #name); \ EVCNT_ATTACH_STATIC(uvm_ra_##name); UVM_RA_EVCNT_DEFINE(total); UVM_RA_EVCNT_DEFINE(hit); UVM_RA_EVCNT_DEFINE(miss); #endif /* defined(READAHEAD_STATS) */ @ 1.21 log @add RCSIDs, and in some cases, slightly cleanup #include order @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.20 2001/09/15 20:36:47 chs Exp $ */ d42 1 a42 1 __KERNEL_RCSID(0, "$NetBSD$"); d222 8 a229 5 (*pr)(" min %d%% (%d) anon, %d%% (%d) vnode, %d%% (%d) vtext\n", uvmexp.anonminpct, uvmexp.anonmin, uvmexp.vnodeminpct, uvmexp.vnodemin, uvmexp.vtextminpct, uvmexp.vtextmin); (*pr)(" pages %d anon, %d vnode, %d vtext\n", uvmexp.anonpages, uvmexp.vnodepages, uvmexp.vtextpages); @ 1.20 log @a whole bunch of changes to improve performance and robustness under load: - remove special treatment of pager_map mappings in pmaps. this is required now, since I've removed the globals that expose the address range. pager_map now uses pmap_kenter_pa() instead of pmap_enter(), so there's no longer any need to special-case it. - eliminate struct uvm_vnode by moving its fields into struct vnode. - rewrite the pageout path. the pager is now responsible for handling the high-level requests instead of only getting control after a bunch of work has already been done on its behalf. this will allow us to UBCify LFS, which needs tighter control over its pages than other filesystems do. writing a page to disk no longer requires making it read-only, which allows us to write wired pages without causing all kinds of havoc. - use a new PG_PAGEOUT flag to indicate that a page should be freed on behalf of the pagedaemon when it's unlocked. this flag is very similar to PG_RELEASED, but unlike PG_RELEASED, PG_PAGEOUT can be cleared if the pageout fails due to eg. an indirect-block buffer being locked. this allows us to remove the "version" field from struct vm_page, and together with shrinking "loan_count" from 32 bits to 16, struct vm_page is now 4 bytes smaller. - no longer use PG_RELEASED for swap-backed pages. if the page is busy because it's being paged out, we can't release the swap slot to be reallocated until that write is complete, but unlike with vnodes we don't keep a count of in-progress writes so there's no good way to know when the write is done. instead, when we need to free a busy swap-backed page, just sleep until we can get it busy ourselves. - implement a fast-path for extending writes which allows us to avoid zeroing new pages. this substantially reduces cpu usage. - encapsulate the data used by the genfs code in a struct genfs_node, which must be the first element of the filesystem-specific vnode data for filesystems which use genfs_{get,put}pages(). - eliminate many of the UVM pagerops, since they aren't needed anymore now that the pager "put" operation is a higher-level operation. - enhance the genfs code to allow NFS to use the genfs_{get,put}pages instead of a modified copy. - clean up struct vnode by removing all the fields that used to be used by the vfs_cluster.c code (which we don't use anymore with UBC). - remove kmem_object and mb_object since they were useless. instead of allocating pages to these objects, we now just allocate pages with no object. such pages are mapped in the kernel until they are freed, so we can use the mapping to find the page to free it. this allows us to remove splvm() protection in several places. The sum of all these changes improves write throughput on my decstation 5000/200 to within 1% of the rate of NetBSD 1.5 and reduces the elapsed time for "make release" of a NetBSD 1.5 source tree on my 128MB pc to 10% less than a 1.5 kernel took. @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.19 2001/05/25 04:06:17 chs Exp $ */ a36 3 #include "opt_uvmhist.h" #include "opt_ddb.h" d40 6 @ 1.20.2.1 log @Sync the thorpej-mips-cache branch with -current. @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.21 2001/11/10 07:37:01 lukem Exp $ */ d37 3 a42 6 #include __KERNEL_RCSID(0, "$NetBSD: uvm_stat.c,v 1.21 2001/11/10 07:37:01 lukem Exp $"); #include "opt_uvmhist.h" #include "opt_ddb.h" @ 1.19 log @remove trailing whitespace. @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.18 2001/03/09 01:02:13 chs Exp $ */ a162 2 /* done! */ a257 4 (*pr)(" kernel pointers:\n"); (*pr)(" objs(kern/kmem/mb)=%p/%p/%p\n", uvm.kernel_object, uvmexp.kmem_object, uvmexp.mb_object); @ 1.19.2.1 log @Sync kqueue branch with -current. @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.22 2001/12/09 03:07:20 chs Exp $ */ d37 3 a43 6 #include __KERNEL_RCSID(0, "$NetBSD: uvm_stat.c,v 1.22 2001/12/09 03:07:20 chs Exp $"); #include "opt_uvmhist.h" #include "opt_ddb.h" d163 2 d221 5 a225 8 (*pr)(" min %d%% (%d) anon, %d%% (%d) file, %d%% (%d) exec\n", uvmexp.anonminpct, uvmexp.anonmin, uvmexp.fileminpct, uvmexp.filemin, uvmexp.execminpct, uvmexp.execmin); (*pr)(" max %d%% (%d) anon, %d%% (%d) file, %d%% (%d) exec\n", uvmexp.anonmaxpct, uvmexp.anonmax, uvmexp.filemaxpct, uvmexp.filemax, uvmexp.execmaxpct, uvmexp.execmax); (*pr)(" pages %d anon, %d file, %d exec\n", uvmexp.anonpages, uvmexp.filepages, uvmexp.execpages); d260 4 @ 1.19.4.1 log @Catch up with -current. @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.20 2001/09/15 20:36:47 chs Exp $ */ d163 2 d260 4 @ 1.18 log @add UBC memory-usage balancing. we track the number of pages in use for each of the basic types (anonymous data, executable image, cached files) and prevent the pagedaemon from reusing a given page if that would reduce the count of that type of page below a sysctl-setable minimum threshold. the thresholds are controlled via three new sysctl tunables: vm.anonmin, vm.vnodemin, and vm.vtextmin. these tunables are the percentages of pageable memory reserved for each usage, and we do not allow the sum of the minimums to be more than 95% so that there's always some memory that can be reused. @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.17 2001/02/04 10:55:58 mrg Exp $ */ d140 1 a140 1 d163 1 a163 1 @ 1.17 log @allow ubchist to be printed from the uvmhist merging uvm_hist() @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.16 2000/12/01 09:48:56 chs Exp $ */ d221 4 a224 1 (*pr)(" %d anon, %d vnode, %d vtext\n", @ 1.17.2.1 log @Catch up with -current. @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.18 2001/03/09 01:02:13 chs Exp $ */ d221 1 a221 4 (*pr)(" min %d%% (%d) anon, %d%% (%d) vnode, %d%% (%d) vtext\n", uvmexp.anonminpct, uvmexp.anonmin, uvmexp.vnodeminpct, uvmexp.vnodemin, uvmexp.vtextminpct, uvmexp.vtextmin); (*pr)(" pages %d anon, %d vnode, %d vtext\n", @ 1.17.2.2 log @Catch up to -current. @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.17.2.1 2001/04/09 01:59:23 nathanw Exp $ */ d140 1 a140 1 d163 1 a163 1 @ 1.17.2.3 log @Catch up to -current. @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.17.2.2 2001/06/21 20:10:48 nathanw Exp $ */ d163 2 d260 4 @ 1.17.2.4 log @Catch up to -current. @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.17.2.3 2001/09/21 22:37:18 nathanw Exp $ */ d37 3 a42 6 #include __KERNEL_RCSID(0, "$NetBSD$"); #include "opt_uvmhist.h" #include "opt_ddb.h" @ 1.17.2.5 log @Catch up to -current. @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.17.2.4 2001/11/14 19:19:09 nathanw Exp $ */ d42 1 a42 1 __KERNEL_RCSID(0, "$NetBSD: uvm_stat.c,v 1.17.2.4 2001/11/14 19:19:09 nathanw Exp $"); d222 5 a226 8 (*pr)(" min %d%% (%d) anon, %d%% (%d) file, %d%% (%d) exec\n", uvmexp.anonminpct, uvmexp.anonmin, uvmexp.fileminpct, uvmexp.filemin, uvmexp.execminpct, uvmexp.execmin); (*pr)(" max %d%% (%d) anon, %d%% (%d) file, %d%% (%d) exec\n", uvmexp.anonmaxpct, uvmexp.anonmax, uvmexp.filemaxpct, uvmexp.filemax, uvmexp.execmaxpct, uvmexp.execmax); (*pr)(" pages %d anon, %d file, %d exec\n", uvmexp.anonpages, uvmexp.filepages, uvmexp.execpages); @ 1.16 log @add new uvmexp fields for uvmexp_print(). @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.15 2000/11/24 07:25:52 chs Exp $ */ d184 3 @ 1.15 log @add ddb commands "show uvmexp" and "show ncache". the former used to be "call uvm_dump", the latter is new. @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.14 2000/06/27 17:29:35 mrg Exp $ */ d218 2 @ 1.14 log @remove include of @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.13 2000/01/11 06:57:50 chs Exp $ */ d38 1 d48 1 d64 2 a75 1 void uvm_dump __P((void)); d205 1 a205 1 * uvm_dump: ddb hook to dump interesting uvm counters d207 2 a208 2 void uvm_dump() d211 2 a212 2 printf("Current UVM status:\n"); printf(" pagesize=%d (0x%x), pagemask=0x%x, pageshift=%d\n", d215 1 a215 1 printf(" %d VM pages: %d active, %d inactive, %d wired, %d free\n", d218 1 a218 1 printf(" freemin=%d, free-target=%d, inactive-target=%d, " d221 1 a221 1 printf(" faults=%d, traps=%d, intrs=%d, ctxswitch=%d\n", d223 1 a223 1 printf(" softint=%d, syscalls=%d, swapins=%d, swapouts=%d\n", d226 2 a227 2 printf(" fault counts:\n"); printf(" noram=%d, noanon=%d, pgwait=%d, pgrele=%d\n", d230 1 a230 1 printf(" ok relocks(total)=%d(%d), anget(retrys)=%d(%d), " d233 1 a233 1 printf(" neighbor anon/obj pg=%d/%d, gets(lock/unlock)=%d/%d\n", d235 1 a235 1 printf(" cases: anon=%d, anoncow=%d, obj=%d, prcopy=%d, przero=%d\n", d239 5 a243 4 printf(" daemon and swap counts:\n"); printf(" woke=%d, revs=%d, scans=%d, swout=%d\n", uvmexp.pdwoke, uvmexp.pdrevs, uvmexp.pdscans, uvmexp.pdswout); printf(" busy=%d, freed=%d, reactivate=%d, deactivate=%d\n", d245 1 a245 1 printf(" pageouts=%d, pending=%d, nswget=%d\n", uvmexp.pdpageouts, d247 1 a247 1 printf(" nswapdev=%d, nanon=%d, nanonneeded=%d nfreeanon=%d\n", d250 1 a250 1 printf(" swpages=%d, swpginuse=%d, swpgonly=%d paging=%d\n", d253 2 a254 2 printf(" kernel pointers:\n"); printf(" objs(kern/kmem/mb)=%p/%p/%p\n", uvm.kernel_object, d257 1 @ 1.13 log @add support for ``swapctl -d'' (removing swap space). improve handling of i/o errors in swap space. reviewed by: Chuck Cranor @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.12 1999/03/26 17:34:16 chs Exp $ */ a44 2 #include @ 1.12 log @add uvmexp.swpgonly and use it to detect out-of-swap conditions. @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.11 1999/03/25 18:48:56 mrg Exp $ */ d245 3 a247 2 printf(" nswapdev=%d, nanon=%d, nfreeanon=%d\n", uvmexp.nswapdev, uvmexp.nanon, uvmexp.nfreeanon); @ 1.12.8.1 log @Update thorpej_scsipi to -current as of a month ago @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.14 2000/06/27 17:29:35 mrg Exp $ */ d46 2 d245 2 a246 3 printf(" nswapdev=%d, nanon=%d, nanonneeded=%d nfreeanon=%d\n", uvmexp.nswapdev, uvmexp.nanon, uvmexp.nanonneeded, uvmexp.nfreeanon); @ 1.12.8.2 log @Sync with HEAD. @ text @d1 1 a1 1 /* $NetBSD$ */ a37 1 #include "opt_ddb.h" a46 1 #include a61 2 #ifdef DDB d72 1 d202 1 a202 1 * uvmexp_print: ddb hook to print interesting uvm counters d204 2 a205 2 void uvmexp_print(void (*pr)(const char *, ...)) d208 2 a209 2 (*pr)("Current UVM status:\n"); (*pr)(" pagesize=%d (0x%x), pagemask=0x%x, pageshift=%d\n", d212 1 a212 1 (*pr)(" %d VM pages: %d active, %d inactive, %d wired, %d free\n", d215 1 a215 3 (*pr)(" %d anon, %d vnode, %d vtext\n", uvmexp.anonpages, uvmexp.vnodepages, uvmexp.vtextpages); (*pr)(" freemin=%d, free-target=%d, inactive-target=%d, " d218 1 a218 1 (*pr)(" faults=%d, traps=%d, intrs=%d, ctxswitch=%d\n", d220 1 a220 1 (*pr)(" softint=%d, syscalls=%d, swapins=%d, swapouts=%d\n", d223 2 a224 2 (*pr)(" fault counts:\n"); (*pr)(" noram=%d, noanon=%d, pgwait=%d, pgrele=%d\n", d227 1 a227 1 (*pr)(" ok relocks(total)=%d(%d), anget(retrys)=%d(%d), " d230 1 a230 1 (*pr)(" neighbor anon/obj pg=%d/%d, gets(lock/unlock)=%d/%d\n", d232 1 a232 1 (*pr)(" cases: anon=%d, anoncow=%d, obj=%d, prcopy=%d, przero=%d\n", d236 4 a239 5 (*pr)(" daemon and swap counts:\n"); (*pr)(" woke=%d, revs=%d, scans=%d, obscans=%d, anscans=%d\n", uvmexp.pdwoke, uvmexp.pdrevs, uvmexp.pdscans, uvmexp.pdobscan, uvmexp.pdanscan); (*pr)(" busy=%d, freed=%d, reactivate=%d, deactivate=%d\n", d241 1 a241 1 (*pr)(" pageouts=%d, pending=%d, nswget=%d\n", uvmexp.pdpageouts, d243 1 a243 1 (*pr)(" nswapdev=%d, nanon=%d, nanonneeded=%d nfreeanon=%d\n", d246 1 a246 1 (*pr)(" swpages=%d, swpginuse=%d, swpgonly=%d paging=%d\n", d249 2 a250 2 (*pr)(" kernel pointers:\n"); (*pr)(" objs(kern/kmem/mb)=%p/%p/%p\n", uvm.kernel_object, a252 1 #endif @ 1.12.8.3 log @Sync with HEAD. @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.12.8.2 2000/12/08 09:21:06 bouyer Exp $ */ a183 3 if ((bitmask & UVMHIST_UBCHIST) || bitmask == 0) hists[i++] = &ubchist; @ 1.12.8.4 log @Sync with HEAD. @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.12.8.3 2001/02/11 19:17:51 bouyer Exp $ */ d221 1 a221 4 (*pr)(" min %d%% (%d) anon, %d%% (%d) vnode, %d%% (%d) vtext\n", uvmexp.anonminpct, uvmexp.anonmin, uvmexp.vnodeminpct, uvmexp.vnodemin, uvmexp.vtextminpct, uvmexp.vtextmin); (*pr)(" pages %d anon, %d vnode, %d vtext\n", @ 1.12.4.1 log @merge everything from chs-ubc branch. @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.12 1999/03/26 17:34:16 chs Exp $ */ d239 2 a240 3 printf(" woke=%d, revs=%d, scans=%d, obscans=%d, anscans=%d\n", uvmexp.pdwoke, uvmexp.pdrevs, uvmexp.pdscans, uvmexp.pdobscan, uvmexp.pdanscan); @ 1.11 log @remove now >1 year old pre-release message. @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.10 1998/06/20 13:19:00 mrg Exp $ */ d247 2 @ 1.10 log @Add new history grovelling function uvm_hist() that takes a bitmask of histories to merge in cronological order. currently, MAPHIST and PDHIST are defined as 1 and 2 respectively. passing a bitmask of 0 to uvm_hist() will dump all maps. @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.9 1998/03/10 14:36:55 chuck Exp $ */ a2 4 /* * XXXCDC: "ROUGH DRAFT" QUALITY UVM PRE-RELEASE FILE! * >>>USE AT YOUR OWN RISK, WORK IS NOT FINISHED<<< */ @ 1.10.4.1 log @initial snapshot. lots left to do. @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.10 1998/06/20 13:19:00 mrg Exp $ */ d249 2 a250 5 printf(" nswapdev=%d, nanon=%d, nanonneeded=%d nfreeanon=%d\n", uvmexp.nswapdev, uvmexp.nanon, uvmexp.nanonneeded, uvmexp.nfreeanon); printf(" swpages=%d, swpginuse=%d, swpguniq=%d paging=%d\n", uvmexp.swpages, uvmexp.swpginuse, uvmexp.swpguniq, uvmexp.paging); @ 1.10.4.2 log @print more stuff in uvm_dump(). @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.10.4.1 1998/11/09 06:06:39 chs Exp $ */ d243 2 a244 3 printf(" woke=%d, revs=%d, scans=%d, obscans=%d, anscans=%d\n", uvmexp.pdwoke, uvmexp.pdrevs, uvmexp.pdscans, uvmexp.pdobscan, uvmexp.pdanscan); d247 2 a248 2 printf(" swout=%d, pageouts=%d, pending=%d, nswget=%d\n", uvmexp.pdswout, uvmexp.pdpageouts, uvmexp.pdpending, uvmexp.nswget); @ 1.9 log @uvm_dump now dumps some important pointers for debugging @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.8 1998/02/13 05:34:30 thorpej Exp $ */ d74 2 a77 1 void uvmmap_dump __P((vm_map_t)); d80 1 d97 94 @ 1.8 log @Oops, fix a typo. @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.7 1998/02/13 05:33:55 thorpej Exp $ */ d155 4 @ 1.7 log @KNF. @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.6 1998/02/13 04:52:00 thorpej Exp $ */ @ 1.6 log @Add a global list of all UVM histories. @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.5 1998/02/12 20:10:15 thorpej Exp $ */ d4 1 a4 1 * XXXCDC: "ROUGH DRAFT" QUALITY UVM PRE-RELEASE FILE! d38 1 a38 1 * from: Id: uvm_stat.c,v 1.1.2.3 1997/12/19 15:01:00 mrg Exp d77 1 a77 1 void uvm_dump __P((void)); d83 3 d87 8 a94 11 struct uvm_history *l; { int lcv, s = splhigh(); lcv = l->f; do { if (l->e[lcv].fmt) uvmhist_print(&l->e[lcv]); lcv = (lcv + 1) % l->n; } while (lcv != l->f); splx(s); d96 1 a96 1 #endif d100 2 d103 6 a108 7 { struct uvm_cnt *uvc = uvm_cnt_head; while (uvc) { if ((uvc->t & UVMCNT_MASK) != UVMCNT_CNT) continue; printf("%s = %d\n", uvc->name, uvc->c); uvc = uvc->next; } d114 3 d118 37 a154 34 void uvm_dump() { printf("Current UVM status:\n"); printf(" pagesize=%d (0x%x), pagemask=0x%x, pageshift=%d\n", uvmexp.pagesize, uvmexp.pagesize, uvmexp.pagemask, uvmexp.pageshift); printf(" %d VM pages: %d active, %d inactive, %d wired, %d free\n", uvmexp.npages, uvmexp.active, uvmexp.inactive, uvmexp.wired, uvmexp.free); printf(" freemin=%d, free-target=%d, inactive-target=%d, wired-max=%d\n", uvmexp.freemin, uvmexp.freetarg, uvmexp.inactarg, uvmexp.wiredmax); printf(" faults=%d, traps=%d, intrs=%d, ctxswitch=%d\n", uvmexp.faults, uvmexp.traps, uvmexp.intrs, uvmexp.swtch); printf(" softint=%d, syscalls=%d, swapins=%d, swapouts=%d\n", uvmexp.softs, uvmexp.syscalls, uvmexp.swapins, uvmexp.swapouts); printf(" fault counts:\n"); printf(" noram=%d, noanon=%d, pgwait=%d, pgrele=%d\n", uvmexp.fltnoram, uvmexp.fltnoanon, uvmexp.fltpgwait, uvmexp.fltpgrele); printf(" ok relocks(total)=%d(%d), anget(retrys)=%d(%d), amapcopy=%d\n", uvmexp.fltrelckok, uvmexp.fltrelck, uvmexp.fltanget, uvmexp.fltanretry, uvmexp.fltamcopy); printf(" neighbor anon/obj pg=%d/%d, gets(lock/unlock)=%d/%d\n", uvmexp.fltnamap, uvmexp.fltnomap, uvmexp.fltlget, uvmexp.fltget); printf(" cases: anon=%d, anoncow=%d, obj=%d, prcopy=%d, przero=%d\n", uvmexp.flt_anon, uvmexp.flt_acow, uvmexp.flt_obj, uvmexp.flt_prcopy, uvmexp.flt_przero); printf(" daemon and swap counts:\n"); printf(" woke=%d, revs=%d, scans=%d, swout=%d\n", uvmexp.pdwoke, uvmexp.pdrevs, uvmexp.pdscans, uvmexp.pdswout); printf(" busy=%d, freed=%d, reactivate=%d, deactivate=%d\n", uvmexp.pdbusy, uvmexp.pdfreed, uvmexp.pdreact, uvmexp.pddeact); printf(" pageouts=%d, pending=%d, nswget=%d\n", uvmexp.pdpageouts, uvmexp.pdpending, uvmexp.nswget); printf(" nswapdev=%d, nanon=%d, nfreeanon=%d\n", uvmexp.nswapdev, uvmexp.nanon, uvmexp.nfreeanon); @ 1.5 log @Provide a patchable knob (uvmhist_print_enabled) so that UVM history buffer printing can be switched on and off at run-time. Only exists if the kernel is build with UVMHIST_PRINT, and defaults to `on'. @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.4 1998/02/10 14:12:29 mrg Exp $ */ a53 2 struct uvm_cnt *uvm_cnt_head = NULL; d58 6 d72 1 d74 1 @ 1.4 log @- add defopt's for UVM, UVMHIST and PMAP_NEW. - remove unnecessary UVMHIST_DECL's. @ text @d1 1 a1 1 /* $NetBSD: uvm_stat.c,v 1.3 1998/02/07 11:09:38 mrg Exp $ */ d55 8 @ 1.3 log @restore rcsids @ text @d1 1 a1 1 /* $NetBSD$ */ d40 2 @ 1.2 log @RCS ID police. @ text @d37 2 @ 1.1 log @Initial revision @ text @d1 1 a1 1 /* $Id: uvm_stat.c,v 1.1.2.3 1997/12/19 15:01:00 mrg Exp $ */ @ 1.1.1.1 log @initial import of the new virtual memory system, UVM, into -current. UVM was written by chuck cranor , with some minor portions derived from the old Mach code. i provided some help getting swap and paging working, and other bug fixes/ideas. chuck silvers also provided some other fixes. this is the UVM kernel code portion. this will be KNF'd shortly. :-) @ text @@