Date: Sun, 7 Aug 2005 14:29:43 GMT From: Robert Watson <rwatson@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 81598 for review Message-ID: <200508071429.j77ETh7N092900@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=81598 Change 81598 by rwatson@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) <<<
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200508071429.j77ETh7N092900>