PERFORCE change 56927 for review

Robert Watson rwatson at FreeBSD.org
Fri Jul 9 14:07:19 PDT 2004


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

Change 56927 by rwatson at rwatson_tislabs on 2004/07/09 21:06:46

	Integrate netperf_socket from FreeBSD CVS HEAD.  Netperf related
	changes:
	
	  Drop locks around m_copym() in soreceive().
	  Remove spl's from do_sendfile().
	  Add socket locking around connect in nfs_connect().
	  In BPF, make callout non-MPSAFE unless debug_mpsafenet.
	  In bridge, make callout non-MPSAFE unless debug_mpsafenet.
	  Better support for disconnection in NFS client.
	  if_xl and other interface locking efficiency improvement.

Affected files ...

.. //depot/projects/netperf_socket/sys/alpha/alpha/autoconf.c#2 integrate
.. //depot/projects/netperf_socket/sys/alpha/alpha/pmap.c#10 integrate
.. //depot/projects/netperf_socket/sys/alpha/include/pmap.h#7 integrate
.. //depot/projects/netperf_socket/sys/amd64/amd64/autoconf.c#3 integrate
.. //depot/projects/netperf_socket/sys/amd64/amd64/busdma_machdep.c#3 integrate
.. //depot/projects/netperf_socket/sys/amd64/amd64/io_apic.c#4 integrate
.. //depot/projects/netperf_socket/sys/amd64/amd64/machdep.c#8 integrate
.. //depot/projects/netperf_socket/sys/amd64/amd64/mptable.c#4 integrate
.. //depot/projects/netperf_socket/sys/amd64/amd64/nexus.c#5 integrate
.. //depot/projects/netperf_socket/sys/amd64/amd64/pmap.c#18 integrate
.. //depot/projects/netperf_socket/sys/amd64/include/apicvar.h#3 integrate
.. //depot/projects/netperf_socket/sys/amd64/include/float.h#4 integrate
.. //depot/projects/netperf_socket/sys/arm/arm/pmap.c#3 integrate
.. //depot/projects/netperf_socket/sys/arm/arm/vm_machdep.c#3 integrate
.. //depot/projects/netperf_socket/sys/boot/common/dev_net.c#2 integrate
.. //depot/projects/netperf_socket/sys/boot/common/loader.8#6 integrate
.. //depot/projects/netperf_socket/sys/boot/common/ufsread.c#2 integrate
.. //depot/projects/netperf_socket/sys/boot/forth/loader.conf#8 integrate
.. //depot/projects/netperf_socket/sys/boot/ofw/libofw/elf_freebsd.c#2 integrate
.. //depot/projects/netperf_socket/sys/boot/ofw/libofw/ofw_copy.c#2 integrate
.. //depot/projects/netperf_socket/sys/boot/ofw/libofw/openfirm.c#2 integrate
.. //depot/projects/netperf_socket/sys/boot/powerpc/loader/Makefile#3 integrate
.. //depot/projects/netperf_socket/sys/boot/powerpc/loader/ldscript.powerpc#1 branch
.. //depot/projects/netperf_socket/sys/boot/powerpc/loader/start.c#2 integrate
.. //depot/projects/netperf_socket/sys/coda/coda_subr.c#2 integrate
.. //depot/projects/netperf_socket/sys/compat/linux/linux_socket.c#2 integrate
.. //depot/projects/netperf_socket/sys/compat/ndis/ndis_var.h#7 integrate
.. //depot/projects/netperf_socket/sys/compat/ndis/subr_ndis.c#11 integrate
.. //depot/projects/netperf_socket/sys/conf/NOTES#26 integrate
.. //depot/projects/netperf_socket/sys/conf/files#36 integrate
.. //depot/projects/netperf_socket/sys/conf/files.alpha#5 integrate
.. //depot/projects/netperf_socket/sys/conf/files.amd64#10 integrate
.. //depot/projects/netperf_socket/sys/conf/files.i386#19 integrate
.. //depot/projects/netperf_socket/sys/conf/files.pc98#11 integrate
.. //depot/projects/netperf_socket/sys/conf/options#18 integrate
.. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/addr.h#2 integrate
.. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/api/atmapi.h#1 branch
.. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/api/cc_conn.c#1 branch
.. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/api/cc_data.c#1 branch
.. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/api/cc_dump.c#1 branch
.. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/api/cc_port.c#1 branch
.. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/api/cc_sig.c#1 branch
.. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/api/cc_user.c#1 branch
.. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/api/ccatm.h#1 branch
.. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/api/ccpriv.h#1 branch
.. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/api/unisap.c#1 branch
.. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/api/unisap.h#1 branch
.. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/genfiles#2 integrate
.. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/misc/straddr.c#2 integrate
.. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/misc/unimsg_common.c#2 integrate
.. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/msg/geniec.awk#2 integrate
.. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/msg/genieh.awk#2 integrate
.. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/msg/genmsgc.awk#2 integrate
.. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/msg/genmsgh.awk#2 integrate
.. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/msg/ie.def#2 integrate
.. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/msg/msg.def#2 integrate
.. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/msg/parseie.awk#2 integrate
.. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/msg/parsemsg.awk#2 integrate
.. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/msg/priv.h#2 integrate
.. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/msg/privmsg.c#2 integrate
.. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/msg/traffic.c#2 integrate
.. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/msg/uni_config.h#2 integrate
.. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/msg/uni_hdr.h#2 integrate
.. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/msg/uni_ie.c#2 integrate
.. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/msg/unimsglib.h#2 integrate
.. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/msg/uniprint.h#2 integrate
.. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/msg/unistruct.h#2 integrate
.. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/saal/saal_sscfu.c#2 integrate
.. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/saal/saal_sscop.c#2 integrate
.. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/saal/sscfu.h#2 integrate
.. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/saal/sscfudef.h#2 integrate
.. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/saal/sscfupriv.h#2 integrate
.. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/saal/sscop.h#2 integrate
.. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/saal/sscopdef.h#2 integrate
.. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/saal/sscoppriv.h#2 integrate
.. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/sig/genmsgcpyc.awk#2 integrate
.. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/sig/genmsgcpyh.awk#2 integrate
.. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/sig/sig_call.c#2 integrate
.. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/sig/sig_coord.c#2 integrate
.. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/sig/sig_party.c#2 integrate
.. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/sig/sig_print.c#2 integrate
.. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/sig/sig_reset.c#2 integrate
.. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/sig/sig_uni.c#2 integrate
.. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/sig/sig_verify.c#2 integrate
.. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/sig/uni.h#2 integrate
.. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/sig/unidef.h#2 integrate
.. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/sig/unimkmsg.h#2 integrate
.. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/sig/unipriv.h#2 integrate
.. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/sig/unisig.h#2 integrate
.. //depot/projects/netperf_socket/sys/contrib/ngatm/netnatm/unimsg.h#2 integrate
.. //depot/projects/netperf_socket/sys/dev/acpica/acpi_pcib_acpi.c#7 integrate
.. //depot/projects/netperf_socket/sys/dev/fdc/fdc.c#4 integrate
.. //depot/projects/netperf_socket/sys/dev/fdc/fdc_isa.c#1 branch
.. //depot/projects/netperf_socket/sys/dev/fdc/fdc_pccard.c#1 branch
.. //depot/projects/netperf_socket/sys/dev/fdc/fdcvar.h#1 branch
.. //depot/projects/netperf_socket/sys/dev/hifn/hifn7751.c#5 integrate
.. //depot/projects/netperf_socket/sys/dev/if_ndis/if_ndis.c#14 integrate
.. //depot/projects/netperf_socket/sys/dev/if_ndis/if_ndisvar.h#6 integrate
.. //depot/projects/netperf_socket/sys/dev/nmdm/nmdm.c#9 integrate
.. //depot/projects/netperf_socket/sys/dev/pcf/pcfvar.h#2 integrate
.. //depot/projects/netperf_socket/sys/dev/ppbus/if_plip.c#3 integrate
.. //depot/projects/netperf_socket/sys/dev/ppbus/lpt.c#5 integrate
.. //depot/projects/netperf_socket/sys/dev/ppbus/pcfclock.c#6 integrate
.. //depot/projects/netperf_socket/sys/dev/ppbus/ppi.c#5 integrate
.. //depot/projects/netperf_socket/sys/dev/ppbus/pps.c#5 integrate
.. //depot/projects/netperf_socket/sys/dev/ppbus/vpo.c#3 integrate
.. //depot/projects/netperf_socket/sys/dev/re/if_re.c#11 integrate
.. //depot/projects/netperf_socket/sys/dev/sound/pci/via82c686.c#4 integrate
.. //depot/projects/netperf_socket/sys/dev/usb/usbdevs#17 integrate
.. //depot/projects/netperf_socket/sys/fs/msdosfs/msdosfs_fileno.c#1 branch
.. //depot/projects/netperf_socket/sys/fs/msdosfs/msdosfs_vfsops.c#5 integrate
.. //depot/projects/netperf_socket/sys/fs/msdosfs/msdosfs_vnops.c#3 integrate
.. //depot/projects/netperf_socket/sys/fs/msdosfs/msdosfsmount.h#4 integrate
.. //depot/projects/netperf_socket/sys/fs/pseudofs/pseudofs_vnops.c#3 integrate
.. //depot/projects/netperf_socket/sys/geom/concat/g_concat.c#9 integrate
.. //depot/projects/netperf_socket/sys/geom/concat/g_concat.h#7 integrate
.. //depot/projects/netperf_socket/sys/geom/geom_event.c#4 integrate
.. //depot/projects/netperf_socket/sys/geom/geom_int.h#3 integrate
.. //depot/projects/netperf_socket/sys/geom/geom_slice.c#5 integrate
.. //depot/projects/netperf_socket/sys/geom/geom_subr.c#6 integrate
.. //depot/projects/netperf_socket/sys/geom/label/g_label.c#2 integrate
.. //depot/projects/netperf_socket/sys/geom/label/g_label.h#2 integrate
.. //depot/projects/netperf_socket/sys/geom/stripe/g_stripe.c#3 integrate
.. //depot/projects/netperf_socket/sys/geom/stripe/g_stripe.h#2 integrate
.. //depot/projects/netperf_socket/sys/geom/vinum/geom_vinum.c#5 integrate
.. //depot/projects/netperf_socket/sys/gnu/ext2fs/ext2_vfsops.c#6 integrate
.. //depot/projects/netperf_socket/sys/i386/acpica/acpi_wakeup.c#4 integrate
.. //depot/projects/netperf_socket/sys/i386/i386/autoconf.c#3 integrate
.. //depot/projects/netperf_socket/sys/i386/i386/busdma_machdep.c#3 integrate
.. //depot/projects/netperf_socket/sys/i386/i386/elan-mmcr.c#9 integrate
.. //depot/projects/netperf_socket/sys/i386/i386/locore.s#3 integrate
.. //depot/projects/netperf_socket/sys/i386/i386/nexus.c#5 integrate
.. //depot/projects/netperf_socket/sys/i386/i386/pmap.c#16 integrate
.. //depot/projects/netperf_socket/sys/i386/isa/isa.c#4 integrate
.. //depot/projects/netperf_socket/sys/i386/isa/isa.h#3 integrate
.. //depot/projects/netperf_socket/sys/i386/isa/isa_dma.c#3 integrate
.. //depot/projects/netperf_socket/sys/i386/linux/linux_ptrace.c#2 integrate
.. //depot/projects/netperf_socket/sys/i386/pci/pci_cfgreg.c#4 integrate
.. //depot/projects/netperf_socket/sys/i4b/driver/i4b_ing.c#4 integrate
.. //depot/projects/netperf_socket/sys/ia64/ia64/autoconf.c#2 integrate
.. //depot/projects/netperf_socket/sys/ia64/ia64/pmap.c#10 integrate
.. //depot/projects/netperf_socket/sys/ia64/ia64/trap.c#5 integrate
.. //depot/projects/netperf_socket/sys/isa/orm.c#3 integrate
.. //depot/projects/netperf_socket/sys/isofs/cd9660/cd9660_lookup.c#3 integrate
.. //depot/projects/netperf_socket/sys/isofs/cd9660/cd9660_node.c#4 integrate
.. //depot/projects/netperf_socket/sys/isofs/cd9660/cd9660_rrip.c#4 integrate
.. //depot/projects/netperf_socket/sys/isofs/cd9660/cd9660_rrip.h#3 integrate
.. //depot/projects/netperf_socket/sys/isofs/cd9660/cd9660_vfsops.c#5 integrate
.. //depot/projects/netperf_socket/sys/kern/kern_event.c#5 integrate
.. //depot/projects/netperf_socket/sys/kern/sched_ule.c#12 integrate
.. //depot/projects/netperf_socket/sys/kern/subr_sbuf.c#3 integrate
.. //depot/projects/netperf_socket/sys/kern/subr_witness.c#6 integrate
.. //depot/projects/netperf_socket/sys/kern/sysv_shm.c#5 integrate
.. //depot/projects/netperf_socket/sys/kern/uipc_socket.c#27 integrate
.. //depot/projects/netperf_socket/sys/kern/uipc_syscalls.c#22 integrate
.. //depot/projects/netperf_socket/sys/kern/vfs_bio.c#7 integrate
.. //depot/projects/netperf_socket/sys/kern/vfs_default.c#4 integrate
.. //depot/projects/netperf_socket/sys/kern/vfs_init.c#4 integrate
.. //depot/projects/netperf_socket/sys/kern/vfs_mount.c#9 integrate
.. //depot/projects/netperf_socket/sys/kern/vfs_subr.c#12 integrate
.. //depot/projects/netperf_socket/sys/modules/de/Makefile#2 integrate
.. //depot/projects/netperf_socket/sys/modules/fdc/Makefile#4 integrate
.. //depot/projects/netperf_socket/sys/modules/msdosfs/Makefile#2 integrate
.. //depot/projects/netperf_socket/sys/modules/netgraph/Makefile#6 integrate
.. //depot/projects/netperf_socket/sys/modules/nfs4client/Makefile#2 integrate
.. //depot/projects/netperf_socket/sys/modules/nfsclient/Makefile#2 integrate
.. //depot/projects/netperf_socket/sys/net/bpf.c#8 integrate
.. //depot/projects/netperf_socket/sys/net/bridge.c#8 integrate
.. //depot/projects/netperf_socket/sys/net/if_disc.c#5 integrate
.. //depot/projects/netperf_socket/sys/net/if_ethersubr.c#18 integrate
.. //depot/projects/netperf_socket/sys/net/if_faith.c#7 integrate
.. //depot/projects/netperf_socket/sys/net/if_gif.c#7 integrate
.. //depot/projects/netperf_socket/sys/net/if_gre.c#7 integrate
.. //depot/projects/netperf_socket/sys/net/if_vlan.c#9 integrate
.. //depot/projects/netperf_socket/sys/net/rtsock.c#10 integrate
.. //depot/projects/netperf_socket/sys/netgraph/ng_async.c#3 integrate
.. //depot/projects/netperf_socket/sys/netgraph/ng_eiface.c#5 integrate
.. //depot/projects/netperf_socket/sys/netgraph/ng_fec.c#5 integrate
.. //depot/projects/netperf_socket/sys/netgraph/ng_gif_demux.c#3 integrate
.. //depot/projects/netperf_socket/sys/netgraph/ng_iface.c#6 integrate
.. //depot/projects/netperf_socket/sys/netgraph/ng_sppp.c#4 integrate
.. //depot/projects/netperf_socket/sys/netinet/ip_input.c#15 integrate
.. //depot/projects/netperf_socket/sys/nfs4client/nfs4_vfsops.c#5 integrate
.. //depot/projects/netperf_socket/sys/nfsclient/bootp_subr.c#5 integrate
.. //depot/projects/netperf_socket/sys/nfsclient/nfs.h#7 integrate
.. //depot/projects/netperf_socket/sys/nfsclient/nfs_bio.c#8 integrate
.. //depot/projects/netperf_socket/sys/nfsclient/nfs_socket.c#9 integrate
.. //depot/projects/netperf_socket/sys/nfsclient/nfs_subs.c#9 integrate
.. //depot/projects/netperf_socket/sys/nfsclient/nfs_vfsops.c#6 integrate
.. //depot/projects/netperf_socket/sys/nfsclient/nfs_vnops.c#5 integrate
.. //depot/projects/netperf_socket/sys/nfsclient/nfsmount.h#3 integrate
.. //depot/projects/netperf_socket/sys/nfsserver/nfs_srvcache.c#6 integrate
.. //depot/projects/netperf_socket/sys/pc98/conf/NOTES#14 integrate
.. //depot/projects/netperf_socket/sys/pc98/pc98/fd.c#9 integrate
.. //depot/projects/netperf_socket/sys/pc98/pc98/fdc_cbus.c#1 branch
.. //depot/projects/netperf_socket/sys/pc98/pc98/fdcvar.h#1 branch
.. //depot/projects/netperf_socket/sys/pc98/pc98/isa_dma.c#3 integrate
.. //depot/projects/netperf_socket/sys/pc98/pc98/pc98.h#3 integrate
.. //depot/projects/netperf_socket/sys/pci/if_dc.c#9 integrate
.. //depot/projects/netperf_socket/sys/pci/if_de.c#8 integrate
.. //depot/projects/netperf_socket/sys/pci/if_devar.h#2 integrate
.. //depot/projects/netperf_socket/sys/pci/if_rl.c#13 integrate
.. //depot/projects/netperf_socket/sys/pci/if_rlreg.h#4 integrate
.. //depot/projects/netperf_socket/sys/pci/if_sf.c#8 integrate
.. //depot/projects/netperf_socket/sys/pci/if_ti.c#8 integrate
.. //depot/projects/netperf_socket/sys/pci/if_vr.c#10 integrate
.. //depot/projects/netperf_socket/sys/pci/if_vrreg.h#3 integrate
.. //depot/projects/netperf_socket/sys/pci/if_xl.c#10 integrate
.. //depot/projects/netperf_socket/sys/pci/if_xlreg.h#2 integrate
.. //depot/projects/netperf_socket/sys/powerpc/include/stdarg.h#2 integrate
.. //depot/projects/netperf_socket/sys/powerpc/ofw/ofw_syscons.c#3 integrate
.. //depot/projects/netperf_socket/sys/powerpc/ofw/ofw_syscons.h#3 integrate
.. //depot/projects/netperf_socket/sys/powerpc/powerpc/pmap.c#9 integrate
.. //depot/projects/netperf_socket/sys/powerpc/powerpc/trap.c#3 integrate
.. //depot/projects/netperf_socket/sys/sparc64/ebus/ebus.c#7 integrate
.. //depot/projects/netperf_socket/sys/sparc64/fhc/fhc.c#3 integrate
.. //depot/projects/netperf_socket/sys/sparc64/pci/psycho.c#6 integrate
.. //depot/projects/netperf_socket/sys/sparc64/sbus/sbus.c#6 integrate
.. //depot/projects/netperf_socket/sys/sparc64/sparc64/iommu.c#7 integrate
.. //depot/projects/netperf_socket/sys/sparc64/sparc64/nexus.c#6 integrate
.. //depot/projects/netperf_socket/sys/sys/event.h#2 integrate
.. //depot/projects/netperf_socket/sys/sys/mount.h#9 integrate
.. //depot/projects/netperf_socket/sys/sys/param.h#16 integrate
.. //depot/projects/netperf_socket/sys/sys/sbuf.h#2 integrate
.. //depot/projects/netperf_socket/sys/sys/vnode.h#7 integrate
.. //depot/projects/netperf_socket/sys/ufs/ffs/ffs_snapshot.c#6 integrate
.. //depot/projects/netperf_socket/sys/ufs/ffs/ffs_vfsops.c#6 integrate
.. //depot/projects/netperf_socket/sys/ufs/ufs/ufs_quota.c#3 integrate
.. //depot/projects/netperf_socket/sys/vm/swap_pager.c#6 integrate
.. //depot/projects/netperf_socket/sys/vm/uma_core.c#8 integrate
.. //depot/projects/netperf_socket/sys/vm/vm_map.h#6 integrate

