PERFORCE change 119026 for review

Ulf Lilleengen lulf at FreeBSD.org
Mon Apr 30 21:30:10 UTC 2007


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

Change 119026 by lulf at lulf_vimes on 2007/04/30 21:29:55

	- Add gv_set_vol_state.
	- Use the event-system when saving the state.

Affected files ...

.. //depot/projects/soc2007/lulf/gvinum_fixup/sys/conf/files#3 integrate
.. //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/part/g_part.c#2 integrate
.. //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/uzip/g_uzip.c#2 integrate
.. //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_state.c#5 edit
.. //depot/projects/soc2007/lulf/gvinum_fixup/sys/i386/i386/local_apic.c#2 integrate
.. //depot/projects/soc2007/lulf/gvinum_fixup/sys/i386/i386/pmap.c#2 integrate
.. //depot/projects/soc2007/lulf/gvinum_fixup/sys/i386/i386/sys_machdep.c#2 integrate
.. //depot/projects/soc2007/lulf/gvinum_fixup/sys/i386/i386/vm_machdep.c#2 integrate
.. //depot/projects/soc2007/lulf/gvinum_fixup/sys/kern/kern_descrip.c#2 integrate
.. //depot/projects/soc2007/lulf/gvinum_fixup/sys/kern/kern_linker.c#2 integrate
.. //depot/projects/soc2007/lulf/gvinum_fixup/sys/kern/kern_time.c#2 integrate
.. //depot/projects/soc2007/lulf/gvinum_fixup/sys/kern/kern_uuid.c#2 integrate
.. //depot/projects/soc2007/lulf/gvinum_fixup/sys/kern/subr_rman.c#3 integrate
.. //depot/projects/soc2007/lulf/gvinum_fixup/sys/kern/vfs_bio.c#2 integrate
.. //depot/projects/soc2007/lulf/gvinum_fixup/sys/kern/vfs_mount.c#3 integrate
.. //depot/projects/soc2007/lulf/gvinum_fixup/sys/sys/ioctl_compat.h#2 integrate
.. //depot/projects/soc2007/lulf/gvinum_fixup/sys/sys/mount.h#3 integrate
.. //depot/projects/soc2007/lulf/gvinum_fixup/sys/sys/priv.h#3 integrate
.. //depot/projects/soc2007/lulf/gvinum_fixup/sys/sys/proc.h#2 integrate
.. //depot/projects/soc2007/lulf/gvinum_fixup/sys/vm/swap_pager.c#2 integrate
.. //depot/projects/soc2007/lulf/gvinum_fixup/sys/vm/vm_map.c#2 integrate

Differences ...

==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/conf/files#3 (text+ko) ====

@@ -1,4 +1,4 @@
-# $FreeBSD: src/sys/conf/files,v 1.1196 2007/04/17 00:35:10 thompsa Exp $
+# $FreeBSD: src/sys/conf/files,v 1.1198 2007/04/25 15:30:17 mav Exp $
 #
 # The long compile-with and dependency lines are required because of
 # limitations in config: backslash-newline doesn't work in strings, and
@@ -1550,8 +1550,8 @@
 net/if_mib.c			standard
 net/if_ppp.c			optional ppp
 net/if_sl.c			optional sl
-net/if_spppfr.c			optional i4bisppp | sppp
-net/if_spppsubr.c		optional i4bisppp | sppp
+net/if_spppfr.c			optional i4bisppp | sppp | netgraph_sppp
+net/if_spppsubr.c		optional i4bisppp | sppp | netgraph_sppp
 net/if_stf.c			optional stf
 net/if_tun.c			optional tun
 net/if_tap.c			optional tap
@@ -1565,9 +1565,10 @@
 net/raw_usrreq.c		standard
 net/route.c			standard
 net/rtsock.c			standard
-net/slcompress.c		optional netgraph_vjc | ppp | sl | sppp
+net/slcompress.c		optional netgraph_vjc | ppp | sl | sppp | \
+					 netgraph_sppp
 net/zlib.c			optional crypto | geom_uzip | ipsec | \
-					 ppp_deflate
+					 ppp_deflate | netgraph_deflate
 net80211/ieee80211.c		optional wlan
 net80211/ieee80211_acl.c	optional wlan_acl
 net80211/ieee80211_amrr.c	optional wlan_amrr
@@ -1800,11 +1801,11 @@
 netinet/tcp_timer.c		optional inet
 netinet/tcp_usrreq.c		optional inet
 netinet/udp_usrreq.c		optional inet
-netinet/libalias/alias.c	optional libalias
-netinet/libalias/alias_db.c	optional libalias
-netinet/libalias/alias_mod.c	optional libalias
-netinet/libalias/alias_proxy.c	optional libalias
-netinet/libalias/alias_util.c	optional libalias
+netinet/libalias/alias.c	optional libalias | netgraph_nat
+netinet/libalias/alias_db.c	optional libalias | netgraph_nat
+netinet/libalias/alias_mod.c	optional libalias | netgraph_nat
+netinet/libalias/alias_proxy.c	optional libalias | netgraph_nat
+netinet/libalias/alias_util.c	optional libalias | netgraph_nat
 netinet6/ah_aesxcbcmac.c	optional ipsec
 netinet6/ah_core.c		optional ipsec
 netinet6/ah_input.c		optional ipsec
