PERFORCE change 81598 for review

Robert Watson rwatson at FreeBSD.org
Sun Aug 7 14:29:51 GMT 2005


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

Change 81598 by rwatson at rwatson_peppercorn on 2005/08/07 14:29:02

	Integrate netsmp:
	
	- ia64isms
	- change in types for sysvshm limits
	- kobj_machdep_init()
	- sam's if_free() fix for if_addr_mtx.
	- jhb takes if_pcn locking by storm
	- VV_NOKNOTE

Affected files ...

.. //depot/projects/netsmp/src/sys/alpha/conf/GENERIC.hints#2 integrate
.. //depot/projects/netsmp/src/sys/boot/forth/loader.conf#3 integrate
.. //depot/projects/netsmp/src/sys/boot/i386/boot2/boot2.c#2 integrate
.. //depot/projects/netsmp/src/sys/dev/acpica/acpi_battery.c#4 integrate
.. //depot/projects/netsmp/src/sys/dev/puc/puc_ebus.c#2 integrate
.. //depot/projects/netsmp/src/sys/dev/uart/uart_bus_ebus.c#2 integrate
.. //depot/projects/netsmp/src/sys/dev/uart/uart_cpu_sparc64.c#2 integrate
.. //depot/projects/netsmp/src/sys/i386/conf/GENERIC#3 integrate
.. //depot/projects/netsmp/src/sys/ia64/ia64/exception.S#2 integrate
.. //depot/projects/netsmp/src/sys/ia64/ia64/interrupt.c#2 integrate
.. //depot/projects/netsmp/src/sys/ia64/ia64/machdep.c#2 integrate
.. //depot/projects/netsmp/src/sys/ia64/ia64/mp_machdep.c#2 integrate
.. //depot/projects/netsmp/src/sys/ia64/ia64/pmap.c#2 integrate
.. //depot/projects/netsmp/src/sys/ia64/ia64/trap.c#2 integrate
.. //depot/projects/netsmp/src/sys/ia64/ia64/vm_machdep.c#2 integrate
.. //depot/projects/netsmp/src/sys/ia64/include/ia64_cpu.h#2 integrate
.. //depot/projects/netsmp/src/sys/ia64/include/param.h#2 integrate
.. //depot/projects/netsmp/src/sys/ia64/include/proc.h#2 integrate
.. //depot/projects/netsmp/src/sys/ia64/include/smp.h#2 integrate
.. //depot/projects/netsmp/src/sys/kern/subr_kobj.c#2 integrate
.. //depot/projects/netsmp/src/sys/kern/sysv_shm.c#2 integrate
.. //depot/projects/netsmp/src/sys/kern/vfs_subr.c#4 integrate
.. //depot/projects/netsmp/src/sys/net/if.c#10 integrate
.. //depot/projects/netsmp/src/sys/net80211/ieee80211_input.c#4 integrate
.. //depot/projects/netsmp/src/sys/net80211/ieee80211_node.c#5 integrate
.. //depot/projects/netsmp/src/sys/net80211/ieee80211_node.h#3 integrate
.. //depot/projects/netsmp/src/sys/pci/if_pcn.c#5 integrate
.. //depot/projects/netsmp/src/sys/pci/if_pcnreg.h#2 integrate
.. //depot/projects/netsmp/src/sys/sparc64/sparc64/tick.c#2 integrate
.. //depot/projects/netsmp/src/sys/sys/ata.h#3 integrate
.. //depot/projects/netsmp/src/sys/sys/kobj.h#2 integrate
.. //depot/projects/netsmp/src/sys/sys/mount.h#2 integrate
.. //depot/projects/netsmp/src/sys/sys/shm.h#2 integrate
.. //depot/projects/netsmp/src/sys/sys/vnode.h#3 integrate

Differences ...

==== //depot/projects/netsmp/src/sys/alpha/conf/GENERIC.hints#2 (text+ko) ====

@@ -1,4 +1,4 @@
-# $FreeBSD: src/sys/alpha/conf/GENERIC.hints,v 1.8 2004/07/11 03:07:28 marcel Exp $
+# $FreeBSD: src/sys/alpha/conf/GENERIC.hints,v 1.9 2005/08/06 19:24:22 marcel Exp $
 hint.fdc.0.at="isa"
 hint.fdc.0.port="0x3F0"
 hint.fdc.0.irq="6"
@@ -32,3 +32,10 @@
 hint.sio.1.flags="0x80"
 hint.ppc.0.at="isa"
 hint.ppc.0.irq="7"
+hint.uart.0.at="isa"
+hint.uart.0.irq="4"
+hint.uart.0.port="0x3F8"
+hint.uart.1.at="isa"
+hint.uart.1.flags="0x80"
+hint.uart.1.irq="3"
+hint.uart.1.port="0x2F8"

==== //depot/projects/netsmp/src/sys/boot/forth/loader.conf#3 (text+ko) ====

@@ -6,7 +6,7 @@
 #
 # All arguments must be in double quotes.
 #
-# $FreeBSD: src/sys/boot/forth/loader.conf,v 1.96 2005/07/29 12:41:37 brian Exp $
+# $FreeBSD: src/sys/boot/forth/loader.conf,v 1.98 2005/08/07 09:41:53 krion Exp $
 
 ##############################################################
 ###  Basic configuration options  ############################