Differences ...

==== //depot/projects/netperf_socket/sys/alpha/alpha/autoconf.c#2 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/alpha/alpha/autoconf.c,v 1.57 2003/08/22 07:20:25 imp Exp $");
+__FBSDID("$FreeBSD: src/sys/alpha/alpha/autoconf.c,v 1.59 2004/07/08 22:35:33 brian Exp $");
 
 #include "opt_bootp.h"
 #include "opt_isa.h"

==== //depot/projects/netperf_socket/sys/alpha/alpha/pmap.c#10 (text+ko) ====

@@ -148,7 +148,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/alpha/alpha/pmap.c,v 1.150 2004/06/15 19:28:39 alc Exp $");
+__FBSDID("$FreeBSD: src/sys/alpha/alpha/pmap.c,v 1.154 2004/07/08 07:44:55 alc Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -520,6 +520,7 @@
 	/*
 	 * Initialize the kernel pmap (which is statically allocated).
 	 */
+	PMAP_LOCK_INIT(kernel_pmap);
 	kernel_pmap->pm_lev1 = Lev1map;
 	kernel_pmap->pm_active = ~0;
 	kernel_pmap->pm_asn[alpha_pal_whami()].asn = 0;
@@ -741,10 +742,8 @@
  *		Extract the physical page address associated
  *		with the given map/virtual_address pair.
  */
-vm_offset_t 
-pmap_extract(pmap, va)
-	register pmap_t pmap;
-	vm_offset_t va;
+vm_paddr_t
+pmap_extract(pmap_t pmap, vm_offset_t va)
 {
 	pt_entry_t* pte = pmap_lev3pte(pmap, va);
 	if (pte)
@@ -988,6 +987,7 @@
 {
 	int i;
 
+	PMAP_LOCK_INIT(pmap);
 	pmap->pm_lev1 = Lev1map;
 	pmap->pm_ptphint = NULL;
 	pmap->pm_active = 0;
@@ -1012,6 +1012,8 @@
 	vm_page_t lev1pg;
 	int i;
 
+	PMAP_LOCK_INIT(pmap);
+
 	/*
 	 * allocate object for the ptes
 	 */
@@ -1294,6 +1296,7 @@
 	mtx_lock_spin(&allpmaps_lock);
 	LIST_REMOVE(pmap, pm_list);
 	mtx_unlock_spin(&allpmaps_lock);
+	PMAP_LOCK_DESTROY(pmap);
 }
 
 /*
@@ -1618,6 +1621,7 @@
 
 	s = splvm();
 	while ((pv = TAILQ_FIRST(&m->md.pv_list)) != NULL) {
+		PMAP_LOCK(pv->pv_pmap);
 		pte = pmap_lev3pte(pv->pv_pmap, pv->pv_va);
 
 		pv->pv_pmap->pm_stats.resident_count--;
@@ -1647,6 +1651,7 @@
 		TAILQ_REMOVE(&m->md.pv_list, pv, pv_list);
 		m->md.pv_list_count--;
 		pmap_unuse_pt(pv->pv_pmap, pv->pv_va, pv->pv_ptem);
+		PMAP_UNLOCK(pv->pv_pmap);
 		free_pv_entry(pv);
 	}
 
@@ -1681,6 +1686,7 @@
 	if ((sva & PAGE_MASK) || (eva & PAGE_MASK))
 		panic("pmap_protect: unaligned addresses");
 
+	PMAP_LOCK(pmap);
 	while (sva < eva) {
 
 		/*
@@ -1731,6 +1737,7 @@
 
 		sva += PAGE_SIZE;
 	}
+	PMAP_UNLOCK(pmap);
 }
 
 /*
@@ -2033,6 +2040,7 @@
 	if (pmap == NULL)
 		return;
 
+	PMAP_LOCK(pmap);
 	pte = pmap_lev3pte(pmap, va);
 
 	if (wired && !pmap_pte_w(pte))
@@ -2045,6 +2053,7 @@
 	 * invalidate TLB.
 	 */
 	pmap_pte_set_w(pte, wired);
+	PMAP_UNLOCK(pmap);
 }
 
 
@@ -2186,6 +2195,7 @@
 #endif
 
 	s = splvm();
+	PMAP_LOCK(pmap);
 	for(pv = TAILQ_FIRST(&pmap->pm_pvlist);
 		pv;
 		pv = npv) {
@@ -2232,6 +2242,7 @@
 	}
 	splx(s);
 	pmap_invalidate_all(pmap);
+	PMAP_UNLOCK(pmap);
 }
 
 /*
@@ -2273,6 +2284,7 @@
 		}
 #endif
 
+		PMAP_LOCK(pv->pv_pmap);
 		pte = pmap_lev3pte(pv->pv_pmap, pv->pv_va);
 
 		changed = 0;
@@ -2288,6 +2300,7 @@
 		}
 		if (changed)
 			pmap_invalidate_page(pv->pv_pmap, pv->pv_va);
+		PMAP_UNLOCK(pv->pv_pmap);
 	}
 	if (!setem && bit == (PG_UWE|PG_KWE))
 		vm_page_flag_clear(m, PG_WRITEABLE);
@@ -2340,6 +2353,7 @@
 	 */
 	count = 0;
 	TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