@@ -1957,6 +1958,7 @@
 security/audit/audit_syscalls.c	standard
 security/audit/audit_trigger.c	optional audit
 security/audit/audit_worker.c	optional audit
+security/mac/mac_audit.c	optional mac audit
 security/mac/mac_framework.c	optional mac
 security/mac/mac_inet.c		optional mac inet
 security/mac/mac_label.c	optional mac

==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/part/g_part.c#2 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/geom/part/g_part.c,v 1.1 2007/02/07 18:55:30 marcel Exp $");
+__FBSDID("$FreeBSD: src/sys/geom/part/g_part.c,v 1.2 2007/04/27 05:58:10 marcel Exp $");
 
 #include <sys/param.h>
 #include <sys/bio.h>
@@ -52,7 +52,7 @@
 };
 
 static struct g_part_scheme g_part_null_scheme = {
-	NULL,
+	"n/a",
 	g_part_null_methods,
 	sizeof(struct g_part_table),
 };
@@ -1249,6 +1249,8 @@
 		    (uintmax_t)pp->mediasize);
 		G_PART_DUMPCONF(table, entry, sb, indent);
 	} else {			/* Geom configuration. */
+		sbuf_printf(sb, "%s<scheme>%s</scheme>\n", indent,
+		    table->gpt_scheme->name);
 		sbuf_printf(sb, "%s<entries>%u</entries>\n", indent,
 		    table->gpt_entries);
 		sbuf_printf(sb, "%s<first>%ju</first>\n", indent,

==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/uzip/g_uzip.c#2 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/geom/uzip/g_uzip.c,v 1.11 2007/04/07 02:52:13 simokawa Exp $");
+__FBSDID("$FreeBSD: src/sys/geom/uzip/g_uzip.c,v 1.12 2007/04/24 06:30:06 simokawa Exp $");
 
 #include <sys/param.h>
 #include <sys/bio.h>
@@ -162,6 +162,13 @@
 		ulen = MIN(sc->blksz - uoff, bp2->bio_length - upos);
 		len = sc->offsets[i + 1] - sc->offsets[i];
 
+		if (len == 0) {
+			/* All zero block: no cache update */
+			bzero(bp2->bio_data + upos, ulen);
+			upos += ulen;
+			bp2->bio_completed += ulen;
+			continue;
+		}
 		zs.next_in = bp->bio_data + pos;
 		zs.avail_in = len;
 		zs.next_out = sc->last_buf;

==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_state.c#5 (text+ko) ====

@@ -72,8 +72,21 @@
 	type = gv_object_type(sc, obj);
 	switch (type) {
 	case GV_TYPE_VOL:
+		if (gv_volstatei(state) < 0) {
+			gctl_error(req, "invalid volume state '%s'", state);
+			break;
+		}
+		v = gv_find_vol(sc, obj);
+
+		newstatep = g_malloc(sizeof(int), M_WAITOK | M_ZERO);
+		*newstatep = gv_volstatei(state);
+		flagp = g_malloc(sizeof(int), M_WAITOK | M_ZERO);
+		*flagp = f;
+		gv_post_event(sc, GV_EVENT_SET_VOL_STATE, v, newstatep, flagp);
+		break;
+
 	case GV_TYPE_PLEX:
-		gctl_error(req, "volume or plex state cannot be set currently");
+		gctl_error(req, "plex state cannot be set currently");
 		break;
 
 	case GV_TYPE_SD:
@@ -142,7 +155,7 @@
 
 	/* Save the config back to disk. */
 	if (flags & GV_SETSTATE_CONFIG)
-		gv_save_config(d->vinumconf);
+		gv_post_event(sc, GV_EVENT_SAVE_CONFIG, v->vinumconf, NULL, NULL);
 
 	return (0);
 }
@@ -257,11 +270,45 @@
 
 	/* Save the config back to disk. */
 	if (flags & GV_SETSTATE_CONFIG)
-		gv_save_config(s->vinumconf);
+		gv_post_event(sc, GV_EVENT_SAVE_CONFIG, v->vinumconf, NULL, NULL);
 
 	return (status);
 }
 
+int
+gv_set_vol_state(struct gv_volume *v, int newstate, int flags)
+{
+	int oldstate;
+
+	KASSERT(v != NULL, ("gv_set_vol_state: NULL v"));
+
+	oldstate = v->state;
+
+	if (newstate == oldstate)
+		return (0);
+
+	switch (newstate) {
+	case GV_VOL_UP:
+		/* Let update handle if the volume can come up. */
+		gv_update_vol_state(v);
+		if (v->state != GV_VOL_UP && flags & GV_SETSTATE_FORCE)
+			v->state = newstate;
+		break;
+	case GV_VOL_DOWN:
+		/*
+		 * Set state to GV_VOL_DOWN only if noone is using the volume,
+		 * or if the state should be forced.
+		 */
+		if ((gv_is_open(v->geom) != 0) &&
+		    !(flags & GV_SETSTATE_FORCE))
+			return (-1); /* XXX: ERROR CODES. */
+		v->state = newstate;
+		break;
+	}
+	/* Save config */
+	if (flags & GV_SETSTATE_CONFIG)
+		gv_post_event(sc, GV_EVENT_SAVE_CONFIG, v->vinumconf, NULL, NULL);
+}
 
 /* Update the state of a subdisk based on its environment. */
 void

==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/i386/i386/local_apic.c#2 (text+ko) ====

@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/i386/i386/local_apic.c,v 1.39 2007/03/20 21:53:31 jhb Exp $");
+__FBSDID("$FreeBSD: src/sys/i386/i386/local_apic.c,v 1.40 2007/04/25 19:58:42 ariff Exp $");
 
 #include "opt_hwpmc_hooks.h"
 
@@ -328,6 +328,29 @@
 
 	/* XXX: Error and thermal LVTs */
 
+	if (strcmp(cpu_vendor, "AuthenticAMD") == 0) {
+		/*
+		 * Detect the presence of C1E capability mostly on latest
+		 * dual-cores (or future) k8 family.  This feature renders
+		 * the local APIC timer dead, so we disable it by reading
+		 * the Interrupt Pending Message register and clearing both
+		 * C1eOnCmpHalt (bit 28) and SmiOnCmpHalt (bit 27).
+		 * 
+		 * Reference:
+		 *   "BIOS and Kernel Developer's Guide for AMD NPT
+		 *    Family 0Fh Processors"
+		 *   #32559 revision 3.00
+		 */
+		if ((cpu_id & 0x00000f00) == 0x00000f00 &&
+		    (cpu_id & 0x0fff0000) >=  0x00040000) {
+			uint64_t msr;
+
+			msr = rdmsr(0xc0010055);
+			if (msr & 0x18000000)
+				wrmsr(0xc0010055, msr & ~0x18000000ULL);
+		}
+	}
+
 	intr_restore(eflags);
 }
 