@@ -91,7 +91,7 @@
 #kern.maxswzone=""		# Set the max swmeta KVA storage
 #kern.maxtsiz=""		# Set the max text size
 #kern.maxusers="32"		# Set size of various static tables
-#kern.nbuf=""			# Set the number of buffer headers 
+#kern.nbuf=""			# Set the number of buffer headers
 #kern.ncallout=""		# Set the maximum # of timer events
 #kern.sgrowsiz=""		# Set the amount to grow stack
 #kern.cam.scsi_delay="2000"	# Delay (in ms) before probing SCSI
@@ -184,10 +184,16 @@
 miibus_load="NO"		# miibus support, needed for some drivers
 if_an_load="NO"			# Aironet 4500/4800 802.11 wireless NICs
 if_ar_load="NO"			# Digi SYNC/570i
+if_arl_load="NO"		# Aironet Arlan 655 wireless network adapter
+if_ath_load="NO"		# Atheros IEEE 802.11 wireless NICs
+if_aue_load="NO"		# ADMtek AN986 Pegasus USB Ethernet
 if_awi_load="NO"		# AMD PCnetMobile IEEE 802.11 wireless NICs
+if_axe_load="NO"		# ASIX Electronics AX88172 USB Ethernet
 if_bfe_load="NO"		# Broadcom BCM4401
 if_bge_load="NO"		# Broadcom BCM570x PCI gigabit ethernet
 if_cm_load="NO"			# SMC (90c26, 90c56, 90c66)
+if_cs_load="NO"			# Crystal Semiconductor CS8920
+if_cue_load="NO"		# CATC USB-EL1210A USB Ethernet
 if_dc_load="NO"			# DEC/Intel 21143 and various workalikes
 if_de_load="NO"			# DEC DC21x4x ethernet
 if_ed_load="NO"			# National Semiconductor DS8390/WD83C690 ethernet
@@ -199,16 +205,19 @@
 if_fe_load="NO"			# Fujitsu MB86960A/MB86965A based Ethernet adapters
 if_fxp_load="NO"		# Intel EtherExpress PRO/100B (82557, 82558)
 if_gx_load="NO"			# Intel Pro/1000 gigabit ethernet
+if_hme_load="NO"		#  Sun Microelectronics STP2002-STQ Ethernet
 if_ie_load="NO"			# Intel 82586
 if_lge_load="NO"		# Level 1 LXT1001 NetCellerator PCI gigabit ethernet
 if_lnc_load="NO"		# AMD Lance/PCnet Ethernet
 if_my_load="NO"			# Myson PCI fast ethernet
 if_nge_load="NO"		# National Semiconductor PCI gigabit ethernet
+if_nve_load="NO"		# NVIDIA nForce MCP Networking Adapter
 if_oltr_load="NO"		# Olicom
 if_pcn_load="NO"		# AMD PCnet PCI
 if_ray_load="NO"		# Raytheon Raylink/Webgear Aviator PCCard
 if_re_load="NO"			# RealTek 8139C+/8169/8169S/8110S
 if_rl_load="NO"			# RealTek 8129/8139
+if_rue_load="NO"		# RealTek RTL8150 USB to Fast Ethernet
 if_sbni_load="NO"		# Granch SBNI12 leased line adapters
 if_sf_load="NO"			# Adaptec Duralink PCI (AIC-6915 "starfire")
 if_sis_load="NO"		# Silicon Integrated Systems SiS 900/7016
@@ -221,6 +230,7 @@
 if_tx_load="NO"			# SMC 83c17x fast ethernet
 if_txp_load="NO"		# 3Com 3XP Typhoon/Sidewinder (3CR990)
 if_vge_load="NO"		# VIA VT6122 PCI Gigabit Ethernet
+if_udav_load="NO"		# Davicom DM9601 USB Ethernet
 if_vr_load="NO"			# VIA Rhine I and Rhine II
 if_vx_load="NO"			# 3Com 3C590 family
 if_wb_load="NO"			# Winbond W89C840F

==== //depot/projects/netsmp/src/sys/boot/i386/boot2/boot2.c#2 (text+ko) ====

@@ -14,7 +14,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/boot/i386/boot2/boot2.c,v 1.72 2005/05/27 19:26:11 jhb Exp $");
+__FBSDID("$FreeBSD: src/sys/boot/i386/boot2/boot2.c,v 1.73 2005/08/06 00:33:42 ssouhlal Exp $");
 
 #include <sys/param.h>
 #include <sys/disklabel.h>
@@ -71,7 +71,7 @@
 
 #define PATH_CONFIG	"/boot.config"
 #define PATH_BOOT3	"/boot/loader"
-#define PATH_KERNEL	"/kernel"
+#define PATH_KERNEL	"/boot/kernel/kernel"
 
 #define ARGS		0x900
 #define NOPT		12

==== //depot/projects/netsmp/src/sys/dev/acpica/acpi_battery.c#4 (text+ko) ====

@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_battery.c,v 1.16 2005/07/28 19:34:51 njl Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_battery.c,v 1.17 2005/08/05 17:00:58 njl Exp $");
 
 #include "opt_acpi.h"
 #include <sys/param.h>
@@ -225,6 +225,10 @@
 	else
 	    bi[i].min = 0;
 	total_min += bi[i].min;