+		PMAP_LOCK(pv->pv_pmap);
 		pte = pmap_lev3pte(pv->pv_pmap, pv->pv_va);
 		
 		if (!(*pte & PG_FOR)) {
@@ -2347,6 +2361,7 @@
 			*pte |= PG_FOR | PG_FOE;
 			pmap_invalidate_page(pv->pv_pmap, pv->pv_va);
 		}
+		PMAP_UNLOCK(pv->pv_pmap);
 	}
 
 	return count;
@@ -2416,12 +2431,14 @@
 	 * Loop over current mappings setting PG_FOW where needed.
 	 */
 	TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
+		PMAP_LOCK(pv->pv_pmap);
 		pte = pmap_lev3pte(pv->pv_pmap, pv->pv_va);
 		
 		if (!(*pte & PG_FOW)) {
 			*pte |= PG_FOW;
 			pmap_invalidate_page(pv->pv_pmap, pv->pv_va);
 		}
+		PMAP_UNLOCK(pv->pv_pmap);
 	}
 }
 
@@ -2443,12 +2460,14 @@
 	 * Loop over current mappings setting PG_FOR and PG_FOE where needed.
 	 */
 	TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
+		PMAP_LOCK(pv->pv_pmap);
 		pte = pmap_lev3pte(pv->pv_pmap, pv->pv_va);
 		
 		if (!(*pte & (PG_FOR | PG_FOE))) {
 			*pte |= (PG_FOR | PG_FOE);
 			pmap_invalidate_page(pv->pv_pmap, pv->pv_va);
 		}