==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/i386/i386/pmap.c#2 (text+ko) ====

@@ -75,7 +75,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/i386/i386/pmap.c,v 1.587 2007/04/13 16:07:29 alc Exp $");
+__FBSDID("$FreeBSD: src/sys/i386/i386/pmap.c,v 1.589 2007/04/25 18:10:44 ups Exp $");
 
 /*
  *	Manages physical address maps.
@@ -269,7 +269,8 @@
 
 static vm_page_t pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va,
     vm_page_t m, vm_prot_t prot, vm_page_t mpte);
-static int pmap_remove_pte(pmap_t pmap, pt_entry_t *ptq, vm_offset_t sva);
+static int pmap_remove_pte(pmap_t pmap, pt_entry_t *ptq, vm_offset_t sva,
+    vm_page_t *free);
 static void pmap_remove_page(struct pmap *pmap, vm_offset_t va);
 static void pmap_remove_entry(struct pmap *pmap, vm_page_t m,
 					vm_offset_t va);
@@ -280,10 +281,10 @@
 static vm_page_t pmap_allocpte(pmap_t pmap, vm_offset_t va, int flags);
 
 static vm_page_t _pmap_allocpte(pmap_t pmap, unsigned ptepindex, int flags);
-static int _pmap_unwire_pte_hold(pmap_t pmap, vm_page_t m);
+static int _pmap_unwire_pte_hold(pmap_t pmap, vm_page_t m, vm_page_t *free);
 static pt_entry_t *pmap_pte_quick(pmap_t pmap, vm_offset_t va);
 static void pmap_pte_release(pt_entry_t *pte);
-static int pmap_unuse_pt(pmap_t, vm_offset_t);
+static int pmap_unuse_pt(pmap_t, vm_offset_t, vm_page_t *);
 static vm_offset_t pmap_kmem_choose(vm_offset_t addr);
 #ifdef PAE
 static void *pmap_pdpt_allocf(uma_zone_t zone, int bytes, u_int8_t *flags, int wait);
@@ -1129,24 +1130,35 @@
 /***************************************************
  * Page table page management routines.....
  ***************************************************/
+static PMAP_INLINE void
+pmap_free_zero_pages(vm_page_t free)
+{
+	vm_page_t m;
 
+	while (free != NULL) {
+		m = free;
+		free = m->right;
+		vm_page_free_zero(m);
+	}
+}
+
 /*
  * This routine unholds page table pages, and if the hold count
  * drops to zero, then it decrements the wire count.
  */
 static PMAP_INLINE int
