PERFORCE change 67609 for review
John Baldwin
jhb at FreeBSD.org
Thu Dec 23 12:48:50 PST 2004
http://perforce.freebsd.org/chv.cgi?CH=67609
Change 67609 by jhb at jhb_slimer on 2004/12/23 20:48:47
IFC @67608. Loop back simple changes from jhb_clock.
Affected files ...
.. //depot/projects/smpng/sys/alpha/alpha/pmap.c#67 integrate
.. //depot/projects/smpng/sys/amd64/amd64/pmap.c#40 integrate
.. //depot/projects/smpng/sys/arm/arm/pmap.c#11 integrate
.. //depot/projects/smpng/sys/i386/i386/intr_machdep.c#12 integrate
.. //depot/projects/smpng/sys/i386/i386/local_apic.c#22 integrate
.. //depot/projects/smpng/sys/i386/i386/mp_machdep.c#78 integrate
.. //depot/projects/smpng/sys/i386/i386/pmap.c#80 integrate
.. //depot/projects/smpng/sys/i386/include/apicreg.h#3 integrate
.. //depot/projects/smpng/sys/i386/include/intr_machdep.h#5 integrate
.. //depot/projects/smpng/sys/ia64/ia64/pmap.c#67 integrate
.. //depot/projects/smpng/sys/powerpc/powerpc/pmap.c#49 integrate
.. //depot/projects/smpng/sys/sparc64/sparc64/pmap.c#55 integrate
.. //depot/projects/smpng/sys/vm/vm_fault.c#44 integrate
.. //depot/projects/smpng/sys/vm/vm_map.c#69 integrate
Differences ...
==== //depot/projects/smpng/sys/alpha/alpha/pmap.c#67 (text+ko) ====
@@ -148,7 +148,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/alpha/alpha/pmap.c,v 1.175 2004/12/15 19:55:03 alc Exp $");
+__FBSDID("$FreeBSD: src/sys/alpha/alpha/pmap.c,v 1.176 2004/12/23 20:16:09 alc Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -1799,7 +1799,6 @@
* 2. Not wired.
* 3. Read access.
* 4. No page table pages.
- * 5. Tlbflush is deferred to calling procedure.
* 6. Page IS managed.
* but is *MUCH* faster than pmap_enter...
*/
@@ -1810,7 +1809,8 @@
register pt_entry_t *pte;
int managed;
- vm_page_lock_queues();
+ mtx_assert(&vm_page_queue_mtx, MA_OWNED);
+ VM_OBJECT_LOCK_ASSERT(m->object, MA_OWNED);
PMAP_LOCK(pmap);
/*
@@ -1905,7 +1905,6 @@
*pte = pmap_phys_to_pte(VM_PAGE_TO_PHYS(m)) | PG_V | PG_KRE | PG_URE | managed;
out:
alpha_pal_imb(); /* XXX overkill? */
- vm_page_unlock_queues();
PMAP_UNLOCK(pmap);
return mpte;
}
==== //depot/projects/smpng/sys/amd64/amd64/pmap.c#40 (text+ko) ====
@@ -75,7 +75,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/amd64/amd64/pmap.c,v 1.513 2004/12/21 19:25:56 alc Exp $");
+__FBSDID("$FreeBSD: src/sys/amd64/amd64/pmap.c,v 1.514 2004/12/23 20:16:09 alc Exp $");
/*
* Manages physical address maps.
@@ -2007,7 +2007,6 @@
* 2. Not wired.
* 3. Read access.
* 4. No page table pages.
- * 5. Tlbflush is deferred to calling procedure.
* 6. Page IS managed.
* but is *MUCH* faster than pmap_enter...
*/
@@ -2018,7 +2017,8 @@
pt_entry_t *pte;
vm_paddr_t pa;
- vm_page_lock_queues();
+ mtx_assert(&vm_page_queue_mtx, MA_OWNED);
+ VM_OBJECT_LOCK_ASSERT(m->object, MA_OWNED);
PMAP_LOCK(pmap);
/*
@@ -2110,7 +2110,6 @@
else
pte_store(pte, pa | PG_V | PG_U | PG_MANAGED);
out:
- vm_page_unlock_queues();
PMAP_UNLOCK(pmap);
return mpte;
}
==== //depot/projects/smpng/sys/arm/arm/pmap.c#11 (text+ko) ====
@@ -147,7 +147,7 @@
#include "opt_vm.h"
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/arm/arm/pmap.c,v 1.21 2004/12/15 19:55:04 alc Exp $");
+__FBSDID("$FreeBSD: src/sys/arm/arm/pmap.c,v 1.22 2004/12/23 20:16:10 alc Exp $");
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/kernel.h>
@@ -3409,7 +3409,6 @@
* 2. Not wired.
* 3. Read access.
* 4. No page table pages.
- * 5. Tlbflush is deferred to calling procedure.
* 6. Page IS managed.
* but is *MUCH* faster than pmap_enter...
*/
@@ -3418,7 +3417,6 @@
pmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_page_t mpte)
{
- vm_page_lock_queues();
vm_page_busy(m);
vm_page_unlock_queues();
VM_OBJECT_UNLOCK(m->object);
@@ -3429,7 +3427,6 @@
VM_OBJECT_LOCK(m->object);
vm_page_lock_queues();
vm_page_wakeup(m);
- vm_page_unlock_queues();
return (NULL);
}
==== //depot/projects/smpng/sys/i386/i386/intr_machdep.c#12 (text+ko) ====
@@ -26,7 +26,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD: src/sys/i386/i386/intr_machdep.c,v 1.12 2004/12/06 22:25:01 ups Exp $
+ * $FreeBSD: src/sys/i386/i386/intr_machdep.c,v 1.13 2004/12/23 20:34:18 jhb Exp $
*/
/*
@@ -286,6 +286,17 @@
is->is_straycount = &intrcnt[is->is_index + 1];
}
+void
+intrcnt_add(const char *name, u_long **countp)
+{
+
+ mtx_lock_spin(&intr_table_lock);
+ *countp = &intrcnt[intrcnt_index];
+ intrcnt_setname(name, intrcnt_index);
+ intrcnt_index++;
+ mtx_unlock_spin(&intr_table_lock);
+}
+
static void
intr_init(void *dummy __unused)
{
==== //depot/projects/smpng/sys/i386/i386/local_apic.c#22 (text+ko) ====
@@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/i386/i386/local_apic.c,v 1.10 2004/12/23 19:47:58 jhb Exp $");
+__FBSDID("$FreeBSD: src/sys/i386/i386/local_apic.c,v 1.11 2004/12/23 20:42:53 jhb Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -97,10 +97,10 @@
static struct lvt lvts[LVT_MAX + 1] = {
{ 1, 1, 1, 1, APIC_LVT_DM_EXTINT, 0 }, /* LINT0: masked ExtINT */
{ 1, 1, 0, 1, APIC_LVT_DM_NMI, 0 }, /* LINT1: NMI */
- { 1, 1, 1, 1, APIC_LVT_DM_FIXED, 0 }, /* Timer: needs a vector */
- { 1, 1, 1, 1, APIC_LVT_DM_FIXED, 0 }, /* Error: needs a vector */
+ { 1, 1, 1, 1, APIC_LVT_DM_FIXED, APIC_TIMER_INT }, /* Timer */
+ { 1, 1, 1, 1, APIC_LVT_DM_FIXED, APIC_ERROR_INT }, /* Error */
{ 1, 1, 1, 1, APIC_LVT_DM_FIXED, 0 }, /* PMC */
- { 1, 1, 1, 1, APIC_LVT_DM_FIXED, 0 }, /* Thermal: needs a vector */
+ { 1, 1, 1, 1, APIC_LVT_DM_FIXED, APIC_THERMAL_INT }, /* Thermal */
};
static inthand_t *ioint_handlers[] = {
@@ -116,6 +116,9 @@
volatile lapic_t *lapic;
+static void lapic_enable(void);
+static uint32_t lvt_mode(struct lapic *la, u_int pin, uint32_t value);
+
static uint32_t
lvt_mode(struct lapic *la, u_int pin, uint32_t value)
{
@@ -149,11 +152,7 @@
/* Use a vector of 0. */
break;
case APIC_LVT_DM_FIXED:
-#if 0
value |= lvt->lvt_vector;
-#else
- panic("Fixed LINT pins not supported");
-#endif
break;
default:
panic("bad APIC LVT delivery mode: %#x\n", value);
@@ -167,7 +166,6 @@
void
lapic_init(uintptr_t addr)
{
- u_int32_t value;
/* Map the local APIC and setup the spurious interrupt handler. */
KASSERT(trunc_page(addr) == addr,
@@ -177,10 +175,7 @@
GSEL(GCODE_SEL, SEL_KPL));
/* Perform basic initialization of the BSP's local APIC. */
- value = lapic->svr;
- value &= ~(APIC_SVR_VECTOR | APIC_SVR_FOCUS);
- value |= (APIC_SVR_FEN | APIC_SVR_SWEN | APIC_SPURIOUS_INT);
- lapic->svr = value;
+ lapic_enable();
/* Set BSP's per-CPU local APIC ID. */
PCPU_SET(apic_id, lapic_id());
@@ -233,6 +228,9 @@
lapic->id, lapic->version, lapic->ldr, lapic->dfr);
printf(" lint0: 0x%08x lint1: 0x%08x TPR: 0x%08x SVR: 0x%08x\n",
lapic->lvt_lint0, lapic->lvt_lint1, lapic->tpr, lapic->svr);
+ printf(" timer: 0x%08x therm: 0x%08x err: 0x%08x pcm: 0x%08x\n",
+ lapic->lvt_timer, lapic->lvt_thermal, lapic->lvt_error,
+ lapic->lvt_pcint);
}
void
@@ -260,12 +258,6 @@
eflags = intr_disable();
maxlvt = (lapic->version & APIC_VER_MAXLVT) >> MAXLVTSHIFT;
- /* Program LINT[01] LVT entries. */
- lapic->lvt_lint0 = lvt_mode(la, LVT_LINT0, lapic->lvt_lint0);
- lapic->lvt_lint1 = lvt_mode(la, LVT_LINT1, lapic->lvt_lint1);
-
- /* XXX: more LVT entries */
-
/* Initialize the TPR to allow all interrupts. */
lapic_set_tpr(0);
@@ -283,10 +275,14 @@
lapic->ldr = value;
/* Setup spurious vector and enable the local APIC. */
- value = lapic->svr;
- value &= ~(APIC_SVR_VECTOR | APIC_SVR_FOCUS);
- value |= (APIC_SVR_FEN | APIC_SVR_SWEN | APIC_SPURIOUS_INT);
- lapic->svr = value;
+ lapic_enable();
+
+ /* Program LINT[01] LVT entries. */
+ lapic->lvt_lint0 = lvt_mode(la, LVT_LINT0, lapic->lvt_lint0);
+ lapic->lvt_lint1 = lvt_mode(la, LVT_LINT1, lapic->lvt_lint1);
+
+ /* XXX: more LVT entries */
+
intr_restore(eflags);
}
@@ -301,6 +297,18 @@
lapic->svr = value;
}
+static void
+lapic_enable(void)
+{
+ u_int32_t value;
+
+ /* Program the spurious vector to enable the local APIC. */
+ value = lapic->svr;
+ value &= ~(APIC_SVR_VECTOR | APIC_SVR_FOCUS);
+ value |= (APIC_SVR_FEN | APIC_SVR_SWEN | APIC_SPURIOUS_INT);
+ lapic->svr = value;
+}
+
int
lapic_id(void)
{
==== //depot/projects/smpng/sys/i386/i386/mp_machdep.c#78 (text+ko) ====
@@ -24,7 +24,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/i386/i386/mp_machdep.c,v 1.242 2004/12/07 20:15:01 ups Exp $");
+__FBSDID("$FreeBSD: src/sys/i386/i386/mp_machdep.c,v 1.243 2004/12/23 20:35:51 jhb Exp $");
#include "opt_apic.h"
#include "opt_cpu.h"
@@ -1135,8 +1135,8 @@
ipi_selected(map, IPI_HARDCLOCK);
}
-
-void ipi_bitmap_handler(struct clockframe frame)
+void
+ipi_bitmap_handler(struct clockframe frame)
{
int cpu = PCPU_GET(cpuid);
u_int ipi_bitmap;
@@ -1170,7 +1170,6 @@
critical_exit();
}
-
/*
* send an IPI to a set of cpus.
*/
==== //depot/projects/smpng/sys/i386/i386/pmap.c#80 (text+ko) ====
@@ -73,7 +73,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/i386/i386/pmap.c,v 1.519 2004/12/15 19:55:04 alc Exp $");
+__FBSDID("$FreeBSD: src/sys/i386/i386/pmap.c,v 1.520 2004/12/23 20:16:10 alc Exp $");
/*
* Manages physical address maps.
@@ -2050,7 +2050,6 @@
* 2. Not wired.
* 3. Read access.
* 4. No page table pages.
- * 5. Tlbflush is deferred to calling procedure.
* 6. Page IS managed.
* but is *MUCH* faster than pmap_enter...
*/
@@ -2061,7 +2060,8 @@
pt_entry_t *pte;
vm_paddr_t pa;
- vm_page_lock_queues();
+ mtx_assert(&vm_page_queue_mtx, MA_OWNED);
+ VM_OBJECT_LOCK_ASSERT(m->object, MA_OWNED);
PMAP_LOCK(pmap);
/*
@@ -2153,7 +2153,6 @@
else
pte_store(pte, pa | PG_V | PG_U | PG_MANAGED);
out:
- vm_page_unlock_queues();
PMAP_UNLOCK(pmap);
return mpte;
}
==== //depot/projects/smpng/sys/i386/include/apicreg.h#3 (text+ko) ====
@@ -22,7 +22,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD: src/sys/i386/include/apicreg.h,v 1.26 2003/12/10 21:33:07 jhb Exp $
+ * $FreeBSD: src/sys/i386/include/apicreg.h,v 1.27 2004/12/23 20:35:07 jhb Exp $
*/
#ifndef _MACHINE_APICREG_H_
@@ -330,8 +330,13 @@
#define APIC_LVTT_DS 0x00001000
#define APIC_LVTT_M 0x00010000
#define APIC_LVTT_TM 0x00020000
+# define APIC_LVTT_TM_ONE_SHOT 0x00000000
+# define APIC_LVTT_TM_PERIODIC 0x00020000
+/* APIC timer current count */
+#define APIC_TIMER_MAX_COUNT 0xffffffff
+
/* fields in TDCR */
#define APIC_TDCR_2 0x00
#define APIC_TDCR_4 0x01
==== //depot/projects/smpng/sys/i386/include/intr_machdep.h#5 (text+ko) ====
@@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD: src/sys/i386/include/intr_machdep.h,v 1.5 2004/08/02 15:31:10 scottl Exp $
+ * $FreeBSD: src/sys/i386/include/intr_machdep.h,v 1.6 2004/12/23 20:34:18 jhb Exp $
*/
#ifndef __MACHINE_INTR_MACHDEP_H__
@@ -100,6 +100,7 @@
int intr_remove_handler(void *cookie);
void intr_resume(void);
void intr_suspend(void);
+void intrcnt_add(const char *name, u_long **countp);
#endif /* !LOCORE */
#endif /* _KERNEL */
==== //depot/projects/smpng/sys/ia64/ia64/pmap.c#67 (text+ko) ====
@@ -46,7 +46,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/ia64/ia64/pmap.c,v 1.156 2004/12/15 19:55:04 alc Exp $");
+__FBSDID("$FreeBSD: src/sys/ia64/ia64/pmap.c,v 1.157 2004/12/23 20:16:10 alc Exp $");
#include <sys/param.h>
#include <sys/kernel.h>
@@ -1612,7 +1612,6 @@
* 2. Not wired.
* 3. Read access.
* 4. No page table pages.
- * 5. Tlbflush is deferred to calling procedure.
* 6. Page IS managed.
* but is *MUCH* faster than pmap_enter...
*/
@@ -1624,7 +1623,8 @@
pmap_t oldpmap;
boolean_t managed;
- vm_page_lock_queues();
+ mtx_assert(&vm_page_queue_mtx, MA_OWNED);
+ VM_OBJECT_LOCK_ASSERT(m->object, MA_OWNED);
PMAP_LOCK(pmap);
oldpmap = pmap_install(pmap);
@@ -1666,7 +1666,6 @@
pmap_set_pte(pte, va, VM_PAGE_TO_PHYS(m), FALSE, managed);
reinstall:
- vm_page_unlock_queues();
pmap_install(oldpmap);
PMAP_UNLOCK(pmap);
return (NULL);
==== //depot/projects/smpng/sys/powerpc/powerpc/pmap.c#49 (text+ko) ====
@@ -91,7 +91,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/powerpc/powerpc/pmap.c,v 1.91 2004/12/15 19:55:04 alc Exp $");
+__FBSDID("$FreeBSD: src/sys/powerpc/powerpc/pmap.c,v 1.92 2004/12/23 20:16:11 alc Exp $");
/*
* Manages physical address maps.
@@ -1048,7 +1048,6 @@
pmap_enter_quick(pmap_t pm, vm_offset_t va, vm_page_t m, vm_page_t mpte)
{
- vm_page_lock_queues();
vm_page_busy(m);
vm_page_unlock_queues();
VM_OBJECT_UNLOCK(m->object);
@@ -1058,7 +1057,6 @@
VM_OBJECT_LOCK(m->object);
vm_page_lock_queues();
vm_page_wakeup(m);
- vm_page_unlock_queues();
return (NULL);
}
==== //depot/projects/smpng/sys/sparc64/sparc64/pmap.c#55 (text+ko) ====
@@ -39,7 +39,7 @@
* SUCH DAMAGE.
*
* from: @(#)pmap.c 7.7 (Berkeley) 5/12/91
- * $FreeBSD: src/sys/sparc64/sparc64/pmap.c,v 1.142 2004/12/15 19:55:05 alc Exp $
+ * $FreeBSD: src/sys/sparc64/sparc64/pmap.c,v 1.143 2004/12/23 20:16:11 alc Exp $
*/
/*
@@ -1401,7 +1401,6 @@
pmap_enter_quick(pmap_t pm, vm_offset_t va, vm_page_t m, vm_page_t mpte)
{
- vm_page_lock_queues();
vm_page_busy(m);
vm_page_unlock_queues();
VM_OBJECT_UNLOCK(m->object);
@@ -1411,7 +1410,6 @@
VM_OBJECT_LOCK(m->object);
vm_page_lock_queues();
vm_page_wakeup(m);
- vm_page_unlock_queues();
return (NULL);
}
==== //depot/projects/smpng/sys/vm/vm_fault.c#44 (text+ko) ====
@@ -72,7 +72,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/vm/vm_fault.c,v 1.199 2004/12/15 19:55:05 alc Exp $");
+__FBSDID("$FreeBSD: src/sys/vm/vm_fault.c,v 1.200 2004/12/23 20:16:11 alc Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -977,12 +977,11 @@
(m->busy == 0) &&
(m->flags & (PG_BUSY | PG_FICTITIOUS)) == 0) {
- if ((m->queue - m->pc) == PQ_CACHE) {
- vm_page_lock_queues();
+ vm_page_lock_queues();
+ if ((m->queue - m->pc) == PQ_CACHE)
vm_page_deactivate(m);
- vm_page_unlock_queues();
- }
mpte = pmap_enter_quick(pmap, addr, m, mpte);
+ vm_page_unlock_queues();
}
VM_OBJECT_UNLOCK(lobject);
}
==== //depot/projects/smpng/sys/vm/vm_map.c#69 (text+ko) ====
@@ -63,7 +63,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/vm/vm_map.c,v 1.362 2004/12/15 19:55:05 alc Exp $");
+__FBSDID("$FreeBSD: src/sys/vm/vm_map.c,v 1.363 2004/12/23 20:16:11 alc Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -1369,6 +1369,7 @@
vm_offset_t tmpidx;
int psize;
vm_page_t p, mpte;
+ boolean_t are_queues_locked;
if ((prot & VM_PROT_READ) == 0 || object == NULL)
return;
@@ -1392,6 +1393,7 @@
psize = object->size - pindex;
}
+ are_queues_locked = FALSE;
mpte = NULL;
if ((p = TAILQ_FIRST(&object->memq)) != NULL) {
@@ -1420,15 +1422,18 @@
if ((p->valid & VM_PAGE_BITS_ALL) == VM_PAGE_BITS_ALL &&
(p->busy == 0) &&
(p->flags & (PG_BUSY | PG_FICTITIOUS)) == 0) {
- if ((p->queue - p->pc) == PQ_CACHE) {
+ if (!are_queues_locked) {
+ are_queues_locked = TRUE;
vm_page_lock_queues();
+ }
+ if ((p->queue - p->pc) == PQ_CACHE)
vm_page_deactivate(p);
- vm_page_unlock_queues();
- }
mpte = pmap_enter_quick(map->pmap,
addr + ptoa(tmpidx), p, mpte);
}
}
+ if (are_queues_locked)
+ vm_page_unlock_queues();
unlock_return:
VM_OBJECT_UNLOCK(object);
}
More information about the p4-projects
mailing list