+		PMAP_UNLOCK(pv->pv_pmap);
 	}
 }
 
@@ -2461,9 +2480,8 @@
 void
 pmap_emulate_reference(struct vmspace *vm, vm_offset_t v, int user, int write)
 {
+	pmap_t pmap;
 	pt_entry_t faultoff, *pte;
-	vm_offset_t pa;
-	int user_addr;
 
 	/*
 	 * Convert process and virtual address to physical address.
@@ -2471,12 +2489,14 @@
 	if (v >= VM_MIN_KERNEL_ADDRESS) {
 		if (user)
 			panic("pmap_emulate_reference: user ref to kernel");
+		pmap = kernel_pmap;
+		PMAP_LOCK(pmap);
 		pte = vtopte(v);
-		user_addr = 0;
 	} else {
 		KASSERT(vm != NULL, ("pmap_emulate_reference: bad vmspace"));
-		pte = pmap_lev3pte(vm->vm_map.pmap, v);
-		user_addr = 1;
+		pmap = &vm->vm_pmap;
+		PMAP_LOCK(pmap);
+		pte = pmap_lev3pte(pmap, v);
 	}
 #ifdef DEBUG				/* These checks are more expensive */
 	if (!pmap_pte_v(pte))
@@ -2501,11 +2521,9 @@
 #endif
 	/* Other diagnostics? */
 #endif
-	pa = pmap_pte_pa(pte);
-
 	KASSERT((*pte & PG_MANAGED) != 0,
 	    ("pmap_emulate_reference(%p, 0x%lx, %d, %d): pa 0x%lx not managed",
-	    curthread, v, user, write, pa));
+	    curthread, v, user, write, pmap_pte_pa(pte)));
 
 	/*
 	 * Twiddle the appropriate bits to reflect the reference
@@ -2523,6 +2541,7 @@
 
 	*pte = (*pte & ~faultoff);
 	ALPHA_TBIS(v);
+	PMAP_UNLOCK(pmap);
 }
 
 /*

==== //depot/projects/netperf_socket/sys/alpha/include/pmap.h#7 (text+ko) ====

@@ -39,7 +39,7 @@
  *	from: hp300: @(#)pmap.h	7.2 (Berkeley) 12/16/90
  *	from: @(#)pmap.h	7.4 (Berkeley) 5/12/91
  *	from: i386 pmap.h,v 1.54 1997/11/20 19:30:35 bde Exp
- * $FreeBSD: src/sys/alpha/include/pmap.h,v 1.31 2004/06/23 08:06:52 alc Exp $
+ * $FreeBSD: src/sys/alpha/include/pmap.h,v 1.32 2004/07/05 16:59:56 alc Exp $
  */
 
 #ifndef _MACHINE_PMAP_H_