-pmap_unwire_pte_hold(pmap_t pmap, vm_page_t m)
+pmap_unwire_pte_hold(pmap_t pmap, vm_page_t m, vm_page_t *free)
 {
 
 	--m->wire_count;
 	if (m->wire_count == 0)
-		return _pmap_unwire_pte_hold(pmap, m);
+		return _pmap_unwire_pte_hold(pmap, m, free);
 	else
 		return 0;
 }
 
 static int 
-_pmap_unwire_pte_hold(pmap_t pmap, vm_page_t m)
+_pmap_unwire_pte_hold(pmap_t pmap, vm_page_t m, vm_page_t *free)
 {
 	vm_offset_t pteva;
 
@@ -1156,6 +1168,8 @@
 	pmap->pm_pdir[m->pindex] = 0;
 	--pmap->pm_stats.resident_count;
 
+	atomic_subtract_int(&cnt.v_wire_count, 1);
+
 	/*
 	 * Do an invltlb to make the invalidated mapping
 	 * take effect immediately.
@@ -1163,8 +1177,13 @@
 	pteva = VM_MAXUSER_ADDRESS + i386_ptob(m->pindex);
 	pmap_invalidate_page(pmap, pteva);
 
-	vm_page_free_zero(m);
-	atomic_subtract_int(&cnt.v_wire_count, 1);
+	/* 
+	 * Put page on a list so that it is released after
+	 * *ALL* TLB shootdown is done
+	 */
+	m->right = *free;
+	*free = m;
+
 	return 1;
 }
 
@@ -1173,7 +1192,7 @@
  * conditionally free the page, and manage the hold/wire counts.
  */
 static int
-pmap_unuse_pt(pmap_t pmap, vm_offset_t va)
+pmap_unuse_pt(pmap_t pmap, vm_offset_t va, vm_page_t *free)
 {
 	pd_entry_t ptepde;
 	vm_page_t mpte;
@@ -1182,7 +1201,7 @@
 		return 0;
 	ptepde = *pmap_pde(pmap, va);
 	mpte = PHYS_TO_VM_PAGE(ptepde & PG_FRAME);
-	return pmap_unwire_pte_hold(pmap, mpte);
+	return pmap_unwire_pte_hold(pmap, mpte, free);
 }
 
 void
@@ -1683,7 +1702,7 @@
 	pt_entry_t *pte, tpte;
 	pv_entry_t next_pv, pv;
 	vm_offset_t va;
-	vm_page_t m;
+	vm_page_t m, free;
 
 	sched_pin();
 	TAILQ_FOREACH(m, &vpq->pl, pageq) {
@@ -1710,12 +1729,14 @@
 				    va, (uintmax_t)tpte));
 				vm_page_dirty(m);
 			}
+			free = NULL;
+			pmap_unuse_pt(pmap, va, &free);
 			pmap_invalidate_page(pmap, va);
+			pmap_free_zero_pages(free);
 			TAILQ_REMOVE(&m->md.pv_list, pv, pv_list);
 			if (TAILQ_EMPTY(&m->md.pv_list))
 				vm_page_flag_clear(m, PG_WRITEABLE);
 			m->md.pv_list_count--;
-			pmap_unuse_pt(pmap, va);
 			free_pv_entry(pmap, pv);
 			if (pmap != locked_pmap)
 				PMAP_UNLOCK(pmap);
@@ -1930,7 +1951,7 @@
  * pmap_remove_pte: do the things to unmap a page in a process
  */
 static int
-pmap_remove_pte(pmap_t pmap, pt_entry_t *ptq, vm_offset_t va)
+pmap_remove_pte(pmap_t pmap, pt_entry_t *ptq, vm_offset_t va, vm_page_t *free)
 {
 	pt_entry_t oldpte;
 	vm_page_t m;
@@ -1959,7 +1980,7 @@
 			vm_page_flag_set(m, PG_REFERENCED);
 		pmap_remove_entry(pmap, m, va);
 	}
-	return (pmap_unuse_pt(pmap, va));
+	return (pmap_unuse_pt(pmap, va, free));
 }
 
 /*
@@ -1969,14 +1990,16 @@
 pmap_remove_page(pmap_t pmap, vm_offset_t va)
 {
 	pt_entry_t *pte;
+	vm_page_t free = NULL;
 
 	mtx_assert(&vm_page_queue_mtx, MA_OWNED);
 	KASSERT(curthread->td_pinned > 0, ("curthread not pinned"));
 	PMAP_LOCK_ASSERT(pmap, MA_OWNED);
 	if ((pte = pmap_pte_quick(pmap, va)) == NULL || *pte == 0)
 		return;
-	pmap_remove_pte(pmap, pte, va);
+	pmap_remove_pte(pmap, pte, va, &free);
 	pmap_invalidate_page(pmap, va);
+	pmap_free_zero_pages(free);
 }
 
 /*
@@ -1991,6 +2014,7 @@
 	vm_offset_t pdnxt;
 	pd_entry_t ptpaddr;
 	pt_entry_t *pte;
+	vm_page_t free = NULL;
 	int anyvalid;
 
 	/*
@@ -2065,15 +2089,17 @@
 			 */
 			if ((*pte & PG_G) == 0)
 				anyvalid = 1;
