PERFORCE change 95258 for review

John Baldwin jhb at FreeBSD.org
Fri Apr 14 18:23:46 UTC 2006


http://perforce.freebsd.org/chv.cgi?CH=95258

Change 95258 by jhb at jhb_slimer on 2006/04/14 18:23:32

	IFC @95254.

Affected files ...

.. //depot/projects/smpng/sys/alpha/alpha/pmap.c#78 integrate
.. //depot/projects/smpng/sys/alpha/include/kdb.h#3 integrate
.. //depot/projects/smpng/sys/amd64/amd64/gdb_machdep.c#5 integrate
.. //depot/projects/smpng/sys/amd64/amd64/io_apic.c#16 integrate
.. //depot/projects/smpng/sys/amd64/amd64/pmap.c#54 integrate
.. //depot/projects/smpng/sys/amd64/conf/GENERIC#42 integrate
.. //depot/projects/smpng/sys/amd64/include/gdb_machdep.h#4 integrate
.. //depot/projects/smpng/sys/amd64/include/kdb.h#3 integrate
.. //depot/projects/smpng/sys/amd64/include/pmap.h#21 integrate
.. //depot/projects/smpng/sys/arm/arm/cpufunc.c#9 integrate
.. //depot/projects/smpng/sys/arm/arm/pmap.c#26 integrate
.. //depot/projects/smpng/sys/arm/arm/swtch.S#14 integrate
.. //depot/projects/smpng/sys/arm/arm/trap.c#17 integrate
.. //depot/projects/smpng/sys/arm/arm/undefined.c#13 integrate
.. //depot/projects/smpng/sys/arm/at91/at91.c#3 integrate
.. //depot/projects/smpng/sys/arm/at91/at91_twi.c#2 integrate
.. //depot/projects/smpng/sys/arm/at91/at91_usartreg.h#2 integrate
.. //depot/projects/smpng/sys/arm/at91/if_ate.c#3 integrate
.. //depot/projects/smpng/sys/arm/at91/uart_dev_at91usart.c#4 integrate
.. //depot/projects/smpng/sys/arm/include/asmacros.h#5 integrate
.. //depot/projects/smpng/sys/arm/include/atomic.h#24 integrate
.. //depot/projects/smpng/sys/arm/include/pmap.h#16 integrate
.. //depot/projects/smpng/sys/arm/sa11x0/uart_dev_sa1110.c#3 integrate
.. //depot/projects/smpng/sys/arm/xscale/i80321/i80321_pci.c#7 integrate
.. //depot/projects/smpng/sys/arm/xscale/i80321/i80321_timer.c#9 integrate
.. //depot/projects/smpng/sys/boot/arm/at91/boot0/Makefile#1 branch
.. //depot/projects/smpng/sys/boot/arm/at91/boot0/README#1 branch
.. //depot/projects/smpng/sys/boot/arm/at91/boot0/arm_init.s#1 branch
.. //depot/projects/smpng/sys/boot/arm/at91/boot0/at91rm9200_lowlevel.c#1 branch
.. //depot/projects/smpng/sys/boot/arm/at91/boot0/at91rm9200_lowlevel.h#1 branch
.. //depot/projects/smpng/sys/boot/arm/at91/boot0/lib.c#1 branch
.. //depot/projects/smpng/sys/boot/arm/at91/boot0/lib.h#1 branch
.. //depot/projects/smpng/sys/boot/arm/at91/boot0/linker.cfg#1 branch
.. //depot/projects/smpng/sys/boot/arm/at91/boot0/main.c#1 branch
.. //depot/projects/smpng/sys/boot/arm/at91/boot0/xmodem.c#1 branch
.. //depot/projects/smpng/sys/boot/arm/at91/boot0/xmodem.h#1 branch
.. //depot/projects/smpng/sys/boot/arm/at91/inc/AT91RM9200.h#1 branch
.. //depot/projects/smpng/sys/boot/forth/beastie.4th#10 integrate
.. //depot/projects/smpng/sys/boot/i386/boot2/boot1.S#6 integrate
.. //depot/projects/smpng/sys/boot/i386/cdboot/cdboot.s#5 integrate
.. //depot/projects/smpng/sys/boot/i386/libi386/Makefile#16 integrate
.. //depot/projects/smpng/sys/boot/i386/libi386/gatea20.c#3 delete
.. //depot/projects/smpng/sys/boot/i386/libi386/libi386.h#12 integrate
.. //depot/projects/smpng/sys/boot/i386/pxeldr/pxeldr.S#4 integrate
.. //depot/projects/smpng/sys/boot/pc98/libpc98/Makefile#14 integrate
.. //depot/projects/smpng/sys/boot/pc98/libpc98/gatea20.c#4 delete
.. //depot/projects/smpng/sys/compat/freebsd32/freebsd32_misc.c#35 integrate
.. //depot/projects/smpng/sys/compat/freebsd32/freebsd32_proto.h#29 integrate
.. //depot/projects/smpng/sys/compat/freebsd32/freebsd32_syscall.h#29 integrate
.. //depot/projects/smpng/sys/compat/freebsd32/freebsd32_syscalls.c#29 integrate
.. //depot/projects/smpng/sys/compat/freebsd32/freebsd32_sysent.c#29 integrate
.. //depot/projects/smpng/sys/compat/freebsd32/syscalls.master#29 integrate
.. //depot/projects/smpng/sys/compat/linux/linux_socket.c#29 integrate
.. //depot/projects/smpng/sys/compat/svr4/svr4_stream.c#27 integrate
.. //depot/projects/smpng/sys/conf/NOTES#116 integrate
.. //depot/projects/smpng/sys/conf/files#171 integrate
.. //depot/projects/smpng/sys/conf/files.powerpc#27 integrate
.. //depot/projects/smpng/sys/conf/options#117 integrate
.. //depot/projects/smpng/sys/conf/options.arm#7 integrate
.. //depot/projects/smpng/sys/crypto/via/padlock.c#2 integrate
.. //depot/projects/smpng/sys/dev/aac/aac.c#55 integrate
.. //depot/projects/smpng/sys/dev/acpi_support/acpi_asus.c#8 integrate
.. //depot/projects/smpng/sys/dev/acpica/Osd/OsdHardware.c#18 integrate
.. //depot/projects/smpng/sys/dev/acpica/Osd/OsdSchedule.c#28 integrate
.. //depot/projects/smpng/sys/dev/acpica/acpi.c#90 integrate
.. //depot/projects/smpng/sys/dev/amr/amr.c#40 integrate
.. //depot/projects/smpng/sys/dev/amr/amr_linux.c#3 integrate
.. //depot/projects/smpng/sys/dev/amr/amr_pci.c#26 integrate
.. //depot/projects/smpng/sys/dev/amr/amrvar.h#23 integrate
.. //depot/projects/smpng/sys/dev/ata/ata-all.c#82 integrate
.. //depot/projects/smpng/sys/dev/ata/ata-all.h#47 integrate
.. //depot/projects/smpng/sys/dev/ata/ata-disk.c#58 integrate
.. //depot/projects/smpng/sys/dev/ata/ata-queue.c#34 integrate
.. //depot/projects/smpng/sys/dev/ata/ata-usb.c#3 integrate
.. //depot/projects/smpng/sys/dev/ata/atapi-cam.c#27 integrate
.. //depot/projects/smpng/sys/dev/ata/atapi-cd.c#62 integrate
.. //depot/projects/smpng/sys/dev/ata/atapi-fd.c#34 integrate
.. //depot/projects/smpng/sys/dev/ath/if_ath.c#37 integrate
.. //depot/projects/smpng/sys/dev/bce/if_bce.c#1 branch
.. //depot/projects/smpng/sys/dev/bce/if_bcefw.h#1 branch
.. //depot/projects/smpng/sys/dev/bce/if_bcereg.h#1 branch
.. //depot/projects/smpng/sys/dev/bfe/if_bfe.c#22 integrate
.. //depot/projects/smpng/sys/dev/bge/if_bgereg.h#40 integrate
.. //depot/projects/smpng/sys/dev/drm/drm-preprocess.sh#2 integrate
.. //depot/projects/smpng/sys/dev/drm/drm.h#10 integrate
.. //depot/projects/smpng/sys/dev/drm/drm_agpsupport.c#5 integrate
.. //depot/projects/smpng/sys/dev/drm/drm_pciids.h#5 integrate
.. //depot/projects/smpng/sys/dev/drm/i915_dma.c#3 integrate
.. //depot/projects/smpng/sys/dev/drm/i915_drm.h#3 integrate
.. //depot/projects/smpng/sys/dev/drm/i915_drv.h#3 integrate
.. //depot/projects/smpng/sys/dev/drm/i915_irq.c#3 integrate
.. //depot/projects/smpng/sys/dev/drm/i915_mem.c#3 integrate
.. //depot/projects/smpng/sys/dev/drm/mga_drv.h#10 integrate
.. //depot/projects/smpng/sys/dev/drm/r300_cmdbuf.c#4 integrate
.. //depot/projects/smpng/sys/dev/drm/r300_reg.h#3 integrate
.. //depot/projects/smpng/sys/dev/drm/radeon_cp.c#15 integrate
.. //depot/projects/smpng/sys/dev/drm/radeon_drm.h#12 integrate
.. //depot/projects/smpng/sys/dev/drm/radeon_drv.h#14 integrate
.. //depot/projects/smpng/sys/dev/drm/radeon_state.c#15 integrate
.. //depot/projects/smpng/sys/dev/drm/savage_bci.c#3 integrate
.. //depot/projects/smpng/sys/dev/drm/savage_state.c#3 integrate
.. //depot/projects/smpng/sys/dev/drm/sis_ds.c#5 integrate
.. //depot/projects/smpng/sys/dev/drm/sis_ds.h#6 integrate
.. //depot/projects/smpng/sys/dev/drm/sis_mm.c#9 integrate
.. //depot/projects/smpng/sys/dev/em/LICENSE#4 integrate
.. //depot/projects/smpng/sys/dev/em/README#12 integrate
.. //depot/projects/smpng/sys/dev/em/if_em.c#67 integrate
.. //depot/projects/smpng/sys/dev/em/if_em_hw.c#17 integrate
.. //depot/projects/smpng/sys/dev/em/if_em_hw.h#18 integrate
.. //depot/projects/smpng/sys/dev/fxp/if_fxp.c#73 integrate
.. //depot/projects/smpng/sys/dev/hwpmc/hwpmc_mod.c#16 integrate
.. //depot/projects/smpng/sys/dev/hwpmc/hwpmc_x86.c#5 integrate
.. //depot/projects/smpng/sys/dev/iicbus/if_ic.c#15 integrate
.. //depot/projects/smpng/sys/dev/iicbus/iic.c#10 integrate
.. //depot/projects/smpng/sys/dev/iicbus/iicbb.c#5 integrate
.. //depot/projects/smpng/sys/dev/iicbus/iicsmb.c#5 integrate
.. //depot/projects/smpng/sys/dev/mfi/mfi.c#3 integrate
.. //depot/projects/smpng/sys/dev/mii/brgphy.c#30 integrate
.. //depot/projects/smpng/sys/dev/mii/miidevs#17 integrate
.. //depot/projects/smpng/sys/dev/mpt/mpt.c#14 integrate
.. //depot/projects/smpng/sys/dev/mpt/mpt.h#12 integrate
.. //depot/projects/smpng/sys/dev/mpt/mpt_cam.c#7 integrate
.. //depot/projects/smpng/sys/dev/mpt/mpt_debug.c#12 integrate
.. //depot/projects/smpng/sys/dev/mpt/mpt_pci.c#19 integrate
.. //depot/projects/smpng/sys/dev/mpt/mpt_raid.c#6 integrate
.. //depot/projects/smpng/sys/dev/pccbb/pccbb.c#57 integrate
.. //depot/projects/smpng/sys/dev/pccbb/pccbbreg.h#13 integrate
.. //depot/projects/smpng/sys/dev/puc/puc_ebus.c#8 integrate
.. //depot/projects/smpng/sys/dev/puc/puc_sbus.c#10 integrate
.. //depot/projects/smpng/sys/dev/safe/safe.c#8 integrate
.. //depot/projects/smpng/sys/dev/scc/scc_bfe.h#1 branch
.. //depot/projects/smpng/sys/dev/scc/scc_bfe_ebus.c#1 branch
.. //depot/projects/smpng/sys/dev/scc/scc_bfe_macio.c#1 branch
.. //depot/projects/smpng/sys/dev/scc/scc_bfe_sbus.c#1 branch
.. //depot/projects/smpng/sys/dev/scc/scc_bus.h#1 branch
.. //depot/projects/smpng/sys/dev/scc/scc_core.c#1 branch
.. //depot/projects/smpng/sys/dev/scc/scc_dev_sab82532.c#1 branch
.. //depot/projects/smpng/sys/dev/scc/scc_dev_z8530.c#1 branch
.. //depot/projects/smpng/sys/dev/scc/scc_if.m#1 branch
.. //depot/projects/smpng/sys/dev/sound/pci/ich.c#42 integrate
.. //depot/projects/smpng/sys/dev/sound/pcm/dsp.c#37 integrate
.. //depot/projects/smpng/sys/dev/sound/pcm/sound.c#31 integrate
.. //depot/projects/smpng/sys/dev/sound/pcm/vchan.c#16 integrate
.. //depot/projects/smpng/sys/dev/uart/uart_bus.h#9 integrate
.. //depot/projects/smpng/sys/dev/uart/uart_bus_ebus.c#11 integrate
.. //depot/projects/smpng/sys/dev/uart/uart_bus_scc.c#1 branch
.. //depot/projects/smpng/sys/dev/uart/uart_core.c#12 integrate
.. //depot/projects/smpng/sys/dev/uart/uart_cpu.h#7 integrate
.. //depot/projects/smpng/sys/dev/uart/uart_cpu_powerpc.c#1 branch
.. //depot/projects/smpng/sys/dev/uart/uart_dev_ns8250.c#11 integrate
.. //depot/projects/smpng/sys/dev/uart/uart_dev_sab82532.c#9 integrate
.. //depot/projects/smpng/sys/dev/uart/uart_dev_z8530.c#10 integrate
.. //depot/projects/smpng/sys/dev/uart/uart_tty.c#18 integrate
.. //depot/projects/smpng/sys/dev/ubsec/ubsec.c#19 integrate
.. //depot/projects/smpng/sys/dev/usb/usbdevs#88 integrate
.. //depot/projects/smpng/sys/dev/usb/uscanner.c#32 integrate
.. //depot/projects/smpng/sys/fs/devfs/devfs.h#18 integrate
.. //depot/projects/smpng/sys/fs/devfs/devfs_vnops.c#55 integrate
.. //depot/projects/smpng/sys/geom/eli/g_eli.c#9 integrate
.. //depot/projects/smpng/sys/geom/eli/g_eli.h#5 integrate
.. //depot/projects/smpng/sys/geom/geom.h#45 integrate
.. //depot/projects/smpng/sys/geom/geom_bsd.c#40 integrate
.. //depot/projects/smpng/sys/geom/geom_ccd.c#13 integrate
.. //depot/projects/smpng/sys/geom/geom_ctl.c#25 integrate
.. //depot/projects/smpng/sys/geom/geom_disk.c#47 integrate
.. //depot/projects/smpng/sys/geom/geom_gpt.c#23 integrate
.. //depot/projects/smpng/sys/geom/geom_slice.c#34 integrate
.. //depot/projects/smpng/sys/geom/geom_subr.c#48 integrate
.. //depot/projects/smpng/sys/geom/mirror/g_mirror.c#28 integrate
.. //depot/projects/smpng/sys/geom/mirror/g_mirror.h#13 integrate
.. //depot/projects/smpng/sys/geom/mirror/g_mirror_ctl.c#11 integrate
.. //depot/projects/smpng/sys/geom/raid3/g_raid3.c#26 integrate
.. //depot/projects/smpng/sys/geom/raid3/g_raid3.h#13 integrate
.. //depot/projects/smpng/sys/geom/raid3/g_raid3_ctl.c#12 integrate
.. //depot/projects/smpng/sys/geom/vinum/geom_vinum.c#16 integrate
.. //depot/projects/smpng/sys/geom/vinum/geom_vinum.h#10 integrate
.. //depot/projects/smpng/sys/geom/vinum/geom_vinum_rm.c#10 integrate
.. //depot/projects/smpng/sys/geom/vinum/geom_vinum_state.c#7 integrate
.. //depot/projects/smpng/sys/geom/vinum/geom_vinum_subr.c#12 integrate
.. //depot/projects/smpng/sys/gnu/fs/ext2fs/ext2_bitops.h#2 integrate
.. //depot/projects/smpng/sys/i386/conf/GENERIC#72 integrate
.. //depot/projects/smpng/sys/i386/i386/exception.s#26 integrate
.. //depot/projects/smpng/sys/i386/i386/io_apic.c#18 integrate
.. //depot/projects/smpng/sys/i386/i386/machdep.c#106 integrate
.. //depot/projects/smpng/sys/i386/i386/pmap.c#94 integrate
.. //depot/projects/smpng/sys/i386/include/kdb.h#3 integrate
.. //depot/projects/smpng/sys/i386/isa/npx.c#56 integrate
.. //depot/projects/smpng/sys/ia64/ia64/interrupt.c#35 integrate
.. //depot/projects/smpng/sys/ia64/ia64/pmap.c#76 integrate
.. //depot/projects/smpng/sys/ia64/include/kdb.h#3 integrate
.. //depot/projects/smpng/sys/kern/kern_descrip.c#91 integrate
.. //depot/projects/smpng/sys/kern/kern_event.c#44 integrate
.. //depot/projects/smpng/sys/kern/kern_exec.c#96 integrate
.. //depot/projects/smpng/sys/kern/kern_exit.c#116 integrate
.. //depot/projects/smpng/sys/kern/kern_intr.c#75 integrate
.. //depot/projects/smpng/sys/kern/kern_shutdown.c#63 integrate
.. //depot/projects/smpng/sys/kern/md5c.c#9 integrate
.. //depot/projects/smpng/sys/kern/serdev_if.m#1 branch
.. //depot/projects/smpng/sys/kern/subr_kdb.c#17 integrate
.. //depot/projects/smpng/sys/kern/subr_sleepqueue.c#25 integrate
.. //depot/projects/smpng/sys/kern/subr_taskqueue.c#30 integrate
.. //depot/projects/smpng/sys/kern/subr_turnstile.c#25 integrate
.. //depot/projects/smpng/sys/kern/subr_witness.c#152 integrate
.. //depot/projects/smpng/sys/kern/sysv_shm.c#33 integrate
.. //depot/projects/smpng/sys/kern/uipc_proto.c#6 integrate
.. //depot/projects/smpng/sys/kern/uipc_socket.c#82 integrate
.. //depot/projects/smpng/sys/kern/uipc_socket2.c#50 integrate
.. //depot/projects/smpng/sys/kern/uipc_syscalls.c#74 integrate
.. //depot/projects/smpng/sys/kern/uipc_usrreq.c#56 integrate
.. //depot/projects/smpng/sys/kern/vfs_bio.c#92 integrate
.. //depot/projects/smpng/sys/kern/vfs_default.c#46 integrate
.. //depot/projects/smpng/sys/kern/vfs_lookup.c#35 integrate
.. //depot/projects/smpng/sys/kern/vfs_mount.c#60 integrate
.. //depot/projects/smpng/sys/kern/vfs_subr.c#126 integrate
.. //depot/projects/smpng/sys/kern/vfs_syscalls.c#104 integrate
.. //depot/projects/smpng/sys/kern/vfs_vnops.c#71 integrate
.. //depot/projects/smpng/sys/modules/Makefile#120 integrate
.. //depot/projects/smpng/sys/modules/ath/Makefile#3 integrate
.. //depot/projects/smpng/sys/modules/bce/Makefile#1 branch
.. //depot/projects/smpng/sys/modules/scc/Makefile#1 branch
.. //depot/projects/smpng/sys/modules/uart/Makefile#9 integrate
.. //depot/projects/smpng/sys/net/if_arc.h#9 integrate
.. //depot/projects/smpng/sys/net/if_arcsubr.c#22 integrate
.. //depot/projects/smpng/sys/net/if_media.h#18 integrate
.. //depot/projects/smpng/sys/net/if_ppp.c#40 integrate
.. //depot/projects/smpng/sys/net/raw_cb.c#13 integrate
.. //depot/projects/smpng/sys/net/raw_usrreq.c#20 integrate
.. //depot/projects/smpng/sys/net/rtsock.c#53 integrate
.. //depot/projects/smpng/sys/netatalk/ddp_usrreq.c#25 integrate
.. //depot/projects/smpng/sys/netatm/atm_aal5.c#14 integrate
.. //depot/projects/smpng/sys/netatm/atm_proto.c#9 integrate
.. //depot/projects/smpng/sys/netatm/atm_socket.c#17 integrate
.. //depot/projects/smpng/sys/netatm/atm_usrreq.c#16 integrate
.. //depot/projects/smpng/sys/netatm/atm_var.h#16 integrate
.. //depot/projects/smpng/sys/netgraph/bluetooth/include/ng_btsocket_hci_raw.h#5 integrate
.. //depot/projects/smpng/sys/netgraph/bluetooth/include/ng_btsocket_l2cap.h#6 integrate
.. //depot/projects/smpng/sys/netgraph/bluetooth/include/ng_btsocket_rfcomm.h#6 integrate
.. //depot/projects/smpng/sys/netgraph/bluetooth/socket/ng_btsocket_hci_raw.c#17 integrate
.. //depot/projects/smpng/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap.c#16 integrate
.. //depot/projects/smpng/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap_raw.c#15 integrate
.. //depot/projects/smpng/sys/netgraph/bluetooth/socket/ng_btsocket_rfcomm.c#12 integrate
.. //depot/projects/smpng/sys/netgraph/ng_socket.c#36 integrate
.. //depot/projects/smpng/sys/netinet/in_pcb.c#60 integrate
.. //depot/projects/smpng/sys/netinet/in_pcb.h#40 integrate
.. //depot/projects/smpng/sys/netinet/ip_divert.c#46 integrate
.. //depot/projects/smpng/sys/netinet/raw_ip.c#55 integrate
.. //depot/projects/smpng/sys/netinet/tcp_input.c#84 integrate
.. //depot/projects/smpng/sys/netinet/tcp_sack.c#17 integrate
.. //depot/projects/smpng/sys/netinet/tcp_subr.c#77 integrate
.. //depot/projects/smpng/sys/netinet/tcp_timer.c#28 integrate
.. //depot/projects/smpng/sys/netinet/tcp_usrreq.c#47 integrate
.. //depot/projects/smpng/sys/netinet/tcp_var.h#42 integrate
.. //depot/projects/smpng/sys/netinet/udp_usrreq.c#65 integrate
.. //depot/projects/smpng/sys/netinet6/frag6.c#9 integrate
.. //depot/projects/smpng/sys/netinet6/in6_pcb.c#40 integrate
.. //depot/projects/smpng/sys/netinet6/in6_pcb.h#12 integrate
.. //depot/projects/smpng/sys/netinet6/ip6_mroute.c#25 integrate
.. //depot/projects/smpng/sys/netinet6/raw_ip6.c#38 integrate
.. //depot/projects/smpng/sys/netinet6/udp6_output.c#19 integrate
.. //depot/projects/smpng/sys/netinet6/udp6_usrreq.c#36 integrate
.. //depot/projects/smpng/sys/netipsec/ipsec.c#14 integrate
.. //depot/projects/smpng/sys/netipsec/ipsec.h#9 integrate
.. //depot/projects/smpng/sys/netipsec/keysock.c#12 integrate
.. //depot/projects/smpng/sys/netipsec/xform.h#3 integrate
.. //depot/projects/smpng/sys/netipsec/xform_ah.c#8 integrate
.. //depot/projects/smpng/sys/netipsec/xform_esp.c#9 integrate
.. //depot/projects/smpng/sys/netipsec/xform_ipip.c#11 integrate
.. //depot/projects/smpng/sys/netipx/ipx_usrreq.c#23 integrate
.. //depot/projects/smpng/sys/netipx/spx_usrreq.c#26 integrate
.. //depot/projects/smpng/sys/netkey/keysock.c#25 integrate
.. //depot/projects/smpng/sys/netnatm/natm.c#26 integrate
.. //depot/projects/smpng/sys/nfsclient/nfs_bio.c#45 integrate
.. //depot/projects/smpng/sys/nfsclient/nfs_vfsops.c#53 integrate
.. //depot/projects/smpng/sys/nfsclient/nfs_vnops.c#58 integrate
.. //depot/projects/smpng/sys/nfsclient/nfsnode.h#16 integrate
.. //depot/projects/smpng/sys/nfsserver/nfs_serv.c#46 integrate
.. //depot/projects/smpng/sys/nfsserver/nfs_srvsock.c#27 integrate
.. //depot/projects/smpng/sys/nfsserver/nfs_srvsubs.c#29 integrate
.. //depot/projects/smpng/sys/opencrypto/crypto.c#14 integrate
.. //depot/projects/smpng/sys/opencrypto/cryptosoft.c#10 integrate
.. //depot/projects/smpng/sys/posix4/ksched.c#15 integrate
.. //depot/projects/smpng/sys/posix4/p1003_1b.c#11 integrate
.. //depot/projects/smpng/sys/powerpc/conf/GENERIC#33 integrate
.. //depot/projects/smpng/sys/powerpc/include/bus.h#18 integrate
.. //depot/projects/smpng/sys/powerpc/powerpc/mmu_if.m#3 integrate
.. //depot/projects/smpng/sys/powerpc/powerpc/pmap_dispatch.c#3 integrate
.. //depot/projects/smpng/sys/security/mac/mac_vfs.c#11 integrate
.. //depot/projects/smpng/sys/sparc64/conf/GENERIC#65 integrate
.. //depot/projects/smpng/sys/sparc64/include/asi.h#9 integrate
.. //depot/projects/smpng/sys/sparc64/include/kdb.h#3 integrate
.. //depot/projects/smpng/sys/sparc64/sparc64/machdep.c#80 integrate
.. //depot/projects/smpng/sys/sparc64/sparc64/mp_machdep.c#28 integrate
.. //depot/projects/smpng/sys/sparc64/sparc64/pmap.c#63 integrate
.. //depot/projects/smpng/sys/sparc64/sparc64/trap.c#66 integrate
.. //depot/projects/smpng/sys/sys/ata.h#26 integrate
.. //depot/projects/smpng/sys/sys/buf.h#43 integrate
.. //depot/projects/smpng/sys/sys/filedesc.h#29 integrate
.. //depot/projects/smpng/sys/sys/gmon.h#5 integrate
.. //depot/projects/smpng/sys/sys/mac.h#35 integrate
.. //depot/projects/smpng/sys/sys/mac_policy.h#35 integrate
.. //depot/projects/smpng/sys/sys/mount.h#52 integrate
.. //depot/projects/smpng/sys/sys/protosw.h#17 integrate
.. //depot/projects/smpng/sys/sys/serial.h#3 integrate
.. //depot/projects/smpng/sys/sys/socketvar.h#50 integrate
.. //depot/projects/smpng/sys/sys/sx.h#18 integrate
.. //depot/projects/smpng/sys/sys/umtx.h#15 integrate
.. //depot/projects/smpng/sys/ufs/ffs/ffs_snapshot.c#58 integrate
.. //depot/projects/smpng/sys/ufs/ffs/ffs_softdep.c#54 integrate
.. //depot/projects/smpng/sys/ufs/ffs/ffs_vfsops.c#83 integrate
.. //depot/projects/smpng/sys/ufs/ufs/ufsmount.h#16 integrate
.. //depot/projects/smpng/sys/vm/pmap.h#29 integrate
.. //depot/projects/smpng/sys/vm/swap_pager.c#62 integrate
.. //depot/projects/smpng/sys/vm/swap_pager.h#15 integrate