@@ -95,6 +95,8 @@
 #ifndef LOCORE
 
 #include <sys/queue.h>
+#include <sys/_lock.h>
+#include <sys/_mutex.h>
 
 typedef alpha_pt_entry_t pt_entry_t;
 
@@ -165,6 +167,7 @@
 #define	ASNGEN_MASK	((1 << ASNGEN_BITS) - 1)
 
 struct pmap {
+	struct mtx		pm_mtx;
 	pt_entry_t		*pm_lev1;	/* KVA of lev0map */
 	vm_object_t		pm_pteobj;	/* Container for pte's */
 	TAILQ_HEAD(,pv_entry)	pm_pvlist;	/* list of mappings in pmap */
@@ -183,6 +186,17 @@
 #ifdef _KERNEL
 extern struct pmap	kernel_pmap_store;
 #define kernel_pmap	(&kernel_pmap_store)
+
+#define	PMAP_LOCK(pmap)		mtx_lock(&(pmap)->pm_mtx)
+#define	PMAP_LOCK_ASSERT(pmap, type) \
+				mtx_assert(&(pmap)->pm_mtx, (type))
+#define	PMAP_LOCK_DESTROY(pmap)	mtx_destroy(&(pmap)->pm_mtx)
+#define	PMAP_LOCK_INIT(pmap)	mtx_init(&(pmap)->pm_mtx, "pmap", \
+				    NULL, MTX_DEF)
+#define	PMAP_LOCKED(pmap)	mtx_owned(&(pmap)->pm_mtx)
+#define	PMAP_MTX(pmap)		(&(pmap)->pm_mtx)
+#define	PMAP_TRYLOCK(pmap)	mtx_trylock(&(pmap)->pm_mtx)
+#define	PMAP_UNLOCK(pmap)	mtx_unlock(&(pmap)->pm_mtx)
 #endif
 
 /*

==== //depot/projects/netperf_socket/sys/amd64/amd64/autoconf.c#3 (text+ko) ====

@@ -33,7 +33,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/amd64/amd64/autoconf.c,v 1.178 2004/04/05 21:25:51 imp Exp $");
+__FBSDID("$FreeBSD: src/sys/amd64/amd64/autoconf.c,v 1.180 2004/07/08 22:35:33 brian Exp $");
 
 /*
  * Setup the system to run on the current machine.

==== //depot/projects/netperf_socket/sys/amd64/amd64/busdma_machdep.c#3 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/amd64/amd64/busdma_machdep.c,v 1.55 2004/03/13 15:42:59 scottl Exp $");
+__FBSDID("$FreeBSD: src/sys/amd64/amd64/busdma_machdep.c,v 1.56 2004/07/08 01:28:33 peter Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -38,6 +38,7 @@
 #include <sys/mutex.h>
 #include <sys/mbuf.h>
 #include <sys/uio.h>
+#include <sys/sysctl.h>
 
 #include <vm/vm.h>
 #include <vm/vm_page.h>
@@ -84,8 +85,24 @@
 static int reserved_bpages;
 static int active_bpages;
 static int total_bpages;
+static int total_bounced;
+static int total_deferred;
 static bus_addr_t bounce_lowaddr = BUS_SPACE_MAXADDR;
 
+SYSCTL_NODE(_hw, OID_AUTO, busdma, CTLFLAG_RD, 0, "Busdma parameters");
+SYSCTL_INT(_hw_busdma, OID_AUTO, free_bpages, CTLFLAG_RD, &free_bpages, 0,
+	   "Free bounce pages");
+SYSCTL_INT(_hw_busdma, OID_AUTO, reserved_bpages, CTLFLAG_RD, &reserved_bpages,
+	   0, "Reserved bounce pages");
+SYSCTL_INT(_hw_busdma, OID_AUTO, active_bpages, CTLFLAG_RD, &active_bpages, 0,
+	   "Active bounce pages");
+SYSCTL_INT(_hw_busdma, OID_AUTO, total_bpages, CTLFLAG_RD, &total_bpages, 0,
+	   "Total bounce pages");
+SYSCTL_INT(_hw_busdma, OID_AUTO, total_bounced, CTLFLAG_RD, &total_bounced, 0,
+	   "Total bounce requests");
+SYSCTL_INT(_hw_busdma, OID_AUTO, total_deferred, CTLFLAG_RD, &total_deferred, 0,
+	   "Total bounce requests that were deferred");
+
 struct bus_dmamap {
 	struct bp_list	       bpages;
 	int		       pagesneeded;
@@ -109,7 +126,8 @@
 static bus_addr_t add_bounce_page(bus_dma_tag_t dmat, bus_dmamap_t map,
 				   vm_offset_t vaddr, bus_size_t size);
 static void free_bounce_page(bus_dma_tag_t dmat, struct bounce_page *bpage);
-static __inline int run_filter(bus_dma_tag_t dmat, bus_addr_t paddr);
+static __inline int run_filter(bus_dma_tag_t dmat, bus_addr_t paddr,
+			       bus_size_t len);
 
 /*
  * Return true if a match is made.
@@ -120,14 +138,18 @@
  * to check for a match, if there is no filter callback then assume a match.
  */
 static __inline int