-			if (pmap_remove_pte(pmap, pte, sva))
+			if (pmap_remove_pte(pmap, pte, sva, &free))
 				break;
 		}
 	}
 out:
 	sched_unpin();
+	if (anyvalid) {
+		pmap_invalidate_all(pmap);
+		pmap_free_zero_pages(free);
+	}
 	vm_page_unlock_queues();
-	if (anyvalid)
-		pmap_invalidate_all(pmap);
 	PMAP_UNLOCK(pmap);
 }
 
@@ -2096,6 +2122,7 @@
 	pv_entry_t pv;
 	pmap_t pmap;
 	pt_entry_t *pte, tpte;
+	vm_page_t free;
 
 #if defined(PMAP_DIAGNOSTIC)
 	/*
@@ -2128,10 +2155,12 @@
 			    pv->pv_va, (uintmax_t)tpte));
 			vm_page_dirty(m);
 		}
+		free = NULL;
+		pmap_unuse_pt(pmap, pv->pv_va, &free);
 		pmap_invalidate_page(pmap, pv->pv_va);
+		pmap_free_zero_pages(free);
 		TAILQ_REMOVE(&m->md.pv_list, pv, pv_list);
 		m->md.pv_list_count--;
-		pmap_unuse_pt(pmap, pv->pv_va);
 		free_pv_entry(pmap, pv);
 		PMAP_UNLOCK(pmap);
 	}
@@ -2254,9 +2283,9 @@
 		}
 	}
 	sched_unpin();
-	vm_page_unlock_queues();
 	if (anychanged)
 		pmap_invalidate_all(pmap);
+	vm_page_unlock_queues();
 	PMAP_UNLOCK(pmap);
 }
 
@@ -2515,6 +2544,7 @@
 {
 	pt_entry_t *pte;
 	vm_paddr_t pa;
+	vm_page_t free;
 
 	KASSERT(va < kmi.clean_sva || va >= kmi.clean_eva ||
 	    (m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) != 0,
@@ -2571,7 +2601,7 @@
 	pte = vtopte(va);
 	if (*pte) {
 		if (mpte != NULL) {
-			pmap_unwire_pte_hold(pmap, mpte);
+			mpte->wire_count--;
 			mpte = NULL;
 		}
 		return (mpte);
@@ -2583,7 +2613,12 @@
 	if ((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0 &&
 	    !pmap_try_insert_pv_entry(pmap, va, m)) {
 		if (mpte != NULL) {
-			pmap_unwire_pte_hold(pmap, mpte);
+			free = NULL;
+			if (pmap_unwire_pte_hold(pmap, mpte, &free)) {
+				pmap_invalidate_page(pmap, va);
+				pmap_free_zero_pages(free);
+			}
+			
 			mpte = NULL;
 		}
 		return (mpte);
@@ -2740,6 +2775,7 @@
 pmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vm_offset_t dst_addr, vm_size_t len,
 	  vm_offset_t src_addr)
 {
+	vm_page_t   free;
 	vm_offset_t addr;
 	vm_offset_t end_addr = src_addr + len;
 	vm_offset_t pdnxt;
@@ -2816,8 +2852,15 @@
 					*dst_pte = ptetemp & ~(PG_W | PG_M |
 					    PG_A);
 					dst_pmap->pm_stats.resident_count++;
-	 			} else
-					pmap_unwire_pte_hold(dst_pmap, dstmpte);
+	 			} else {
+					free = NULL;
+					if (pmap_unwire_pte_hold( dst_pmap,
+					    dstmpte, &free)) {
+						pmap_invalidate_page(dst_pmap,
+						    addr);
+						pmap_free_zero_pages(free);
+					}
+				}
 				if (dstmpte->wire_count >= srcmpte->wire_count)
 					break;
 			}
@@ -2985,7 +3028,7 @@
 pmap_remove_pages(pmap_t pmap)
 {
 	pt_entry_t *pte, tpte;
-	vm_page_t m;
+	vm_page_t m, free = NULL;
 	pv_entry_t pv;
 	struct pv_chunk *pc, *npc;
 	int field, idx;
@@ -3059,7 +3102,7 @@
 				if (TAILQ_EMPTY(&m->md.pv_list))
 					vm_page_flag_clear(m, PG_WRITEABLE);
 
-				pmap_unuse_pt(pmap, pv->pv_va);
+				pmap_unuse_pt(pmap, pv->pv_va, &free);
 			}
 		}
 		if (allfree) {
@@ -3075,8 +3118,9 @@
 		}
 	}
 	sched_unpin();
+	pmap_invalidate_all(pmap);
+	pmap_free_zero_pages(free);
 	vm_page_unlock_queues();
-	pmap_invalidate_all(pmap);
 	PMAP_UNLOCK(pmap);
 }
 

==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/i386/i386/sys_machdep.c#2 (text+ko) ====

@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/i386/i386/sys_machdep.c,v 1.107 2006/11/06 13:41:59 rwatson Exp $");
+__FBSDID("$FreeBSD: src/sys/i386/i386/sys_machdep.c,v 1.108 2007/04/22 15:31:21 rwatson Exp $");
 
 #include "opt_kstack_pages.h"
 #include "opt_mac.h"
@@ -57,7 +57,6 @@
 #include <machine/sysarch.h>
 
 #include <security/audit/audit.h>
-#include <security/mac/mac_framework.h>
 
 #include <vm/vm_kern.h>		/* for kernel_map */
 