+
+	/* If this battery is not present, don't use its capacity. */
+	if (bi[i].cap == -1)
+	    bi[i].cap = 0;
 	total_cap += bi[i].cap;
     }
 

==== //depot/projects/netsmp/src/sys/dev/puc/puc_ebus.c#2 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/puc/puc_ebus.c,v 1.5 2005/06/04 20:29:28 marius Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/puc/puc_ebus.c,v 1.6 2005/08/07 13:37:25 marius Exp $");
 
 #include "opt_puc.h"
 
@@ -48,10 +48,11 @@
 static int
 puc_ebus_probe(device_t dev)
 {
-	const char *nm;
+	const char *nm, *cmpt;
 
 	nm = ofw_bus_get_name(dev);
-	if (!strcmp(nm, "se")) {
+	cmpt = ofw_bus_get_compat(dev);
+	if (!strcmp(nm, "se") || (cmpt != NULL && !strcmp(cmpt, "sab82532"))) {
 		device_set_desc(dev, "Siemens SAB 82532 dual channel SCC");
 		return (0);
 	}

==== //depot/projects/netsmp/src/sys/dev/uart/uart_bus_ebus.c#2 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/uart/uart_bus_ebus.c,v 1.6 2005/06/04 21:52:56 marius Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/uart/uart_bus_ebus.c,v 1.7 2005/08/07 13:37:25 marius Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -96,7 +96,7 @@
 		sc->sc_class = &uart_ns8250_class;
 		return (uart_bus_probe(dev, 0, 0, 0, 0));
 	}
-	if (!strcmp(nm, "se")) {
+	if (!strcmp(nm, "se") || (cmpt != NULL && !strcmp(cmpt, "sab82532"))) {
 		sc->sc_class = &uart_sab82532_class;
 		error = uart_bus_probe(dev, 0, 0, 0, 1);
 		return ((error) ? error : -1);

==== //depot/projects/netsmp/src/sys/dev/uart/uart_cpu_sparc64.c#2 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/uart/uart_cpu_sparc64.c,v 1.19 2005/06/04 21:33:18 marius Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/uart/uart_cpu_sparc64.c,v 1.20 2005/08/07 13:37:25 marius Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -216,7 +216,7 @@
 		compat[0] = '\0';
 	di->bas.regshft = 0;
 	di->bas.rclk = 0;
-	if (!strcmp(buf, "se")) {
+	if (!strcmp(buf, "se") || !strcmp(compat, "sab82532")) {
 		di->ops = uart_sab82532_ops;
 		/* SAB82532 are only known to be used for TTYs. */
 		if ((di->bas.chan = uart_cpu_channel(dev)) == 0)

==== //depot/projects/netsmp/src/sys/i386/conf/GENERIC#3 (text+ko) ====

@@ -16,7 +16,7 @@
 # If you are in doubt as to the purpose or necessity of a line, check first
 # in NOTES.
 #
-# $FreeBSD: src/sys/i386/conf/GENERIC,v 1.430 2005/07/14 15:39:05 kensmith Exp $
+# $FreeBSD: src/sys/i386/conf/GENERIC,v 1.432 2005/08/06 23:05:48 davidxu Exp $
 
 machine		i386
 cpu		I486_CPU

==== //depot/projects/netsmp/src/sys/ia64/ia64/exception.S#2 (text+ko) ====

@@ -26,7 +26,7 @@
  */
 
 #include <machine/asm.h>
-__FBSDID("$FreeBSD: src/sys/ia64/ia64/exception.S,v 1.56 2004/09/25 04:27:44 marcel Exp $");
+__FBSDID("$FreeBSD: src/sys/ia64/ia64/exception.S,v 1.57 2005/08/06 20:28:19 marcel Exp $");
 
 #include <machine/pte.h>
 #include <assym.s>
@@ -644,6 +644,7 @@
 	add	r20=24,r18		// collision chain
 	;; 
 	ld8	r21=[r21]		// check VHPT tag
+	ld8	r20=[r20]		// bucket head
 	;;
 	cmp.ne	p15,p0=r21,r19
 (p15)	br.dpnt.few 1f
@@ -722,6 +723,7 @@
 	add	r20=24,r18		// collision chain
 	;; 
 	ld8	r21=[r21]		// check VHPT tag
+	ld8	r20=[r20]		// bucket head
 	;;
 	cmp.ne	p15,p0=r21,r19
 (p15)	br.dpnt.few 1f
@@ -937,6 +939,8 @@
 	ttag	r19=r16
 	add	r20=24,r18		// collision chain
 	;; 
+	ld8	r20=[r20]		// bucket head
+	;;
 	ld8	r20=[r20]		// first entry
 	;; 
 	rsm	psr.dt			// turn off data translations
@@ -1003,6 +1007,8 @@
 	ttag	r19=r16
 	add	r20=24,r18		// collision chain
 	;; 
+	ld8	r20=[r20]		// bucket head
+	;;
 	ld8	r20=[r20]		// first entry
 	;;
 	rsm	psr.dt			// turn off data translations
@@ -1069,6 +1075,8 @@
 	ttag	r19=r16
 	add	r20=24,r18		// collision chain
 	;;
+	ld8	r20=[r20]		// bucket head
+	;;
 	ld8	r20=[r20]		// first entry
 	;;
 	rsm	psr.dt			// turn off data translations

==== //depot/projects/netsmp/src/sys/ia64/ia64/interrupt.c#2 (text+ko) ====

@@ -1,4 +1,4 @@
-/* $FreeBSD: src/sys/ia64/ia64/interrupt.c,v 1.49 2005/04/12 23:18:54 jhb Exp $ */
+/* $FreeBSD: src/sys/ia64/ia64/interrupt.c,v 1.50 2005/08/06 20:28:19 marcel Exp $ */
 /* $NetBSD: interrupt.c,v 1.23 1998/02/24 07:38:01 thorpej Exp $ */
 
 /*-
@@ -147,6 +147,8 @@
 	if (vector == 0) {
 		vector = ib->ib_inta;
 		printf("ExtINT interrupt: vector=%ld\n", vector);
+		if (vector == 15)
+			goto stray;
 	}
 
 	if (vector == CLOCK_VECTOR) {/* clock interrupt */
@@ -207,9 +209,11 @@
 	} else if (vector == ipi_vector[IPI_HIGH_FP]) {
 		struct thread *thr = PCPU_GET(fpcurthread);
 		if (thr != NULL) {
+			mtx_lock(&thr->td_md.md_highfp_mtx);
 			save_high_fp(&thr->td_pcb->pcb_high_fp);
 			thr->td_pcb->pcb_fpcpu = NULL;
 			PCPU_SET(fpcurthread, NULL);
+			mtx_unlock(&thr->td_md.md_highfp_mtx);
 		}
 	} else if (vector == ipi_vector[IPI_RENDEZVOUS]) {
 		rdvs[PCPU_GET(cpuid)]++;
@@ -239,6 +243,7 @@
 		ia64_dispatch_intr(tf, vector);
 	}
 
+stray:
 	atomic_subtract_int(&td->td_intr_nesting_level, 1);
 	return (TRAPF_USERMODE(tf));
 }

==== //depot/projects/netsmp/src/sys/ia64/ia64/machdep.c#2 (text+ko) ====

@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/ia64/ia64/machdep.c,v 1.200 2005/07/05 17:12:18 marcel Exp $");
+__FBSDID("$FreeBSD: src/sys/ia64/ia64/machdep.c,v 1.201 2005/08/06 20:28:19 marcel Exp $");
 
 #include "opt_compat.h"
 #include "opt_ddb.h"
@@ -55,6 +55,7 @@
 #include <sys/ptrace.h>
 #include <sys/random.h>
 #include <sys/reboot.h>
+#include <sys/sched.h>
 #include <sys/signalvar.h>
 #include <sys/syscall.h>
 #include <sys/sysctl.h>
@@ -764,8 +765,8 @@
 	 */
 	proc0kstack = (vm_offset_t)kstack;
 	thread0.td_kstack = proc0kstack;
-	thread0.td_pcb = (struct pcb *)
-	    (thread0.td_kstack + KSTACK_PAGES * PAGE_SIZE) - 1;
+	thread0.td_kstack_pages = KSTACK_PAGES;
+
 	/*
 	 * Setup the global data for the bootstrap cpu.
 	 */
@@ -774,6 +775,8 @@
 	pcpu_init(pcpup, 0, PAGE_SIZE);
 	PCPU_SET(curthread, &thread0);
 
+	mutex_init();
+
 	/*
 	 * Initialize the rest of proc 0's PCB.
 	 *
@@ -781,14 +784,11 @@
 	 * and make proc0's trapframe pointer point to it for sanity.
 	 * Initialise proc0's backing store to start after u area.
 	 */
-	thread0.td_frame = (struct trapframe *)thread0.td_pcb - 1;
-	thread0.td_frame->tf_length = sizeof(struct trapframe);
+	cpu_thread_setup(&thread0);
 	thread0.td_frame->tf_flags = FRAME_SYSCALL;
 	thread0.td_pcb->pcb_special.sp =
 	    (u_int64_t)thread0.td_frame - 16;
-	thread0.td_pcb->pcb_special.bspstore = (u_int64_t)proc0kstack;
-
-	mutex_init();
+	thread0.td_pcb->pcb_special.bspstore = thread0.td_kstack;
 
 	/*
 	 * Initialize the virtual memory system.
@@ -1428,7 +1428,6 @@
 
 /*
  * High FP register functions.
- * XXX no synchronization yet.
  */
 
 int
@@ -1438,13 +1437,17 @@
 	struct pcpu *cpu;
 	struct thread *thr;
 
+	mtx_lock(&td->td_md.md_highfp_mtx);
 	pcb = td->td_pcb;
 	cpu = pcb->pcb_fpcpu;
-	if (cpu == NULL)
+	if (cpu == NULL) {
+		mtx_unlock(&td->td_md.md_highfp_mtx);
 		return (0);
+	}
 	pcb->pcb_fpcpu = NULL;
 	thr = cpu->pc_fpcurthread;
 	cpu->pc_fpcurthread = NULL;
+	mtx_unlock(&td->td_md.md_highfp_mtx);
 
 	/* Post-mortem sanity checking. */
 	KASSERT(thr == td, ("Inconsistent high FP state"));
@@ -1462,22 +1465,36 @@
 	if ((td->td_frame->tf_special.psr & IA64_PSR_MFH) == 0)
 		return (ia64_highfp_drop(td));
 
+	mtx_lock(&td->td_md.md_highfp_mtx);
 	pcb = td->td_pcb;
 	cpu = pcb->pcb_fpcpu;
-	if (cpu == NULL)
+	if (cpu == NULL) {
+		mtx_unlock(&td->td_md.md_highfp_mtx);
 		return (0);
+	}
 #ifdef SMP
+	if (td == curthread)
+		sched_pin();
 	if (cpu != pcpup) {
-		ipi_send(cpu->pc_lid, IPI_HIGH_FP);
-		while (pcb->pcb_fpcpu != cpu)
+		mtx_unlock(&td->td_md.md_highfp_mtx);
+		ipi_send(cpu, IPI_HIGH_FP);
+		if (td == curthread)
+			sched_unpin();
+		while (pcb->pcb_fpcpu == cpu)
 			DELAY(100);
 		return (1);
+	} else {
+		save_high_fp(&pcb->pcb_high_fp);
+		if (td == curthread)
+			sched_unpin();
 	}
+#else
+	save_high_fp(&pcb->pcb_high_fp);
 #endif
-	save_high_fp(&pcb->pcb_high_fp);
 	pcb->pcb_fpcpu = NULL;
 	thr = cpu->pc_fpcurthread;
 	cpu->pc_fpcurthread = NULL;
+	mtx_unlock(&td->td_md.md_highfp_mtx);
 
 	/* Post-mortem sanity cxhecking. */
 	KASSERT(thr == td, ("Inconsistent high FP state"));

==== //depot/projects/netsmp/src/sys/ia64/ia64/mp_machdep.c#2 (text+ko) ====

@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/ia64/ia64/mp_machdep.c,v 1.55 2005/04/15 00:21:23 marcel Exp $");
+__FBSDID("$FreeBSD: src/sys/ia64/ia64/mp_machdep.c,v 1.56 2005/08/06 20:28:19 marcel Exp $");
 
 #include "opt_kstack_pages.h"
 
@@ -64,8 +64,9 @@
 
 void ia64_ap_startup(void);
 
-extern vm_offset_t vhpt_base, vhpt_size;
-extern u_int64_t ia64_lapic_address;
+extern uint64_t vhpt_base[];
+extern size_t vhpt_size;
+extern uint64_t ia64_lapic_address;
 
 #define	LID_SAPIC_ID(x)		((int)((x) >> 24) & 0xff)
 #define	LID_SAPIC_EID(x)	((int)((x) >> 16) & 0xff)
@@ -74,9 +75,10 @@
 
 int	mp_ipi_test = 0;
 
-/* Variables used by os_boot_rendez */
+/* Variables used by os_boot_rendez and ia64_ap_startup */
+struct pcpu *ap_pcpu;
 void *ap_stack;
-struct pcpu *ap_pcpu;
+uint64_t ap_vhpt;
 volatile int ap_delay;
 volatile int ap_awake;
 volatile int ap_spin;
@@ -86,14 +88,15 @@
 void
 ia64_ap_startup(void)
 {
-	ap_awake = 1;
-	ap_delay = 0;
+
+	pcpup = ap_pcpu;
+	ia64_set_k4((intptr_t)pcpup);
 
 	__asm __volatile("mov cr.pta=%0;; srlz.i;;" ::
-	    "r" (vhpt_base + (1<<8) + (vhpt_size<<2) + 1));
+	    "r" (ap_vhpt + (1<<8) + (vhpt_size<<2) + 1));
 
-	pcpup = ap_pcpu;
-	ia64_set_k4((intptr_t)pcpup);
+	ap_awake = 1;
+	ap_delay = 0;
 
 	map_pal_code();
 	map_gateway_page();
@@ -102,7 +105,7 @@
 
 	/* Wait until it's time for us to be unleashed */
 	while (ap_spin)
-		/* spin */;
+		DELAY(0);
 
 	__asm __volatile("ssm psr.i;; srlz.d;;");
 
@@ -119,7 +122,7 @@
 
 	ap_awake++;
 	while (!smp_started)
-		/* spin */;
+		DELAY(0);
 
 	CTR1(KTR_SMP, "SMP: cpu%d launched", PCPU_GET(cpuid));
 
@@ -242,16 +245,17 @@
 		pc->pc_current_pmap = kernel_pmap;
 		pc->pc_other_cpus = all_cpus & ~pc->pc_cpumask;
 		if (pc->pc_cpuid > 0) {
+			ap_pcpu = pc;
 			ap_stack = malloc(KSTACK_PAGES * PAGE_SIZE, M_PMAP,
 			    M_WAITOK);
-			ap_pcpu = pc;
+			ap_vhpt = vhpt_base[pc->pc_cpuid];
 			ap_delay = 2000;
 			ap_awake = 0;
 
 			if (bootverbose)
 				printf("SMP: waking up cpu%d\n", pc->pc_cpuid);
 
-			ipi_send(pc->pc_lid, IPI_AP_WAKEUP);
+			ipi_send(pc, IPI_AP_WAKEUP);
 
 			do {
 				DELAY(1000);
@@ -292,7 +296,7 @@
 	ap_spin = 0;
 
 	while (ap_awake != smp_cpus)
-		/* spin */;
+		DELAY(0);
 
 	if (smp_cpus != cpus || cpus != mp_ncpus) {
 		printf("SMP: %d CPUs found; %d CPUs usable; %d CPUs woken\n",
@@ -307,13 +311,13 @@
  * send an IPI to a set of cpus.
  */
 void
-ipi_selected(u_int64_t cpus, int ipi)
+ipi_selected(cpumask_t cpus, int ipi)
 {
 	struct pcpu *pc;
 
 	SLIST_FOREACH(pc, &cpuhead, pc_allcpu) {
 		if (cpus & pc->pc_cpumask)
-			ipi_send(pc->pc_lid, ipi);
+			ipi_send(pc, ipi);
 	}
 }
 
@@ -326,7 +330,7 @@
 	struct pcpu *pc;
 
 	SLIST_FOREACH(pc, &cpuhead, pc_allcpu) {
-		ipi_send(pc->pc_lid, ipi);
+		ipi_send(pc, ipi);
 	}
 }
 
@@ -340,7 +344,7 @@
 
 	SLIST_FOREACH(pc, &cpuhead, pc_allcpu) {
 		if (pc != pcpup)
-			ipi_send(pc->pc_lid, ipi);
+			ipi_send(pc, ipi);
 	}
 }
 
@@ -351,7 +355,7 @@
 ipi_self(int ipi)
 {
 
-	ipi_send(ia64_get_lid(), ipi);
+	ipi_send(pcpup, ipi);
 }
 
 /*
@@ -360,17 +364,17 @@
  * fields are used here.
  */
 void
-ipi_send(u_int64_t lid, int ipi)
+ipi_send(struct pcpu *cpu, int ipi)
 {
-	volatile u_int64_t *pipi;
-	u_int64_t vector;
+	volatile uint64_t *pipi;
+	uint64_t vector;
 
 	pipi = __MEMIO_ADDR(ia64_lapic_address |
-	    ((lid & LID_SAPIC_MASK) >> 12));
-	vector = (u_int64_t)(ipi_vector[ipi] & 0xff);
+	    ((cpu->pc_lid & LID_SAPIC_MASK) >> 12));
+	vector = (uint64_t)(ipi_vector[ipi] & 0xff);
+	*pipi = vector;
 	CTR3(KTR_SMP, "ipi_send(%p, %ld), cpuid=%d", pipi, vector,
 	    PCPU_GET(cpuid));
-	*pipi = vector;
 }
 
 SYSINIT(start_aps, SI_SUB_SMP, SI_ORDER_FIRST, cpu_mp_unleash, NULL);

==== //depot/projects/netsmp/src/sys/ia64/ia64/pmap.c#2 (text+ko) ====

@@ -46,7 +46,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/ia64/ia64/pmap.c,v 1.160 2005/06/10 03:33:36 alc Exp $");
+__FBSDID("$FreeBSD: src/sys/ia64/ia64/pmap.c,v 1.161 2005/08/06 20:28:19 marcel Exp $");
 
 #include <sys/param.h>
 #include <sys/kernel.h>
@@ -155,8 +155,15 @@
 vm_offset_t virtual_avail;	/* VA of first avail page (after kernel bss) */
 vm_offset_t virtual_end;	/* VA of last avail page (end of kernel AS) */
 
-vm_offset_t vhpt_base, vhpt_size;
-struct mtx pmap_vhptmutex;
+struct ia64_bucket {
+	uint64_t	chain;
+	struct mtx	mutex;
+	u_int		length;
+};
+
+struct ia64_bucket *vhpt_bucket;
+uint64_t vhpt_base[MAXCPU];
+size_t vhpt_size;
 
 /*
  * Kernel virtual memory management.
@@ -177,6 +184,7 @@
 static uint64_t pmap_ptc_e_count2 = 2;
 static uint64_t pmap_ptc_e_stride1 = 0x2000;
 static uint64_t pmap_ptc_e_stride2 = 0x100000000;
+struct mtx pmap_ptcmutex;
 
 /*
  * Data for the RID allocator
@@ -204,14 +212,11 @@
  * VHPT instrumentation.
  */
 static int pmap_vhpt_inserts;
-static int pmap_vhpt_collisions;
 static int pmap_vhpt_resident;
 SYSCTL_DECL(_vm_stats);
 SYSCTL_NODE(_vm_stats, OID_AUTO, vhpt, CTLFLAG_RD, 0, "");
 SYSCTL_INT(_vm_stats_vhpt, OID_AUTO, inserts, CTLFLAG_RD,
 	   &pmap_vhpt_inserts, 0, "");
-SYSCTL_INT(_vm_stats_vhpt, OID_AUTO, collisions, CTLFLAG_RD,
-	   &pmap_vhpt_collisions, 0, "");
 SYSCTL_INT(_vm_stats_vhpt, OID_AUTO, resident, CTLFLAG_RD,
 	   &pmap_vhpt_resident, 0, "");
 
@@ -257,8 +262,11 @@
 void
 pmap_bootstrap()
 {
+	struct ia64_pal_result res;
+	struct ia64_lpte *pte;
+	vm_offset_t base, limit;
+	size_t size;
 	int i, j, count, ridbits;
-	struct ia64_pal_result res;
 
 	/*
 	 * Query the PAL Code to find the loop parameters for the
@@ -280,6 +288,7 @@
 		       pmap_ptc_e_count2,
 		       pmap_ptc_e_stride1,
 		       pmap_ptc_e_stride2);
+	mtx_init(&pmap_ptcmutex, "Global PTC lock", NULL, MTX_SPIN);
 
 	/*
 	 * Setup RIDs. RIDs 0..7 are reserved for the kernel.
@@ -335,7 +344,8 @@
 	kernel_vm_end = NKPT * PAGE_SIZE * NKPTEPG + VM_MIN_KERNEL_ADDRESS -
 	    VM_GATEWAY_SIZE;
 
-	for (i = 0; phys_avail[i+2]; i+= 2) ;
+	for (i = 0; phys_avail[i+2]; i+= 2)
+		;
 	count = i+2;
 
 	/*
@@ -345,19 +355,20 @@
 	 * size and aligned to a natural boundary).
 	 */
 	vhpt_size = 15;
-	while ((1<<vhpt_size) < Maxmem * 32)
+	size = 1UL << vhpt_size;
+	while (size < Maxmem * 32) {
 		vhpt_size++;
+		size <<= 1;
+	}
 
-	vhpt_base = 0;
-	while (!vhpt_base) {
-		vm_offset_t mask;
+	vhpt_base[0] = 0;
+	base = limit = 0;
+	while (vhpt_base[0] == 0) {
 		if (bootverbose)
-			printf("Trying VHPT size 0x%lx\n", (1L<<vhpt_size));
-		mask = (1L << vhpt_size) - 1;
+			printf("Trying VHPT size 0x%lx\n", size);
 		for (i = 0; i < count; i += 2) {
-			vm_offset_t base, limit;
-			base = (phys_avail[i] + mask) & ~mask;
-			limit = base + (1L << vhpt_size);
+			base = (phys_avail[i] + size - 1) & ~(size - 1);
+			limit = base + MAXCPU * size;
 			if (limit <= phys_avail[i+1])
 				/*
 				 * VHPT can fit in this region
@@ -365,46 +376,53 @@
 				break;
 		}
 		if (!phys_avail[i]) {
-			/*
-			 * Can't fit, try next smaller size.
-			 */
+			/* Can't fit, try next smaller size. */
 			vhpt_size--;
-		} else {
-			vhpt_base = (phys_avail[i] + mask) & ~mask;
-		}
+			size >>= 1;
+		} else
+			vhpt_base[0] = IA64_PHYS_TO_RR7(base);
 	}
 	if (vhpt_size < 15)
 		panic("Can't find space for VHPT");
 
 	if (bootverbose)
-		printf("Putting VHPT at %p\n", (void *) vhpt_base);
-	if (vhpt_base != phys_avail[i]) {
-		/*
-		 * Split this region.
-		 */
+		printf("Putting VHPT at 0x%lx\n", base);
+
+	if (base != phys_avail[i]) {
+		/* Split this region. */
 		if (bootverbose)
-			printf("Splitting [%p-%p]\n",
-			       (void *) phys_avail[i],
-			       (void *) phys_avail[i+1]);
+			printf("Splitting [%p-%p]\n", (void *)phys_avail[i],
+			    (void *)phys_avail[i+1]);
 		for (j = count; j > i; j -= 2) {
 			phys_avail[j] = phys_avail[j-2];
 			phys_avail[j+1] = phys_avail[j-2+1];
 		}
-		phys_avail[count+2] = 0;
-		phys_avail[count+3] = 0;
-		phys_avail[i+1] = vhpt_base;
-		phys_avail[i+2] = vhpt_base + (1L << vhpt_size);
-	} else {
-		phys_avail[i] = vhpt_base + (1L << vhpt_size);
+		phys_avail[i+1] = base;
+		phys_avail[i+2] = limit;
+	} else
+		phys_avail[i] = limit;
+
+	count = size / sizeof(struct ia64_lpte);
+
+	vhpt_bucket = (void *)pmap_steal_memory(count * sizeof(struct ia64_bucket));
+	pte = (struct ia64_lpte *)vhpt_base[0];
+	for (i = 0; i < count; i++) {
+		pte[i].pte = 0;
+		pte[i].itir = 0;
+		pte[i].tag = 1UL << 63;	/* Invalid tag */
+		pte[i].chain = (uintptr_t)(vhpt_bucket + i);
+		/* Stolen memory is zeroed! */
+		mtx_init(&vhpt_bucket[i].mutex, "VHPT bucket lock", NULL,
+		    MTX_SPIN);
 	}
 
-	vhpt_base = IA64_PHYS_TO_RR7(vhpt_base);
-	bzero((void *) vhpt_base, (1L << vhpt_size));
+	for (i = 1; i < MAXCPU; i++) {
+		vhpt_base[i] = vhpt_base[i - 1] + size;
+		bcopy((void *)vhpt_base[i - 1], (void *)vhpt_base[i], size);
+	}
 
-	mtx_init(&pmap_vhptmutex, "VHPT collision chain lock", NULL, MTX_DEF);
-
-	__asm __volatile("mov cr.pta=%0;; srlz.i;;"
-			 :: "r" (vhpt_base + (1<<8) + (vhpt_size<<2) + 1));
+	__asm __volatile("mov cr.pta=%0;; srlz.i;;" ::
+	    "r" (vhpt_base[0] + (1<<8) + (vhpt_size<<2) + 1));
 
 	virtual_avail = VM_MIN_KERNEL_ADDRESS;
 	virtual_end = VM_MAX_KERNEL_ADDRESS;
@@ -494,12 +512,73 @@
  * Manipulate TLBs for a pmap
  ***************************************************/
 
+#if 0
+static __inline void
+pmap_invalidate_page_locally(void *arg)
+{
+	vm_offset_t va = (uintptr_t)arg;
+	struct ia64_lpte *pte;
+
+	pte = (struct ia64_lpte *)ia64_thash(va);
+	if (pte->tag == ia64_ttag(va))
+		pte->tag = 1UL << 63;
+	ia64_ptc_l(va, PAGE_SHIFT << 2);
+}
+
+#ifdef SMP
 static void
+pmap_invalidate_page_1(void *arg)
+{
+	void **args = arg;
+	pmap_t oldpmap;
+
+	critical_enter();
+	oldpmap = pmap_install(args[0]);
+	pmap_invalidate_page_locally(args[1]);
+	pmap_install(oldpmap);
+	critical_exit();
+}
+#endif
+
+static void
+pmap_invalidate_page(pmap_t pmap, vm_offset_t va)
+{
+
+	KASSERT((pmap == kernel_pmap || pmap == PCPU_GET(current_pmap)),
+		("invalidating TLB for non-current pmap"));
+
+#ifdef SMP
+	if (mp_ncpus > 1) {
+		void *args[2];
+		args[0] = pmap;
+		args[1] = (void *)va;
+		smp_rendezvous(NULL, pmap_invalidate_page_1, NULL, args);
+	} else
+#endif
+	pmap_invalidate_page_locally((void *)va);
+}
+#endif /* 0 */
+
+static void
 pmap_invalidate_page(pmap_t pmap, vm_offset_t va)
 {
+	struct ia64_lpte *pte;
+	int i, vhpt_ofs;
+
 	KASSERT((pmap == kernel_pmap || pmap == PCPU_GET(current_pmap)),
 		("invalidating TLB for non-current pmap"));
-	ia64_ptc_g(va, PAGE_SHIFT << 2);
+
+	vhpt_ofs = ia64_thash(va) - vhpt_base[PCPU_GET(cpuid)];
+	critical_enter();
+	for (i = 0; i < MAXCPU; i++) {
+		pte = (struct ia64_lpte *)(vhpt_base[i] + vhpt_ofs);
+		if (pte->tag == ia64_ttag(va))
+			pte->tag = 1UL << 63;
+	}
+	critical_exit();
+	mtx_lock_spin(&pmap_ptcmutex);
+	ia64_ptc_ga(va, PAGE_SHIFT << 2);
+	mtx_unlock_spin(&pmap_ptcmutex);
 }
 
 static void
@@ -507,9 +586,8 @@
 {
 	uint64_t addr;
 	int i, j;
-	register_t psr;
 
-	psr = intr_disable();
+	critical_enter();
 	addr = pmap_ptc_e_base;
 	for (i = 0; i < pmap_ptc_e_count1; i++) {
 		for (j = 0; j < pmap_ptc_e_count2; j++) {
@@ -518,21 +596,22 @@
 		}
 		addr += pmap_ptc_e_stride1;
 	}
-	intr_restore(psr);
+	critical_exit();
 }
 
 static void
 pmap_invalidate_all(pmap_t pmap)
 {
+
 	KASSERT((pmap == kernel_pmap || pmap == PCPU_GET(current_pmap)),
 		("invalidating TLB for non-current pmap"));
 
-
 #ifdef SMP
-	smp_rendezvous(0, pmap_invalidate_all_1, 0, 0);
-#else
-	pmap_invalidate_all_1(0);
+	if (mp_ncpus > 1)
+		smp_rendezvous(NULL, pmap_invalidate_all_1, NULL, NULL);
+	else
 #endif
+	pmap_invalidate_all_1(NULL);
 }
 
 static uint32_t
@@ -582,48 +661,7 @@
 	mtx_unlock(&pmap_ridmutex);
 }
 
-/***************************************************
- * Low level helper routines.....
- ***************************************************/
-
 /*
- * Install a pte into the VHPT
- */
-static PMAP_INLINE void
-pmap_install_pte(struct ia64_lpte *vhpte, struct ia64_lpte *pte)
-{
-	uint64_t *vhp, *p;
-
-	vhp = (uint64_t *)vhpte;
-	p = (uint64_t *)pte;
-
-	critical_enter();
-
-	/* Invalidate the tag so the VHPT walker will not match this entry. */
-	vhp[2] = 1UL << 63;
-	ia64_mf();
-
-	vhp[0] = p[0];
-	vhp[1] = p[1];
-	ia64_mf();
-
-	/* Install a proper tag now that we're done. */
-	vhp[2] = p[2];
-	ia64_mf();
-
-	critical_exit();
-}
-
-/*
- * Compare essential parts of pte.
- */
-static PMAP_INLINE int
-pmap_equal_pte(struct ia64_lpte *pte1, struct ia64_lpte *pte2)
-{
-	return *(uint64_t *) pte1 == *(uint64_t *) pte2;

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


More information about the p4-projects mailing list