-run_filter(bus_dma_tag_t dmat, bus_addr_t paddr)
+run_filter(bus_dma_tag_t dmat, bus_addr_t paddr, bus_size_t len)
 {
+	bus_size_t bndy;
 	int retval;
 
 	retval = 0;
+	bndy = dmat->boundary;
+
 	do {
-		if (paddr > dmat->lowaddr
-		 && paddr <= dmat->highaddr
+		if (((paddr > dmat->lowaddr && paddr <= dmat->highaddr)
+		 || ((paddr & (dmat->alignment - 1)) != 0)
+		 || ((paddr & bndy) != ((paddr + len) & bndy)))
 		 && (dmat->filter == NULL
 		  || (*dmat->filter)(dmat->filterarg, paddr) != 0))
 			retval = 1;
@@ -188,6 +210,10 @@
 	bus_dma_tag_t newtag;
 	int error = 0;
 
+	/* Basic sanity checking */
+	if (boundary != 0 && boundary < maxsegsz)
+		maxsegsz = boundary;
+
 	/* Return a NULL tag on failure */
 	*dmat = NULL;
 
@@ -322,7 +348,13 @@
 			return (ENOMEM);
 	}
 
-	if (dmat->lowaddr < ptoa((vm_paddr_t)Maxmem)) {
+	/*
+	 * Bouncing might be required if the driver asks for an active
+	 * exclusion region, a data alignment that is stricter than 1, and/or
+	 * an active address boundary.
+	 */
+	if (dmat->lowaddr < ptoa((vm_paddr_t)Maxmem)
+	 || dmat->alignment > 1 || dmat->boundary > 0) {
 		/* Must bounce */
 		int maxpages;
 
@@ -340,8 +372,7 @@
 		 */
 		maxpages = MIN(MAX_BPAGES, Maxmem - atop(dmat->lowaddr));
 		if ((dmat->flags & BUS_DMA_MIN_ALLOC_COMP) == 0
-		 || (dmat->map_count > 0
-		  && total_bpages < maxpages)) {
+		 || (dmat->map_count > 0 && total_bpages < maxpages)) {
 			int pages;
 
 			if (dmat->lowaddr > bounce_lowaddr) {
@@ -426,6 +457,7 @@
 		 * XXX Use Contigmalloc until it is merged into this facility
 		 *     and handles multi-seg allocations.  Nobody is doing
 		 *     multi-seg allocations yet though.
+		 * XXX Certain AGP hardware does.
 		 */
 		*vaddr = contigmalloc(dmat->maxsize, M_DEVBUF, mflags,
 		    0ul, dmat->lowaddr, dmat->alignment? dmat->alignment : 1ul,
@@ -492,8 +524,9 @@
 	else
 		pmap = NULL;
 
-	if (dmat->lowaddr < ptoa((vm_paddr_t)Maxmem) &&
-	    map->pagesneeded == 0) {
+	if ((dmat->lowaddr < ptoa((vm_paddr_t)Maxmem)
+	 || dmat->boundary > 0 || dmat->alignment > 1)
+	 && map->pagesneeded == 0) {
 		vm_offset_t	vendaddr;
 
 		/*
@@ -505,7 +538,7 @@
 
 		while (vaddr < vendaddr) {
 			paddr = pmap_kextract(vaddr);
-			if (run_filter(dmat, paddr) != 0) {
+			if (run_filter(dmat, paddr, 0) != 0) {
 				needbounce = 1;
 				map->pagesneeded++;
 			}
@@ -566,7 +599,7 @@
 				sgsize = (baddr - curaddr);
 		}
 
-		if (map->pagesneeded != 0 && run_filter(dmat, curaddr))
+		if (map->pagesneeded != 0 && run_filter(dmat, curaddr, sgsize))
 			curaddr = add_bounce_page(dmat, map, vaddr, sgsize);
 
 		/*
@@ -763,6 +796,8 @@
 		 * want to add support for invalidating
 		 * the caches on broken hardware
 		 */
+		total_bounced++;
+
 		if (op & BUS_DMASYNC_PREWRITE) {
 			while (bpage != NULL) {
 				bcopy((void *)bpage->datavaddr,
@@ -901,6 +936,7 @@
 			STAILQ_INSERT_TAIL(&bounce_map_callbacklist,
 					   map, links);
 			busdma_swi_pending = 1;
+			total_deferred++;
 			swi_sched(vm_ih, 0);
 		}
 	}

==== //depot/projects/netperf_socket/sys/amd64/amd64/io_apic.c#4 (text+ko) ====

@@ -28,7 +28,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/amd64/amd64/io_apic.c,v 1.9 2004/06/03 20:25:05 peter Exp $");
+__FBSDID("$FreeBSD: src/sys/amd64/amd64/io_apic.c,v 1.10 2004/07/08 01:42:49 peter Exp $");
 
 #include "opt_atpic.h"
 #include "opt_isa.h"
@@ -100,6 +100,7 @@
 	u_int io_edgetrigger:1;
 	u_int io_masked:1;
 	int io_dest:5;
+	int io_bus:4;
 };
 
 struct ioapic {
@@ -115,6 +116,8 @@
 
 static u_int	ioapic_read(volatile ioapic_t *apic, int reg);
 static void	ioapic_write(volatile ioapic_t *apic, int reg, u_int val);
+static const char *ioapic_bus_string(int bus_type);
+static void	ioapic_print_vector(struct ioapic_intsrc *intpin);
 static void	ioapic_enable_source(struct intsrc *isrc);
 static void	ioapic_disable_source(struct intsrc *isrc);
 static void	ioapic_eoi_source(struct intsrc *isrc);
@@ -163,6 +166,45 @@
 	apic->iowin = val;
 }
 
+static const char *
+ioapic_bus_string(int bus_type)
+{
+
+	switch (bus_type) {
+	case APIC_BUS_ISA:
+		return ("ISA");
+	case APIC_BUS_EISA:
+		return ("EISA");
+	case APIC_BUS_PCI:
+		return ("PCI");
+	default:
+		return ("unknown");
+	}
+}
+
+static void
+ioapic_print_vector(struct ioapic_intsrc *intpin)
+{
+
+	switch (intpin->io_vector) {
+	case VECTOR_DISABLED:
+		printf("disabled");
+		break;
+	case VECTOR_EXTINT:
+		printf("ExtINT");
+		break;
+	case VECTOR_NMI:
+		printf("NMI");
+		break;
+	case VECTOR_SMI:
+		printf("SMI");
+		break;
+	default:
+		printf("%s IRQ %u", ioapic_bus_string(intpin->io_bus),
+		    intpin->io_vector);
+	}
+}
+
 static void
 ioapic_enable_source(struct intsrc *isrc)
 {
@@ -299,10 +341,7 @@
 	if (bootverbose) {
 		printf("ioapic%u: routing intpin %u (", io->io_id,
 		    intpin->io_intpin);
-		if (intpin->io_vector == VECTOR_EXTINT)
-			printf("ExtINT");
-		else
-			printf("IRQ %u", intpin->io_vector);
+		ioapic_print_vector(intpin);
 		printf(") to cluster %u\n", intpin->io_dest);
 	}
 	ioapic_program_intpin(intpin);
@@ -365,32 +404,39 @@
 {
 	struct ioapic_intsrc *intpin = (struct ioapic_intsrc *)isrc;
 	struct ioapic *io = (struct ioapic *)isrc->is_pic;
+	int changed;
 
 	KASSERT(!(trig == INTR_TRIGGER_CONFORM || pol == INTR_POLARITY_CONFORM),
 	    ("%s: Conforming trigger or polarity\n", __func__));
 
 	/*
-	 * For now we ignore any requests but do output any changes that
-	 * would be made to the console it bootverbose is enabled.  The only
-	 * known causes of these messages so far is a bug in acpi(4) that
-	 * causes the ISA IRQs used for PCI interrupts in PIC mode to be
-	 * set to level/low when they aren't being used.  There are possibly
-	 * legitimate requests, so at some point when the acpi(4) driver is
-	 * fixed this code can be changed to actually change the intpin as
-	 * requested.
+	 * EISA interrupts always use active high polarity, so don't allow
+	 * them to be set to active low.
+	 *
+	 * XXX: Should we write to the ELCR if the trigger mode changes for
+	 * an EISA IRQ?
 	 */
-	if (!bootverbose)
-		return (0);
-	if (intpin->io_edgetrigger != (trig == INTR_TRIGGER_EDGE))
-		printf(
-	"ioapic%u: Request to change trigger for pin %u to %s ignored\n",
-		    io->io_id, intpin->io_intpin, trig == INTR_TRIGGER_EDGE ?
-		    "edge" : "level");
-	if (intpin->io_activehi != (pol == INTR_POLARITY_HIGH))
-		printf(
-	"ioapic%u: Request to change polarity for pin %u to %s ignored\n",
-		    io->io_id, intpin->io_intpin, pol == INTR_POLARITY_HIGH ?
-		    "high" : "low");
+	if (intpin->io_bus == APIC_BUS_EISA)
+		pol = INTR_POLARITY_HIGH;
+	changed = 0;
+	if (intpin->io_edgetrigger != (trig == INTR_TRIGGER_EDGE)) {
+		if (bootverbose)
+			printf("ioapic%u: Changing trigger for pin %u to %s\n",
+			    io->io_id, intpin->io_intpin,
+			    trig == INTR_TRIGGER_EDGE ? "edge" : "level");
+		intpin->io_edgetrigger = (trig == INTR_TRIGGER_EDGE);
+		changed++;
+	}
+	if (intpin->io_activehi != (pol == INTR_POLARITY_HIGH)) {
+		if (bootverbose)
+			printf("ioapic%u: Changing polarity for pin %u to %s\n",
+			    io->io_id, intpin->io_intpin,
+			    pol == INTR_POLARITY_HIGH ? "high" : "low");
+		intpin->io_activehi = (pol == INTR_POLARITY_HIGH);
+		changed++;
+	}
+	if (changed)
+		ioapic_program_intpin(intpin);
 	return (0);
 }
 
@@ -491,44 +537,36 @@
 		intpin->io_vector = intbase + i;
 
 		/*
-		 * Assume that pin 0 on the first IO APIC is an ExtINT pin by
-		 * default.  Assume that intpins 1-15 are ISA interrupts and
-		 * use suitable defaults for those.  Assume that all other
-		 * intpins are PCI interrupts.  Enable the ExtINT pin if
-		 * mixed mode is available and active but mask all other pins.
+		 * Assume that pin 0 on the first I/O APIC is an ExtINT pin
+		 * and that pins 1-15 are ISA interrupts.  Assume that all
+		 * other pins are PCI interrupts.
 		 */
-		if (intpin->io_vector == 0) {
+		if (intpin->io_vector == 0)
+			ioapic_set_extint(io, i);
+		else if (intpin->io_vector < IOAPIC_ISA_INTS) {
+			intpin->io_bus = APIC_BUS_ISA;
 			intpin->io_activehi = 1;
 			intpin->io_edgetrigger = 1;
-			intpin->io_vector = VECTOR_EXTINT;
-			if (mixed_mode_enabled && mixed_mode_active)
-				intpin->io_masked = 0;
-			else
-				intpin->io_masked = 1;
-		} else if (intpin->io_vector < IOAPIC_ISA_INTS) {
-			intpin->io_activehi = 1;
-			intpin->io_edgetrigger = 1;
 			intpin->io_masked = 1;
 		} else {
+			intpin->io_bus = APIC_BUS_PCI;
 			intpin->io_activehi = 0;
 			intpin->io_edgetrigger = 0;
 			intpin->io_masked = 1;
 		}
 
 		/*
-		 * Start off without a logical cluster destination until
-		 * the pin is enabled.
+		 * Route interrupts to the BSP by default using physical
+		 * addressing.  Vectored interrupts get readdressed using
+		 * logical IDs to CPU clusters when they are enabled.
 		 */
 		intpin->io_dest = DEST_NONE;
-		if (bootverbose) {
+		if (bootverbose && intpin->io_vector != VECTOR_DISABLED) {
 			printf("ioapic%u: intpin %d -> ",  io->io_id, i);
-			if (intpin->io_vector == VECTOR_EXTINT)
-				printf("ExtINT");
-			else
-				printf("irq %u", intpin->io_vector);
-			printf(" (%s, active%s)\n", intpin->io_edgetrigger ?
-			    "edge" : "level", intpin->io_activehi ? "hi" :
-			    "lo");
+			ioapic_print_vector(intpin);
+			printf(" (%s, %s)\n", intpin->io_edgetrigger ?
+			    "edge" : "level", intpin->io_activehi ? "high" :
+			    "low");
 		}
 		value = ioapic_read(apic, IOAPIC_REDTBL_LO(i));
 		ioapic_write(apic, IOAPIC_REDTBL_LO(i), value | IOART_INTMSET);
@@ -583,6 +621,25 @@
 }
 
 int
+ioapic_set_bus(void *cookie, u_int pin, int bus_type)
+{
+	struct ioapic *io;
+
+	if (bus_type < 0 || bus_type > APIC_BUS_MAX)
+		return (EINVAL);
+	io = (struct ioapic *)cookie;
+	if (pin >= io->io_numintr)
+		return (EINVAL);
+	if (io->io_pins[pin].io_vector >= NUM_IO_INTS)
+		return (EINVAL);
+	io->io_pins[pin].io_bus = bus_type;
+	if (bootverbose)
+		printf("ioapic%u: intpin %d bus %s\n", io->io_id, pin,
+		    ioapic_bus_string(bus_type));
+	return (0);
+}
+
+int
 ioapic_set_nmi(void *cookie, u_int pin)
 {
 	struct ioapic *io;
@@ -590,8 +647,11 @@
 	io = (struct ioapic *)cookie;
 	if (pin >= io->io_numintr)
 		return (EINVAL);
+	if (io->io_pins[pin].io_vector == VECTOR_NMI)
+		return (0);
 	if (io->io_pins[pin].io_vector >= NUM_IO_INTS)
 		return (EINVAL);
+	io->io_pins[pin].io_bus = APIC_BUS_UNKNOWN;
 	io->io_pins[pin].io_vector = VECTOR_NMI;
 	io->io_pins[pin].io_masked = 0;
 	io->io_pins[pin].io_edgetrigger = 1;
@@ -610,8 +670,11 @@
 	io = (struct ioapic *)cookie;
 	if (pin >= io->io_numintr)
 		return (EINVAL);
+	if (io->io_pins[pin].io_vector == VECTOR_SMI)
+		return (0);
 	if (io->io_pins[pin].io_vector >= NUM_IO_INTS)
 		return (EINVAL);
+	io->io_pins[pin].io_bus = APIC_BUS_UNKNOWN;
 	io->io_pins[pin].io_vector = VECTOR_SMI;
 	io->io_pins[pin].io_masked = 0;
 	io->io_pins[pin].io_edgetrigger = 1;
@@ -630,10 +693,18 @@
 	io = (struct ioapic *)cookie;
 	if (pin >= io->io_numintr)
 		return (EINVAL);
+	if (io->io_pins[pin].io_vector == VECTOR_EXTINT)
+		return (0);
 	if (io->io_pins[pin].io_vector >= NUM_IO_INTS)
 		return (EINVAL);
+	io->io_pins[pin].io_bus = APIC_BUS_UNKNOWN;
 	io->io_pins[pin].io_vector = VECTOR_EXTINT;
-	io->io_pins[pin].io_masked = 0;
+
+	/* Enable this pin if mixed mode is available and active. */
+	if (mixed_mode_enabled && mixed_mode_active)
+		io->io_pins[pin].io_masked = 0;
+	else
+		io->io_pins[pin].io_masked = 1;
 	io->io_pins[pin].io_edgetrigger = 1;
 	io->io_pins[pin].io_activehi = 1;
 	if (bootverbose)


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


More information about the p4-projects mailing list