@@ -289,10 +288,6 @@
 	int i, error;
 	char *iomap;
 
-#ifdef MAC
-	if ((error = mac_check_sysarch_ioperm(td->td_ucred)) != 0)
-		return (error);
-#endif
 	if ((error = priv_check(td, PRIV_IO)) != 0)
 		return (error);
 	if ((error = securelevel_gt(td->td_ucred, 0)) != 0)

==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/i386/i386/vm_machdep.c#2 (text+ko) ====

@@ -41,7 +41,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/i386/i386/vm_machdep.c,v 1.276 2007/03/05 21:40:10 alc Exp $");
+__FBSDID("$FreeBSD: src/sys/i386/i386/vm_machdep.c,v 1.279 2007/04/24 21:17:45 jhb Exp $");
 
 #include "opt_isa.h"
 #include "opt_npx.h"
@@ -590,6 +590,7 @@
 static void
 cpu_reset_real()
 {
+	struct region_descriptor null_idt;
 #ifndef PC98
 	int b;
 #endif
@@ -625,14 +626,26 @@
 	outb(IO_KBD + 4, 0xFE);
 	DELAY(500000);	/* wait 0.5 sec to see if that did it */
 #endif
-	/* Try the PCI reset */
+
+	/*
+	 * Attempt to force a reset via the Reset Control register at
+	 * I/O port 0xcf9.  Bit 2 forces a system reset when it is
+	 * written as 1.  Bit 1 selects the type of reset to attempt:
+	 * 0 selects a "soft" reset, and 1 selects a "hard" reset.  We
+	 * try to do a "soft" reset first, and then a "hard" reset.
+	 */
 	outb(0xcf9, 0x2);
 	outb(0xcf9, 0x6);
 	DELAY(500000);  /* wait 0.5 sec to see if that did it */
 
-	/* Try port 0x92 fast reset */
+	/*
+	 * Attempt to force a reset via the Fast A20 and Init register
+	 * at I/O port 0x92.  Bit 1 serves as an alternate A20 gate.
+	 * Bit 0 asserts INIT# when set to 1.  We are careful to only
+	 * preserve bit 1 while setting bit 0.  We also must clear bit
+	 * 0 before setting it if it isn't already clear.
+	 */
 	b = inb(0x92);
-	/* Check the the hardware actually has the port in question */
 	if (b != 0xff) {
 		if ((b & 0x1) != 0)
 			outb(0x92, b & 0xfe);
@@ -641,14 +654,17 @@
 	}
 #endif /* PC98 */
 
-	printf("No known reset method did work, attempting CPU shutdown\n");
+	printf("No known reset method worked, attempting CPU shutdown\n");
 	DELAY(1000000); /* wait 1 sec for printf to complete */
 
-	/* Force a shutdown by unmapping entire address space. */
-	bzero((caddr_t)PTD, NBPTD);
+	/* Wipe the IDT. */
+	null_idt.rd_limit = 0;
+	null_idt.rd_base = 0;
+	lidt(&null_idt);
 
 	/* "good night, sweet prince .... <THUNK!>" */
-	invltlb();
+	breakpoint();
+
 	/* NOTREACHED */
 	while(1);
 }

==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/kern/kern_descrip.c#2 (text+ko) ====

@@ -35,7 +35,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/kern_descrip.c,v 1.307 2007/04/04 09:11:32 rwatson Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/kern_descrip.c,v 1.308 2007/04/26 18:01:19 jhb Exp $");
 
 #include "opt_compat.h"
 #include "opt_ddb.h"