Differences ...

==== //depot/projects/smpng/sys/alpha/alpha/pmap.c#78 (text+ko) ====

@@ -148,7 +148,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/alpha/alpha/pmap.c,v 1.187 2005/12/02 18:02:54 alc Exp $");
+__FBSDID("$FreeBSD: src/sys/alpha/alpha/pmap.c,v 1.189 2006/04/12 04:22:50 alc Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -700,21 +700,6 @@
  * Low level helper routines.....
  ***************************************************/
 
-
-
-/*
- * this routine defines the region(s) of memory that should
- * not be tested for the modified bit.
- */
-static PMAP_INLINE int
-pmap_track_modified(vm_offset_t va)
-{
-	if ((va < kmi.clean_sva) || (va >= kmi.clean_eva)) 
-		return 1;
-	else
-		return 0;
-}
-
 /*
  *	Routine:	pmap_extract
  *	Function:
@@ -1350,10 +1335,8 @@
 			    ("get_pv_entry: wired pte %#lx", tpte));
 			if ((tpte & PG_FOR) == 0)
 				vm_page_flag_set(m, PG_REFERENCED);
-			if ((tpte & PG_FOW) == 0) {
-				if (pmap_track_modified(va))
-					vm_page_dirty(m);
-			}
+			if ((tpte & PG_FOW) == 0)
+				vm_page_dirty(m);
 			pmap_invalidate_page(pmap, va);
 			TAILQ_REMOVE(&pmap->pm_pvlist, pv, pv_plist);
 			TAILQ_REMOVE(&m->md.pv_list, pv, pv_list);
@@ -1453,10 +1436,8 @@
 	pmap->pm_stats.resident_count -= 1;
 	if (oldpte & PG_MANAGED) {
 		m = PHYS_TO_VM_PAGE(pmap_pte_pa(&oldpte));
-		if ((oldpte & PG_FOW) == 0) {
-			if (pmap_track_modified(va))
-				vm_page_dirty(m);
-		}
+		if ((oldpte & PG_FOW) == 0)
+			vm_page_dirty(m);
 		if ((oldpte & PG_FOR) == 0)
 			vm_page_flag_set(m, PG_REFERENCED);
 		return pmap_remove_entry(pmap, m, va);
@@ -1585,10 +1566,8 @@
 		/*
 		 * Update the vm_page_t clean and reference bits.
 		 */
-		if ((tpte & PG_FOW) == 0) {
-			if (pmap_track_modified(pv->pv_va))
-				vm_page_dirty(m);
-		}
+		if ((tpte & PG_FOW) == 0)
+			vm_page_dirty(m);
 		if ((tpte & PG_FOR) == 0)
 			vm_page_flag_set(m, PG_REFERENCED);
 
@@ -1670,8 +1649,7 @@
 			if ((oldpte & PG_FOW) == 0) {
 				if (m == NULL)
 					m = PHYS_TO_VM_PAGE(pmap_pte_pa(pte));
-				if (pmap_track_modified(sva))
-					vm_page_dirty(m);
+				vm_page_dirty(m);
 				oldpte |= PG_FOW;
 			}
 			oldpte = (oldpte & ~PG_PROT) | newprot;
@@ -1767,8 +1745,7 @@
 		 * so we go ahead and sense modify status.
 		 */
 		if (origpte & PG_MANAGED) {
-			if ((origpte & PG_FOW) != PG_FOW
-			    && pmap_track_modified(va))
+			if ((origpte & PG_FOW) != PG_FOW)
 				vm_page_dirty(m);
 		}
 
@@ -1792,6 +1769,8 @@
 	 * called at interrupt time.
 	 */
 	if ((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0) {
+		KASSERT(va < kmi.clean_sva || va >= kmi.clean_eva,
+		    ("pmap_enter: managed mapping within the clean submap"));
 		pmap_insert_entry(pmap, va, mpte, m);
 		managed |= PG_MANAGED;
 	}
@@ -1854,6 +1833,9 @@
 	register pt_entry_t *pte;
 	int managed;
 
+	KASSERT(va < kmi.clean_sva || va >= kmi.clean_eva ||
+	    (m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) != 0,
+	    ("pmap_enter_quick: managed mapping within the clean submap"));
 	mtx_assert(&vm_page_queue_mtx, MA_OWNED);
 	VM_OBJECT_LOCK_ASSERT(m->object, MA_OWNED);
 	PMAP_LOCK(pmap);
@@ -2129,9 +2111,7 @@
  * in the case of running down an entire address space.
  */
 void
-pmap_remove_pages(pmap, sva, eva)
-	pmap_t pmap;
-	vm_offset_t sva, eva;
+pmap_remove_pages(pmap_t pmap)
 {
 	pt_entry_t *pte, tpte;
 	vm_page_t m;
@@ -2150,11 +2130,6 @@
 		pv;
 		pv = npv) {
 
-		if (pv->pv_va >= eva || pv->pv_va < sva) {
-			npv = TAILQ_NEXT(pv, pv_plist);
-			continue;
-		}
-
 #ifdef PMAP_REMOVE_PAGES_CURPROC_ONLY
 		pte = vtopte(pv->pv_va);
 #else
@@ -2179,8 +2154,7 @@
 		pmap->pm_stats.resident_count--;
 
 		if ((tpte & PG_FOW) == 0)
-			if (pmap_track_modified(pv->pv_va))
-				vm_page_dirty(m);
+			vm_page_dirty(m);
 
 		npv = TAILQ_NEXT(pv, pv_plist);
 		TAILQ_REMOVE(&pmap->pm_pvlist, pv, pv_plist);
@@ -2220,14 +2194,6 @@
 	 * setting RO do we need to clear the VAC?
 	 */
 	TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
-		/*
-		 * don't write protect pager mappings
-		 */
-		if (!setem && bit == (PG_UWE|PG_KWE)) {
-			if (!pmap_track_modified(pv->pv_va))
-				continue;
-		}
-
 		PMAP_LOCK(pv->pv_pmap);
 		pte = pmap_lev3pte(pv->pv_pmap, pv->pv_va);
 

==== //depot/projects/smpng/sys/alpha/include/kdb.h#3 (text+ko) ====

@@ -23,7 +23,7 @@
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/alpha/include/kdb.h,v 1.2 2005/01/05 20:05:50 imp Exp $
+ * $FreeBSD: src/sys/alpha/include/kdb.h,v 1.3 2006/04/03 22:51:46 marcel Exp $
  */
 
 #ifndef _MACHINE_KDB_H_
@@ -31,6 +31,8 @@
 
 #include <machine/frame.h>
 
+#define	KDB_STOPPEDPCB(pc)	&stoppcbs[pc->pc_cpuid]
+
 static __inline void
 kdb_cpu_clear_singlestep(void)
 {

==== //depot/projects/smpng/sys/amd64/amd64/gdb_machdep.c#5 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/amd64/amd64/gdb_machdep.c,v 1.5 2005/09/27 21:10:10 peter Exp $");
+__FBSDID("$FreeBSD: src/sys/amd64/amd64/gdb_machdep.c,v 1.6 2006/04/04 03:00:20 marcel Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -91,3 +91,27 @@
 			kdb_frame->tf_rip = *(register_t *)val;
 	}
 }
+
+int
+gdb_cpu_signal(int type, int code)
+{
+
+	switch (type & ~T_USER) {
+	case 0: return (SIGFPE);	/* Divide by zero. */
+	case 1: return (SIGTRAP);	/* Debug exception. */
+	case 3: return (SIGTRAP);	/* Breakpoint. */
+	case 4: return (SIGSEGV);	/* into instr. (overflow). */
+	case 5: return (SIGURG);	/* bound instruction. */
+	case 6: return (SIGILL);	/* Invalid opcode. */
+	case 7: return (SIGFPE);	/* Coprocessor not present. */
+	case 8: return (SIGEMT);	/* Double fault. */
+	case 9: return (SIGSEGV);	/* Coprocessor segment overrun. */
+	case 10: return (SIGTRAP);	/* Invalid TSS (also single-step). */
+	case 11: return (SIGSEGV);	/* Segment not present. */
+	case 12: return (SIGSEGV);	/* Stack exception. */
+	case 13: return (SIGSEGV);	/* General protection. */
+	case 14: return (SIGSEGV);	/* Page fault. */
+	case 16: return (SIGEMT);	/* Coprocessor error. */
+	}
+	return (SIGEMT);
+}

==== //depot/projects/smpng/sys/amd64/amd64/io_apic.c#16 (text+ko) ====

@@ -28,7 +28,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/amd64/amd64/io_apic.c,v 1.23 2006/03/20 19:39:07 jhb Exp $");
+__FBSDID("$FreeBSD: src/sys/amd64/amd64/io_apic.c,v 1.24 2006/04/05 20:43:19 jhb Exp $");
 
 #include "opt_atpic.h"
 #include "opt_isa.h"
@@ -89,6 +89,7 @@
 	u_int io_edgetrigger:1;
 	u_int io_masked:1;
 	int io_bus:4;
+	uint32_t io_lowreg;
 };
 
 struct ioapic {
@@ -207,9 +208,7 @@
 
 	mtx_lock_spin(&icu_lock);
 	if (intpin->io_masked) {
-		flags = ioapic_read(io->io_addr,
-		    IOAPIC_REDTBL_LO(intpin->io_intpin));
-		flags &= ~(IOART_INTMASK);
+		flags = intpin->io_lowreg & ~IOART_INTMASK;
 		ioapic_write(io->io_addr, IOAPIC_REDTBL_LO(intpin->io_intpin),
 		    flags);
 		intpin->io_masked = 0;
@@ -226,9 +225,7 @@
 
 	mtx_lock_spin(&icu_lock);
 	if (!intpin->io_masked && !intpin->io_edgetrigger) {
-		flags = ioapic_read(io->io_addr,
-		    IOAPIC_REDTBL_LO(intpin->io_intpin));
-		flags |= IOART_INTMSET;
+		flags = intpin->io_lowreg | IOART_INTMSET;
 		ioapic_write(io->io_addr, IOAPIC_REDTBL_LO(intpin->io_intpin),
 		    flags);
 		intpin->io_masked = 1;
@@ -313,6 +310,7 @@
 
 	/* Write the values to the APIC. */
 	mtx_lock_spin(&icu_lock);
+	intpin->io_lowreg = low;
 	ioapic_write(io->io_addr, IOAPIC_REDTBL_LO(intpin->io_intpin), low);
 	value = ioapic_read(io->io_addr, IOAPIC_REDTBL_HI(intpin->io_intpin));
 	value &= ~IOART_DEST;

==== //depot/projects/smpng/sys/amd64/amd64/pmap.c#54 (text+ko) ====

@@ -77,7 +77,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/amd64/amd64/pmap.c,v 1.539 2006/03/21 18:07:41 alc Exp $");
+__FBSDID("$FreeBSD: src/sys/amd64/amd64/pmap.c,v 1.545 2006/04/13 03:31:48 alc Exp $");
 
 /*
  *	Manages physical address maps.
@@ -106,6 +106,7 @@
  */
 
 #include "opt_msgbuf.h"
+#include "opt_pmap.h"
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -158,6 +159,13 @@
 #define PMAP_INLINE
 #endif
 
+#define PV_STATS
+#ifdef PV_STATS
+#define PV_STAT(x)	do { x ; } while (0)
+#else
+#define PV_STAT(x)	do { } while (0)
+#endif
+
 struct pmap kernel_pmap_store;
 
 vm_paddr_t avail_start;		/* PA of first available physical page */
@@ -182,7 +190,6 @@
 /*
  * Data for the pv entry allocation mechanism
  */
-static uma_zone_t pvzone;
 static int pv_entry_count = 0, pv_entry_max = 0, pv_entry_high_water = 0;
 static int shpgperproc = PMAP_SHPGPERPROC;
 
@@ -198,8 +205,8 @@
  */
 static caddr_t crashdumpmap;
 
-static PMAP_INLINE void	free_pv_entry(pv_entry_t pv);
-static pv_entry_t get_pv_entry(pmap_t locked_pmap);
+static void	free_pv_entry(pmap_t pmap, pv_entry_t pv);
+static pv_entry_t get_pv_entry(pmap_t locked_pmap, int try);
 static void	pmap_clear_ptes(vm_page_t m, long bit);
 
 static int pmap_remove_pte(pmap_t pmap, pt_entry_t *ptq,
@@ -208,6 +215,8 @@
 static void pmap_remove_entry(struct pmap *pmap, vm_page_t m,
 		vm_offset_t va);
 static void pmap_insert_entry(pmap_t pmap, vm_offset_t va, vm_page_t m);
+static boolean_t pmap_try_insert_pv_entry(pmap_t pmap, vm_offset_t va,
+    vm_page_t m);
 
 static vm_page_t pmap_allocpde(pmap_t pmap, vm_offset_t va, int flags);
 static vm_page_t pmap_allocpte(pmap_t pmap, vm_offset_t va, int flags);
@@ -509,7 +518,7 @@
 	PMAP_LOCK_INIT(kernel_pmap);
 	kernel_pmap->pm_pml4 = (pdp_entry_t *) (KERNBASE + KPML4phys);
 	kernel_pmap->pm_active = -1;	/* don't allow deactivation */
-	TAILQ_INIT(&kernel_pmap->pm_pvlist);
+	TAILQ_INIT(&kernel_pmap->pm_pvchunk);
 	nkpt = NKPT;
 
 	/*
@@ -569,8 +578,6 @@
 	 * high water mark so that the system can recover from excessive
 	 * numbers of pv entries.
 	 */
-	pvzone = uma_zcreate("PV ENTRY", sizeof(struct pv_entry), NULL, NULL, 
-	    NULL, NULL, UMA_ALIGN_PTR, UMA_ZONE_VM);
 	TUNABLE_INT_FETCH("vm.pmap.shpgperproc", &shpgperproc);
 	pv_entry_max = shpgperproc * maxproc + cnt.v_page_count;
 	TUNABLE_INT_FETCH("vm.pmap.pv_entries", &pv_entry_max);
@@ -613,20 +620,6 @@
  * Low level helper routines.....
  ***************************************************/
 
-
-/*
- * this routine defines the region(s) of memory that should
- * not be tested for the modified bit.
- */
-static PMAP_INLINE int
-pmap_track_modified(vm_offset_t va)
-{
-	if ((va < kmi.clean_sva) || (va >= kmi.clean_eva)) 
-		return 1;
-	else
-		return 0;
-}
-
 #ifdef SMP
 /*
  * For SMP, these functions have to use the IPI mechanism for coherence.
@@ -1063,7 +1056,7 @@
 	PMAP_LOCK_INIT(pmap);
 	pmap->pm_pml4 = (pml4_entry_t *)(KERNBASE + KPML4phys);
 	pmap->pm_active = 0;
-	TAILQ_INIT(&pmap->pm_pvlist);
+	TAILQ_INIT(&pmap->pm_pvchunk);
 	bzero(&pmap->pm_stats, sizeof pmap->pm_stats);
 }
 
@@ -1100,7 +1093,7 @@
 	pmap->pm_pml4[PML4PML4I] = VM_PAGE_TO_PHYS(pml4pg) | PG_V | PG_RW | PG_A | PG_M;
 
 	pmap->pm_active = 0;
-	TAILQ_INIT(&pmap->pm_pvlist);
+	TAILQ_INIT(&pmap->pm_pvchunk);
 	bzero(&pmap->pm_stats, sizeof pmap->pm_stats);
 }
 
@@ -1437,61 +1430,79 @@
  * page management routines.
  ***************************************************/
 
-/*
- * free the pv_entry back to the free list
- */
-static PMAP_INLINE void
-free_pv_entry(pv_entry_t pv)
+CTASSERT(sizeof(struct pv_chunk) == PAGE_SIZE);
+CTASSERT(_NPCM == 3);
+CTASSERT(_NPCPV == 168);
+
+static __inline struct pv_chunk *
+pv_to_chunk(pv_entry_t pv)
 {
-	pv_entry_count--;
-	uma_zfree(pvzone, pv);
+
+	return (struct pv_chunk *)((uintptr_t)pv & ~(uintptr_t)PAGE_MASK);
 }
 
+#define PV_PMAP(pv) (pv_to_chunk(pv)->pc_pmap)
+
+#define	PC_FREE0	0xfffffffffffffffful
+#define	PC_FREE1	0xfffffffffffffffful
+#define	PC_FREE2	0x000000fffffffffful
+
+static uint64_t pc_freemask[3] = { PC_FREE0, PC_FREE1, PC_FREE2 };
+
+#ifdef PV_STATS
+static int pc_chunk_count, pc_chunk_allocs, pc_chunk_frees, pc_chunk_tryfail;
+
+SYSCTL_INT(_vm_pmap, OID_AUTO, pc_chunk_count, CTLFLAG_RD, &pc_chunk_count, 0,
+	"Current number of pv entry chunks");
+SYSCTL_INT(_vm_pmap, OID_AUTO, pc_chunk_allocs, CTLFLAG_RD, &pc_chunk_allocs, 0,
+	"Current number of pv entry chunks allocated");
+SYSCTL_INT(_vm_pmap, OID_AUTO, pc_chunk_frees, CTLFLAG_RD, &pc_chunk_frees, 0,
+	"Current number of pv entry chunks frees");
+SYSCTL_INT(_vm_pmap, OID_AUTO, pc_chunk_tryfail, CTLFLAG_RD, &pc_chunk_tryfail, 0,
+	"Number of times tried to get a chunk page but failed.");
+
+static long pv_entry_frees, pv_entry_allocs;
+static int pv_entry_spare;
+
+SYSCTL_INT(_vm_pmap, OID_AUTO, pv_entry_count, CTLFLAG_RD, &pv_entry_count, 0,
+	"Current number of pv entries");
+SYSCTL_LONG(_vm_pmap, OID_AUTO, pv_entry_frees, CTLFLAG_RD, &pv_entry_frees, 0,
+	"Current number of pv entry frees");
+SYSCTL_LONG(_vm_pmap, OID_AUTO, pv_entry_allocs, CTLFLAG_RD, &pv_entry_allocs, 0,
+	"Current number of pv entry allocs");
+SYSCTL_INT(_vm_pmap, OID_AUTO, pv_entry_spare, CTLFLAG_RD, &pv_entry_spare, 0,
+	"Current number of spare pv entries");
+
+static int pmap_collect_inactive, pmap_collect_active;
+
+SYSCTL_INT(_vm_pmap, OID_AUTO, pmap_collect_inactive, CTLFLAG_RD, &pmap_collect_inactive, 0,
+	"Current number times pmap_collect called on inactive queue");
+SYSCTL_INT(_vm_pmap, OID_AUTO, pmap_collect_active, CTLFLAG_RD, &pmap_collect_active, 0,
+	"Current number times pmap_collect called on active queue");
+#endif
+
 /*
- * get a new pv_entry, allocating a block from the system
- * when needed.
+ * We are in a serious low memory condition.  Resort to
+ * drastic measures to free some pages so we can allocate
+ * another pv entry chunk.  This is normally called to
+ * unmap inactive pages, and if necessary, active pages.
  */
-static pv_entry_t
-get_pv_entry(pmap_t locked_pmap)
+static void
+pmap_collect(pmap_t locked_pmap, struct vpgqueues *vpq)
 {
-	static const struct timeval printinterval = { 60, 0 };
-	static struct timeval lastprint;
-	struct vpgqueues *vpq;
 	pd_entry_t ptepde;
 	pmap_t pmap;
 	pt_entry_t *pte, tpte;
-	pv_entry_t allocated_pv, next_pv, pv;
+	pv_entry_t next_pv, pv;
 	vm_offset_t va;
 	vm_page_t m;
 
-	PMAP_LOCK_ASSERT(locked_pmap, MA_OWNED);
-	mtx_assert(&vm_page_queue_mtx, MA_OWNED);
-	allocated_pv = uma_zalloc(pvzone, M_NOWAIT);
-	if (allocated_pv != NULL) {
-		pv_entry_count++;
-		if (pv_entry_count > pv_entry_high_water)
-			pagedaemon_wakeup();
-		else
-			return (allocated_pv);
-	}
-
-	/*
-	 * Reclaim pv entries: At first, destroy mappings to inactive
-	 * pages.  After that, if a pv entry is still needed, destroy
-	 * mappings to active pages.
-	 */
-	if (ratecheck(&lastprint, &printinterval))
-		printf("Approaching the limit on PV entries, consider "
-		    "increasing sysctl vm.pmap.shpgperproc or "
-		    "vm.pmap.pv_entry_max\n");
-	vpq = &vm_page_queues[PQ_INACTIVE];
-retry:
 	TAILQ_FOREACH(m, &vpq->pl, pageq) {
 		if (m->hold_count || m->busy || (m->flags & PG_BUSY))
 			continue;
 		TAILQ_FOREACH_SAFE(pv, &m->md.pv_list, pv_list, next_pv) {
 			va = pv->pv_va;
-			pmap = pv->pv_pmap;
+			pmap = PV_PMAP(pv);
 			/* Avoid deadlock and lock recursion. */
 			if (pmap > locked_pmap)
 				PMAP_LOCK(pmap);
@@ -1501,18 +1512,16 @@
 			pte = pmap_pte_pde(pmap, va, &ptepde);
 			tpte = pte_load_clear(pte);
 			KASSERT((tpte & PG_W) == 0,
-			    ("get_pv_entry: wired pte %#lx", tpte));
+			    ("pmap_collect: wired pte %#lx", tpte));
 			if (tpte & PG_A)
 				vm_page_flag_set(m, PG_REFERENCED);
 			if (tpte & PG_M) {
 				KASSERT((tpte & PG_RW),
-	("get_pv_entry: modified page not writable: va: %#lx, pte: %#lx",
+	("pmap_collect: modified page not writable: va: %#lx, pte: %#lx",
 				    va, tpte));
-				if (pmap_track_modified(va))
-					vm_page_dirty(m);
+				vm_page_dirty(m);
 			}
 			pmap_invalidate_page(pmap, va);
-			TAILQ_REMOVE(&pmap->pm_pvlist, pv, pv_plist);
 			TAILQ_REMOVE(&m->md.pv_list, pv, pv_list);
 			if (TAILQ_EMPTY(&m->md.pv_list))
 				vm_page_flag_clear(m, PG_WRITEABLE);
@@ -1520,20 +1529,130 @@
 			pmap_unuse_pt(pmap, va, ptepde);
 			if (pmap != locked_pmap)
 				PMAP_UNLOCK(pmap);
-			if (allocated_pv == NULL)
-				allocated_pv = pv;
-			else
-				free_pv_entry(pv);
+			free_pv_entry(locked_pmap, pv);
+		}
+	}
+}
+
+
+/*
+ * free the pv_entry back to the free list
+ */
+static void
+free_pv_entry(pmap_t pmap, pv_entry_t pv)
+{
+	vm_page_t m;
+	struct pv_chunk *pc;
+	int idx, field, bit;
+
+	PV_STAT(pv_entry_frees++);
+	PV_STAT(pv_entry_spare++);
+	PV_STAT(pv_entry_count--);
+	pc = pv_to_chunk(pv);
+	idx = pv - &pc->pc_pventry[0];
+	field = idx / 64;
+	bit = idx % 64;
+	pc->pc_map[field] |= 1ul << bit;
+	/* move to head of list */
+	TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
+	TAILQ_INSERT_HEAD(&pmap->pm_pvchunk, pc, pc_list);
+	if (pc->pc_map[0] != PC_FREE0 || pc->pc_map[1] != PC_FREE1 ||
+	    pc->pc_map[2] != PC_FREE2)
+		return;
+	PV_STAT(pv_entry_spare -= _NPCPV);
+	PV_STAT(pc_chunk_count--);
+	PV_STAT(pc_chunk_frees++);
+	/* entire chunk is free, return it */
+	TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
+	m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)pc));
+	vm_page_lock_queues();
+	vm_page_free(m);
+	vm_page_unlock_queues();
+}
+
+/*
+ * get a new pv_entry, allocating a block from the system
+ * when needed.
+ */
+static pv_entry_t
+get_pv_entry(pmap_t pmap, int try)
+{
+	static const struct timeval printinterval = { 60, 0 };
+	static struct timeval lastprint;
+	static vm_pindex_t colour;
+	int bit, field;
+	pv_entry_t pv;
+	struct pv_chunk *pc;
+	vm_page_t m;
+
+	PMAP_LOCK_ASSERT(pmap, MA_OWNED);
+	mtx_assert(&vm_page_queue_mtx, MA_OWNED);
+	PV_STAT(pv_entry_allocs++);
+	PV_STAT(pv_entry_count++);
+	if (pv_entry_count > pv_entry_high_water)
+		pagedaemon_wakeup();
+	pc = TAILQ_FIRST(&pmap->pm_pvchunk);
+	if (pc != NULL) {
+		for (field = 0; field < _NPCM; field++) {
+			if (pc->pc_map[field]) {
+				bit = bsfq(pc->pc_map[field]);
+				break;
+			}
+		}
+		if (field < _NPCM) {
+			pv = &pc->pc_pventry[field * 64 + bit];
+			pc->pc_map[field] &= ~(1ul << bit);
+			/* If this was the last item, move it to tail */
+			if (pc->pc_map[0] == 0 && pc->pc_map[1] == 0 &&
+			    pc->pc_map[2] == 0) {
+				TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
+				TAILQ_INSERT_TAIL(&pmap->pm_pvchunk, pc, pc_list);
+			}
+			PV_STAT(pv_entry_spare--);
+			return (pv);
 		}
 	}
-	if (allocated_pv == NULL) {
-		if (vpq == &vm_page_queues[PQ_INACTIVE]) {
-			vpq = &vm_page_queues[PQ_ACTIVE];
-			goto retry;
+	/* No free items, allocate another chunk */
+	m = vm_page_alloc(NULL, colour, VM_ALLOC_SYSTEM | VM_ALLOC_NOOBJ);
+	if (m == NULL) {
+		if (try) {
+			PV_STAT(pc_chunk_tryfail++);
+			return (NULL);
+		}
+		/*
+		 * Reclaim pv entries: At first, destroy mappings to inactive
+		 * pages.  After that, if a pv chunk entry is still needed,
+		 * destroy mappings to active pages.
+		 */
+		if (ratecheck(&lastprint, &printinterval))
+			printf("Approaching the limit on PV entries, consider "
+			    "increasing sysctl vm.pmap.shpgperproc or "
+			    "vm.pmap.pv_entry_max\n");
+		PV_STAT(pmap_collect_inactive++);
+		pmap_collect(pmap, &vm_page_queues[PQ_INACTIVE]);
+		m = vm_page_alloc(NULL, colour,
+		    VM_ALLOC_SYSTEM | VM_ALLOC_NOOBJ);
+		if (m == NULL) {
+			PV_STAT(pmap_collect_active++);
+			pmap_collect(pmap, &vm_page_queues[PQ_ACTIVE]);
+			m = vm_page_alloc(NULL, colour,
+			    VM_ALLOC_SYSTEM | VM_ALLOC_NOOBJ);
+			if (m == NULL)
+				panic("get_pv_entry: increase vm.pmap.shpgperproc");
 		}
-		panic("get_pv_entry: increase the vm.pmap.shpgperproc tunable");
 	}
-	return (allocated_pv);
+	PV_STAT(pc_chunk_count++);
+	PV_STAT(pc_chunk_allocs++);
+	colour++;
+	pc = (void *)PHYS_TO_DMAP(m->phys_addr);
+	pc->pc_pmap = pmap;
+	pc->pc_map[0] = PC_FREE0 & ~1ul;	/* preallocated bit 0 */
+	pc->pc_map[1] = PC_FREE1;
+	pc->pc_map[2] = PC_FREE2;
+	pv = &pc->pc_pventry[0];
+	TAILQ_INSERT_HEAD(&pmap->pm_pvchunk, pc, pc_list);
+	PV_STAT(pv_entry_spare += _NPCPV - 1);
+	return (pv);
 }
 
 static void
@@ -1543,24 +1662,16 @@
 
 	PMAP_LOCK_ASSERT(pmap, MA_OWNED);
 	mtx_assert(&vm_page_queue_mtx, MA_OWNED);
-	if (m->md.pv_list_count < pmap->pm_stats.resident_count) {
-		TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
-			if (pmap == pv->pv_pmap && va == pv->pv_va) 
-				break;

>>> TRUNCATED FOR MAIL (1000 lines) <<<


More information about the p4-projects mailing list