@@ -1813,11 +1813,9 @@
 int
 fdcheckstd(struct thread *td)
 {
-	struct nameidata nd;
 	struct filedesc *fdp;
-	struct file *fp;
-	register_t retval;
-	int fd, i, error, flags, devnull;
+	register_t retval, save;
+	int i, error, devnull;
 
 	fdp = td->td_proc->p_fd;
 	if (fdp == NULL)
@@ -1829,48 +1827,14 @@
 		if (fdp->fd_ofiles[i] != NULL)
 			continue;
 		if (devnull < 0) {
-			int vfslocked;
-			error = falloc(td, &fp, &fd);
-			if (error != 0)
-				break;
-			/* Note extra ref on `fp' held for us by falloc(). */
-			KASSERT(fd == i, ("oof, we didn't get our fd"));
-			NDINIT(&nd, LOOKUP, FOLLOW | MPSAFE, UIO_SYSSPACE,
-			    "/dev/null", td);
-			flags = FREAD | FWRITE;
-			error = vn_open(&nd, &flags, 0, fd);
-			if (error != 0) {
-				/*
-				 * Someone may have closed the entry in the
-				 * file descriptor table, so check it hasn't
-				 * changed before dropping the reference
-				 * count.
-				 */
-				FILEDESC_XLOCK(fdp);
-				KASSERT(fdp->fd_ofiles[fd] == fp,
-				    ("table not shared, how did it change?"));
-				fdp->fd_ofiles[fd] = NULL;
-				fdunused(fdp, fd);
-				FILEDESC_XUNLOCK(fdp);
-				fdrop(fp, td);
-				fdrop(fp, td);
+			save = td->td_retval[0];
+			error = kern_open(td, "/dev/null", UIO_SYSSPACE,
+			    O_RDWR, 0);
+			devnull = td->td_retval[0];
+			KASSERT(devnull == i, ("oof, we didn't get our fd"));
+			td->td_retval[0] = save;
+			if (error)
 				break;
-			}
-			vfslocked = NDHASGIANT(&nd);
-			NDFREE(&nd, NDF_ONLY_PNBUF);
-			FILE_LOCK(fp);
-			fp->f_flag = flags;
-			fp->f_vnode = nd.ni_vp;
-			if (fp->f_data == NULL)
-				fp->f_data = nd.ni_vp;
-			fp->f_type = DTYPE_VNODE;
-			if (fp->f_ops == &badfileops)
-				fp->f_ops = &vnops;
-			FILE_UNLOCK(fp);
-			VOP_UNLOCK(nd.ni_vp, 0, td);
-			VFS_UNLOCK_GIANT(vfslocked);
-			devnull = fd;
-			fdrop(fp, td);
 		} else {
 			error = do_dup(td, DUP_FIXED, devnull, i, &retval);
 			if (error != 0)

==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/kern/kern_linker.c#2 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/kern_linker.c,v 1.147 2007/03/04 22:36:46 rwatson Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/kern_linker.c,v 1.148 2007/04/22 15:31:21 rwatson Exp $");
 
 #include "opt_ddb.h"
 #include "opt_hwpmc_hooks.h"
@@ -562,11 +562,6 @@
 	/* Refuse to unload modules if securelevel raised. */
 	if (securelevel > 0)
 		return (EPERM);
-#ifdef MAC
-	error = mac_check_kld_unload(curthread->td_ucred);
-	if (error)
-		return (error);
-#endif
 
 	KLD_LOCK_ASSERT();
 	KLD_DPF(FILE, ("linker_file_unload: lf->refs=%d\n", file->refs));

==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/kern/kern_time.c#2 (text+ko) ====

@@ -30,9 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/kern_time.c,v 1.139 2007/03/05 13:10:57 rwatson Exp $");
-
-#include "opt_mac.h"
+__FBSDID("$FreeBSD: src/sys/kern/kern_time.c,v 1.140 2007/04/22 15:31:21 rwatson Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -56,8 +54,6 @@
 #include <sys/timetc.h>
 #include <sys/vnode.h>
 
-#include <security/mac/mac_framework.h>
-
 #include <vm/vm.h>
 #include <vm/vm_extern.h>
 
@@ -272,11 +268,6 @@
 	struct timeval atv;
 	int error;
 
-#ifdef MAC
-	error = mac_check_system_settime(td->td_ucred);
-	if (error)
-		return (error);
-#endif
 	if ((error = priv_check(td, PRIV_CLOCK_SETTIME)) != 0)
 		return (error);
 	if (clock_id != CLOCK_REALTIME)
@@ -479,11 +470,6 @@
 {
 	int error;
 
-#ifdef MAC
-	error = mac_check_system_settime(td->td_ucred);
-	if (error)
-		return (error);
-#endif
 	error = priv_check(td, PRIV_SETTIMEOFDAY);
 	if (error)
 		return (error);

==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/kern/kern_uuid.c#2 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/kern_uuid.c,v 1.12 2007/03/05 13:10:57 rwatson Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/kern_uuid.c,v 1.13 2007/04/23 12:53:00 pjd Exp $");
 
 #include <sys/param.h>
 #include <sys/endian.h>
@@ -116,7 +116,7 @@
 /*
  * Get the current time as a 60 bit count of 100-nanosecond intervals
  * since 00:00:00.00, October 15,1582. We apply a magic offset to convert
- * the Unix time since 00:00:00.00, Januari 1, 1970 to the date of the
+ * the Unix time since 00:00:00.00, January 1, 1970 to the date of the
  * Gregorian reform to the Christian calendar.
  */
 static uint64_t

==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/kern/subr_rman.c#3 (text+ko) ====

@@ -58,7 +58,7 @@
 #include "opt_ddb.h"
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/subr_rman.c,v 1.56 2007/04/16 21:09:03 jhb Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/subr_rman.c,v 1.57 2007/04/28 07:37:49 jmg Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -155,10 +155,6 @@
 	return 0;
 }
 
-/*
- * NB: this interface is not robust against programming errors which
- * add multiple copies of the same region.
- */
 int
 rman_manage_region(struct rman *rm, u_long start, u_long end)
 {

==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/kern/vfs_bio.c#2 (text+ko) ====

@@ -39,7 +39,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/vfs_bio.c,v 1.520 2007/03/29 13:26:13 wkoszek Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/vfs_bio.c,v 1.521 2007/04/24 10:59:21 kib Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -961,9 +961,11 @@
 	 */
 	vp = bp->b_vp;
 	bo = bp->b_bufobj;
-	if ((td->td_pflags & TDP_COWINPROGRESS) == 0)
+	if ((td->td_pflags & (TDP_COWINPROGRESS|TDP_INBDFLUSH)) == 0) {
+		td->td_pflags |= TDP_INBDFLUSH;
 		BO_BDFLUSH(bo, bp);
-	else
+		td->td_pflags &= ~TDP_INBDFLUSH;
+	} else
 		recursiveflushes++;
 
 	bdirty(bp);

==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/kern/vfs_mount.c#3 (text+ko) ====

@@ -35,7 +35,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/vfs_mount.c,v 1.258 2007/04/17 21:14:06 pjd Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/vfs_mount.c,v 1.259 2007/04/26 08:56:56 kib Exp $");
 
 #include <sys/param.h>
 #include <sys/conf.h>
@@ -1168,14 +1168,12 @@
 		mnt_gen_r = mp->mnt_gen;
 		VI_LOCK(coveredvp);
 		vholdl(coveredvp);
-		error = vn_lock(coveredvp, LK_EXCLUSIVE | LK_INTERLOCK, td);
+		vn_lock(coveredvp, LK_EXCLUSIVE | LK_INTERLOCK | LK_RETRY, td);
 		vdrop(coveredvp);
 		/*
 		 * Check for mp being unmounted while waiting for the
 		 * covered vnode lock.
 		 */
-		if (error)
-			return (error);
 		if (coveredvp->v_mountedhere != mp ||
 		    coveredvp->v_mountedhere->mnt_gen != mnt_gen_r) {
 			VOP_UNLOCK(coveredvp, 0, td);

==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/sys/ioctl_compat.h#2 (text+ko) ====

@@ -32,7 +32,7 @@
  * SUCH DAMAGE.
  *
  *	@(#)ioctl_compat.h	8.4 (Berkeley) 1/21/94
- * $FreeBSD: src/sys/sys/ioctl_compat.h,v 1.9 2006/01/10 09:19:10 phk Exp $
+ * $FreeBSD: src/sys/sys/ioctl_compat.h,v 1.10 2007/04/27 11:19:05 benjsc Exp $
  */
 
 #ifndef _SYS_IOCTL_COMPAT_H_
@@ -42,7 +42,7 @@
 #include <sys/ttydev.h>
 
 #ifdef USE_OLD_TTY
-#warning "Old BSD tty API used, please upgrade"
+#warning "Old BSD tty API used and depends on COMPAT_43TTY. Use termios.h instead"
 #endif
 
 struct tchars {

==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/sys/mount.h#3 (text+ko) ====

@@ -27,7 +27,7 @@
  * SUCH DAMAGE.
  *
  *	@(#)mount.h	8.21 (Berkeley) 5/20/95
- * $FreeBSD: src/sys/sys/mount.h,v 1.225 2007/04/17 21:14:05 pjd Exp $
+ * $FreeBSD: src/sys/sys/mount.h,v 1.226 2007/04/22 16:18:10 rwatson Exp $
  */
 
 #ifndef _SYS_MOUNT_H_
@@ -168,8 +168,7 @@
 	time_t		mnt_time;		/* last time written*/
 	int		mnt_iosize_max;		/* max size for clusters, etc */
 	struct netexport *mnt_export;		/* export list */
-	struct label	*mnt_mntlabel;		/* MAC label for the mount */
-	struct label	*mnt_fslabel;		/* MAC label for the fs */
+	struct label	*mnt_label;		/* MAC label for the fs */
 	u_int		mnt_hashseed;		/* Random seed for vfs_hash */
 	int		mnt_markercnt;		/* marker vnodes in use */
 	int		mnt_holdcnt;		/* hold count */

==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/sys/priv.h#3 (text+ko) ====

@@ -26,7 +26,7 @@
  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/sys/priv.h,v 1.11 2007/04/17 00:35:10 thompsa Exp $
+ * $FreeBSD: src/sys/sys/priv.h,v 1.12 2007/04/21 18:11:19 rwatson Exp $

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


More information about the p4-projects mailing list