Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 1 Sep 2005 18:04:34 GMT
From:      Robert Watson <rwatson@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 82970 for review
Message-ID:  <200509011804.j81I4YGg043291@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=82970

Change 82970 by rwatson@rwatson_zoo on 2005/09/01 18:03:35

	Integrate netsmp:
	
	- amd64 NMI fixes
	- amd64 pmap fixes
	- linux ifioctl fixes to avoid holding mutex over uiomove
	- De-MT_HEADER
	- De-if_el
	- g_label_ntfs
	- if_ed locking fixes, MPSAFEty
	- md_mtx
	- if_txp fixes
	- more KTR_GEOM
	- various gvinum fixes
	- m_demote(), m_sanity()
	- m_bcopyxxx(), m_copymdata()
	- much if_de general fixage, locking fixes,
	- if_ste locking fixes

Affected files ...

.. //depot/projects/netsmp/src/sys/amd64/amd64/db_trace.c#3 integrate
.. //depot/projects/netsmp/src/sys/amd64/amd64/exception.S#2 integrate
.. //depot/projects/netsmp/src/sys/amd64/amd64/genassym.c#2 integrate
.. //depot/projects/netsmp/src/sys/amd64/amd64/pmap.c#5 integrate
.. //depot/projects/netsmp/src/sys/amd64/amd64/trap.c#2 integrate
.. //depot/projects/netsmp/src/sys/boot/forth/loader.conf#5 integrate
.. //depot/projects/netsmp/src/sys/compat/linux/linux_ioctl.c#4 integrate
.. //depot/projects/netsmp/src/sys/compat/ndis/kern_ndis.c#2 integrate
.. //depot/projects/netsmp/src/sys/conf/files#7 integrate
.. //depot/projects/netsmp/src/sys/conf/files.i386#3 integrate
.. //depot/projects/netsmp/src/sys/dev/acpica/acpi_thermal.c#5 integrate
.. //depot/projects/netsmp/src/sys/dev/ata/ata-all.c#4 integrate
.. //depot/projects/netsmp/src/sys/dev/ata/ata-chipset.c#5 integrate
.. //depot/projects/netsmp/src/sys/dev/ata/ata-pci.h#5 integrate
.. //depot/projects/netsmp/src/sys/dev/ed/if_ed.c#6 integrate
.. //depot/projects/netsmp/src/sys/dev/ed/if_ed_3c503.c#2 integrate
.. //depot/projects/netsmp/src/sys/dev/ed/if_ed_cbus.c#2 integrate
.. //depot/projects/netsmp/src/sys/dev/ed/if_ed_hpp.c#2 integrate
.. //depot/projects/netsmp/src/sys/dev/ed/if_ed_isa.c#2 integrate
.. //depot/projects/netsmp/src/sys/dev/ed/if_ed_novell.c#2 integrate
.. //depot/projects/netsmp/src/sys/dev/ed/if_ed_pccard.c#2 integrate
.. //depot/projects/netsmp/src/sys/dev/ed/if_ed_pci.c#2 integrate
.. //depot/projects/netsmp/src/sys/dev/ed/if_ed_sic.c#2 integrate
.. //depot/projects/netsmp/src/sys/dev/ed/if_ed_wd80x3.c#2 integrate
.. //depot/projects/netsmp/src/sys/dev/ed/if_edvar.h#2 integrate
.. //depot/projects/netsmp/src/sys/dev/ep/if_ep_eisa.c#2 integrate
.. //depot/projects/netsmp/src/sys/dev/fdc/fdc.c#2 integrate
.. //depot/projects/netsmp/src/sys/dev/gem/if_gem.c#8 integrate
.. //depot/projects/netsmp/src/sys/dev/hwpmc/hwpmc_amd.c#3 integrate
.. //depot/projects/netsmp/src/sys/dev/md/md.c#3 integrate
.. //depot/projects/netsmp/src/sys/dev/pccard/pccarddevs#2 integrate
.. //depot/projects/netsmp/src/sys/dev/pci/pci.c#2 integrate
.. //depot/projects/netsmp/src/sys/dev/pci/pci_pci.c#2 integrate
.. //depot/projects/netsmp/src/sys/dev/pci/pci_user.c#2 integrate
.. //depot/projects/netsmp/src/sys/dev/syscons/scmouse.c#2 integrate
.. //depot/projects/netsmp/src/sys/dev/syscons/scvesactl.c#2 integrate
.. //depot/projects/netsmp/src/sys/dev/syscons/scvidctl.c#2 integrate
.. //depot/projects/netsmp/src/sys/dev/syscons/syscons.c#2 integrate
.. //depot/projects/netsmp/src/sys/dev/syscons/syscons.h#2 integrate
.. //depot/projects/netsmp/src/sys/dev/txp/if_txp.c#6 integrate
.. //depot/projects/netsmp/src/sys/dev/wi/if_wi.c#10 integrate
.. //depot/projects/netsmp/src/sys/fs/devfs/devfs_vnops.c#5 integrate
.. //depot/projects/netsmp/src/sys/geom/geom_io.c#3 integrate
.. //depot/projects/netsmp/src/sys/geom/label/g_label.c#4 integrate
.. //depot/projects/netsmp/src/sys/geom/label/g_label.h#3 integrate
.. //depot/projects/netsmp/src/sys/geom/label/g_label_iso9660.c#2 integrate
.. //depot/projects/netsmp/src/sys/geom/label/g_label_ntfs.c#1 branch
.. //depot/projects/netsmp/src/sys/geom/vinum/geom_vinum_drive.c#3 integrate
.. //depot/projects/netsmp/src/sys/geom/vinum/geom_vinum_init.c#2 integrate
.. //depot/projects/netsmp/src/sys/i386/conf/NOTES#4 integrate
.. //depot/projects/netsmp/src/sys/i386/i386/pmap.c#6 integrate
.. //depot/projects/netsmp/src/sys/i386/isa/if_el.c#5 delete
.. //depot/projects/netsmp/src/sys/i386/isa/if_elreg.h#2 delete
.. //depot/projects/netsmp/src/sys/kern/kern_cpu.c#4 integrate
.. //depot/projects/netsmp/src/sys/kern/kern_descrip.c#2 integrate
.. //depot/projects/netsmp/src/sys/kern/kern_lock.c#3 integrate
.. //depot/projects/netsmp/src/sys/kern/link_elf.c#2 integrate
.. //depot/projects/netsmp/src/sys/kern/link_elf_obj.c#2 integrate
.. //depot/projects/netsmp/src/sys/kern/subr_stack.c#2 integrate
.. //depot/projects/netsmp/src/sys/kern/uipc_mbuf.c#3 integrate
.. //depot/projects/netsmp/src/sys/kern/vfs_subr.c#7 integrate
.. //depot/projects/netsmp/src/sys/modules/Makefile#3 integrate
.. //depot/projects/netsmp/src/sys/modules/de/Makefile#3 integrate
.. //depot/projects/netsmp/src/sys/modules/el/Makefile#2 delete
.. //depot/projects/netsmp/src/sys/modules/geom/geom_label/Makefile#3 integrate
.. //depot/projects/netsmp/src/sys/modules/geom/geom_vinum/Makefile#2 integrate
.. //depot/projects/netsmp/src/sys/net/if_bridge.c#8 integrate
.. //depot/projects/netsmp/src/sys/net/if_vlan.c#8 integrate
.. //depot/projects/netsmp/src/sys/net/if_vlan_var.h#2 integrate
.. //depot/projects/netsmp/src/sys/net80211/ieee80211_ioctl.c#8 integrate
.. //depot/projects/netsmp/src/sys/netatalk/ddp_output.c#2 integrate
.. //depot/projects/netsmp/src/sys/netgraph/bluetooth/include/ng_l2cap.h#2 integrate
.. //depot/projects/netsmp/src/sys/netgraph/bluetooth/l2cap/ng_l2cap_cmds.c#2 integrate
.. //depot/projects/netsmp/src/sys/netgraph/bluetooth/l2cap/ng_l2cap_misc.c#3 integrate
.. //depot/projects/netsmp/src/sys/netgraph/netgraph.h#5 integrate
.. //depot/projects/netsmp/src/sys/netgraph/ng_base.c#4 integrate
.. //depot/projects/netsmp/src/sys/netgraph/ng_fec.c#5 integrate
.. //depot/projects/netsmp/src/sys/netgraph/ng_pptpgre.c#2 integrate
.. //depot/projects/netsmp/src/sys/netgraph/ng_split.c#2 integrate
.. //depot/projects/netsmp/src/sys/netinet/if_atm.c#3 integrate
.. //depot/projects/netsmp/src/sys/netinet/ip_input.c#4 integrate
.. //depot/projects/netsmp/src/sys/netinet/ip_output.c#8 integrate
.. //depot/projects/netsmp/src/sys/netinet/tcp_subr.c#3 integrate
.. //depot/projects/netsmp/src/sys/netinet/tcp_syncache.c#2 integrate
.. //depot/projects/netsmp/src/sys/netinet6/ip6_output.c#5 integrate
.. //depot/projects/netsmp/src/sys/pci/if_dc.c#8 integrate
.. //depot/projects/netsmp/src/sys/pci/if_de.c#10 integrate
.. //depot/projects/netsmp/src/sys/pci/if_devar.h#5 integrate
.. //depot/projects/netsmp/src/sys/pci/if_pcn.c#9 integrate
.. //depot/projects/netsmp/src/sys/pci/if_ste.c#7 integrate
.. //depot/projects/netsmp/src/sys/pci/if_stereg.h#3 integrate
.. //depot/projects/netsmp/src/sys/pci/if_wb.c#6 integrate
.. //depot/projects/netsmp/src/sys/pci/if_wbreg.h#2 integrate
.. //depot/projects/netsmp/src/sys/sys/mbuf.h#3 integrate
.. //depot/projects/netsmp/src/sys/sys/param.h#4 integrate
.. //depot/projects/netsmp/src/sys/sys/stack.h#2 integrate

Differences ...

==== //depot/projects/netsmp/src/sys/amd64/amd64/db_trace.c#3 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/amd64/amd64/db_trace.c,v 1.68 2005/08/03 04:33:48 jeff Exp $");
+__FBSDID("$FreeBSD: src/sys/amd64/amd64/db_trace.c,v 1.69 2005/08/27 16:03:39 jkoshy Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -317,7 +317,8 @@
 	db_symbol_values(sym, &name, NULL);
 	if (name != NULL) {
 		if (strcmp(name, "calltrap") == 0 ||
-		    strcmp(name, "fork_trampoline") == 0)
+		    strcmp(name, "fork_trampoline") == 0 ||
+		    strcmp(name, "nmi_calltrap") == 0)
 			frame_type = TRAP;
 		else if (strncmp(name, "Xatpic_intr", 11) == 0 ||
 		    strncmp(name, "Xatpic_fastintr", 15) == 0 ||

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

@@ -27,7 +27,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/amd64/amd64/exception.S,v 1.125 2005/06/30 00:26:54 peter Exp $
+ * $FreeBSD: src/sys/amd64/amd64/exception.S,v 1.127 2005/08/27 16:03:40 jkoshy Exp $
  */
 
 #include "opt_atpic.h"
@@ -93,8 +93,6 @@
 	jmp alltraps
 IDTVEC(div)
 	TRAP(T_DIVIDE)
-IDTVEC(nmi)
-	TRAP(T_NMI)
 IDTVEC(ofl)
 	TRAP(T_OFLOW)
 IDTVEC(bnd)
@@ -313,6 +311,82 @@
 IDTVEC(fast_syscall32)
 	sysret
 
+/*
+ * NMI handling is special.
+ *
+ * First, NMIs do not respect the state of the processor's RFLAGS.IF
+ * bit and the NMI handler may be invoked at any time, including when
+ * the processor is in a critical section with RFLAGS.IF == 0.  In
+ * particular, this means that the processor's GS.base values could be
+ * inconsistent on entry to the handler, and so we need to read
+ * MSR_GSBASE to determine if a 'swapgs' is needed.  We use '%ebx', a
+ * C-preserved register, to remember whether to swap GS back on the
+ * exit path.
+ *
+ * Second, the processor treats NMIs specially, blocking further NMIs
+ * until an 'iretq' instruction is executed.  We therefore need to
+ * execute the NMI handler with interrupts disabled to prevent a
+ * nested interrupt from executing an 'iretq' instruction and
+ * inadvertently taking the processor out of NMI mode.
+ */
+
+IDTVEC(nmi)
+	subq	$TF_RIP,%rsp
+	movq	$(T_NMI),TF_TRAPNO(%rsp)
+	movq	$0,TF_ADDR(%rsp)
+	movq	$0,TF_ERR(%rsp)
+	movq	%rdi,TF_RDI(%rsp)
+	movq	%rsi,TF_RSI(%rsp)
+	movq	%rdx,TF_RDX(%rsp)
+	movq	%rcx,TF_RCX(%rsp)
+	movq	%r8,TF_R8(%rsp)
+	movq	%r9,TF_R9(%rsp)
+	movq	%rax,TF_RAX(%rsp)
+	movq	%rbx,TF_RBX(%rsp)
+	movq	%rbp,TF_RBP(%rsp)
+	movq	%r10,TF_R10(%rsp)
+	movq	%r11,TF_R11(%rsp)
+	movq	%r12,TF_R12(%rsp)
+	movq	%r13,TF_R13(%rsp)
+	movq	%r14,TF_R14(%rsp)
+	movq	%r15,TF_R15(%rsp)
+	xorl	%ebx,%ebx
+	testb	$SEL_RPL_MASK,TF_CS(%rsp)
+	jnz	nmi_needswapgs		/* we came from userland */
+	movl	$MSR_GSBASE,%ecx
+	rdmsr
+	cmpl	$VM_MAXUSER_ADDRESS >> 32,%edx
+	jae	nmi_calltrap		/* GS.base holds a kernel VA */
+nmi_needswapgs:
+	incl	%ebx
+	swapgs
+/* Note: this label is also used by ddb and gdb: */
+nmi_calltrap:
+	FAKE_MCOUNT(TF_RIP(%rsp))
+	call	trap
+	MEXITCOUNT
+	testl	%ebx,%ebx
+	jz	nmi_restoreregs
+	swapgs
+nmi_restoreregs:
+	movq	TF_RDI(%rsp),%rdi
+	movq	TF_RSI(%rsp),%rsi
+	movq	TF_RDX(%rsp),%rdx
+	movq	TF_RCX(%rsp),%rcx
+	movq	TF_R8(%rsp),%r8
+	movq	TF_R9(%rsp),%r9
+	movq	TF_RAX(%rsp),%rax
+	movq	TF_RBX(%rsp),%rbx
+	movq	TF_RBP(%rsp),%rbp
+	movq	TF_R10(%rsp),%r10
+	movq	TF_R11(%rsp),%r11
+	movq	TF_R12(%rsp),%r12
+	movq	TF_R13(%rsp),%r13
+	movq	TF_R14(%rsp),%r14
+	movq	TF_R15(%rsp),%r15
+	addq	$TF_RIP,%rsp
+	iretq
+
 ENTRY(fork_trampoline)
 	movq	%r12, %rdi		/* function */
 	movq	%rbx, %rsi		/* arg1 */

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

@@ -33,7 +33,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/amd64/amd64/genassym.c,v 1.155 2004/11/20 02:30:59 das Exp $");
+__FBSDID("$FreeBSD: src/sys/amd64/amd64/genassym.c,v 1.156 2005/08/27 16:03:40 jkoshy Exp $");
 
 #include "opt_compat.h"
 #include "opt_kstack_pages.h"
@@ -209,3 +209,5 @@
 
 ASSYM(MTX_LOCK, offsetof(struct mtx, mtx_lock));
 ASSYM(MTX_RECURSECNT, offsetof(struct mtx, mtx_recurse));
+
+ASSYM(MSR_GSBASE, MSR_GSBASE);

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

@@ -7,6 +7,8 @@
  * All rights reserved.
  * Copyright (c) 2003 Peter Wemm
  * All rights reserved.
+ * Copyright (c) 2005 Alan L. Cox <alc@cs.rice.edu>
+ * All rights reserved.
  *
  * This code is derived from software contributed to Berkeley by
  * the Systems Programming Group of the University of Utah Computer
@@ -75,7 +77,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/amd64/amd64/pmap.c,v 1.525 2005/08/22 20:02:40 alc Exp $");
+__FBSDID("$FreeBSD: src/sys/amd64/amd64/pmap.c,v 1.526 2005/08/26 05:18:46 alc Exp $");
 
 /*
  *	Manages physical address maps.
@@ -210,6 +212,7 @@
 		vm_offset_t va);
 static void pmap_insert_entry(pmap_t pmap, vm_offset_t va, vm_page_t m);
 
+static vm_page_t pmap_allocpde(pmap_t pmap, vm_offset_t va, int flags);
 static vm_page_t pmap_allocpte(pmap_t pmap, vm_offset_t va, int flags);
 
 static vm_page_t _pmap_allocpte(pmap_t pmap, vm_pindex_t ptepindex, int flags);
@@ -1242,6 +1245,33 @@
 }
 
 static vm_page_t
+pmap_allocpde(pmap_t pmap, vm_offset_t va, int flags)
+{
+	vm_pindex_t pdpindex, ptepindex;
+	pdp_entry_t *pdpe;
+	vm_page_t pdpg;
+
+	KASSERT((flags & (M_NOWAIT | M_WAITOK)) == M_NOWAIT ||
+	    (flags & (M_NOWAIT | M_WAITOK)) == M_WAITOK,
+	    ("pmap_allocpde: flags is neither M_NOWAIT nor M_WAITOK"));
+retry:
+	pdpe = pmap_pdpe(pmap, va);
+	if (pdpe != NULL && (*pdpe & PG_V) != 0) {
+		/* Add a reference to the pd page. */
+		pdpg = PHYS_TO_VM_PAGE(*pdpe & PG_FRAME);
+		pdpg->wire_count++;
+	} else {
+		/* Allocate a pd page. */
+		ptepindex = pmap_pde_pindex(va);
+		pdpindex = ptepindex >> NPDPEPGSHIFT;
+		pdpg = _pmap_allocpte(pmap, NUPDE + pdpindex, flags);
+		if (pdpg == NULL && (flags & M_WAITOK))
+			goto retry;
+	}
+	return (pdpg);
+}
+
+static vm_page_t
 pmap_allocpte(pmap_t pmap, vm_offset_t va, int flags)
 {
 	vm_pindex_t ptepindex;
@@ -1269,6 +1299,8 @@
 	if (pd != 0 && (*pd & (PG_PS | PG_V)) == (PG_PS | PG_V)) {
 		*pd = 0;
 		pd = 0;
+		pmap->pm_stats.resident_count -= NBPDR / PAGE_SIZE;
+		pmap_unuse_pt(pmap, va, *pmap_pdpe(pmap, va));
 		pmap_invalidate_all(kernel_pmap);
 	}
 
@@ -1621,6 +1653,7 @@
 		if ((ptpaddr & PG_PS) != 0) {
 			*pde = 0;
 			pmap->pm_stats.resident_count -= NBPDR / PAGE_SIZE;
+			pmap_unuse_pt(pmap, sva, *pdpe);
 			anyvalid = 1;
 			continue;
 		}
@@ -2135,15 +2168,14 @@
 		    vm_object_t object, vm_pindex_t pindex,
 		    vm_size_t size)
 {
-	vm_page_t p;
+	vm_offset_t va;
+	vm_page_t p, pdpg;
 
 	VM_OBJECT_LOCK_ASSERT(object, MA_OWNED);
 	KASSERT(object->type == OBJT_DEVICE,
 	    ("pmap_object_init_pt: non-device object"));
 	if (((addr & (NBPDR - 1)) == 0) && ((size & (NBPDR - 1)) == 0)) {
-		int i;
 		vm_page_t m[1];
-		int npdes;
 		pd_entry_t ptepa, *pde;
 
 		PMAP_LOCK(pmap);
@@ -2183,12 +2215,35 @@
 		p->valid = VM_PAGE_BITS_ALL;
 
 		PMAP_LOCK(pmap);
-		pmap->pm_stats.resident_count += size >> PAGE_SHIFT;
-		npdes = size >> PDRSHIFT;
-		for(i = 0; i < npdes; i++) {
-			pde_store(pde, ptepa | PG_U | PG_RW | PG_V | PG_PS);
+		for (va = addr; va < addr + size; va += NBPDR) {
+			while ((pdpg =
+			    pmap_allocpde(pmap, va, M_NOWAIT)) == NULL) {
+				PMAP_UNLOCK(pmap);
+				vm_page_lock_queues();
+				vm_page_busy(p);
+				vm_page_unlock_queues();
+				VM_OBJECT_UNLOCK(object);
+				VM_WAIT;
+				VM_OBJECT_LOCK(object);
+				vm_page_lock_queues();
+				vm_page_wakeup(p);
+				vm_page_unlock_queues();
+				PMAP_LOCK(pmap);
+			}
+			pde = (pd_entry_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(pdpg));
+			pde = &pde[pmap_pde_index(va)];
+			if ((*pde & PG_V) == 0) {
+				pde_store(pde, ptepa | PG_PS | PG_M | PG_A |
+				    PG_U | PG_RW | PG_V);
+				pmap->pm_stats.resident_count +=
+				    NBPDR / PAGE_SIZE;
+			} else {
+				pdpg->wire_count--;
+				KASSERT(pdpg->wire_count > 0,
+				    ("pmap_object_init_pt: missing reference "
+				     "to page directory page, va: 0x%lx", va));
+			}
 			ptepa += NBPDR;
-			pde++;
 		}
 		pmap_invalidate_all(pmap);
 out:
@@ -2262,7 +2317,7 @@
 	}
 	for (addr = src_addr; addr < end_addr; addr = va_next) {
 		pt_entry_t *src_pte, *dst_pte;
-		vm_page_t dstmpte, srcmpte;
+		vm_page_t dstmpde, dstmpte, srcmpte;
 		pml4_entry_t *pml4e;
 		pdp_entry_t *pdpe;
 		pd_entry_t srcptepaddr, *pde;
@@ -2299,19 +2354,18 @@
 			continue;
 			
 		if (srcptepaddr & PG_PS) {
-			pde = pmap_pde(dst_pmap, addr);
-			if (pde == 0) {
-				/*
-				 * XXX should do an allocpte here to
-				 * instantiate the pde
-				 */
-				continue;
-			}
+			dstmpde = pmap_allocpde(dst_pmap, addr, M_NOWAIT);
+			if (dstmpde == NULL)
+				break;
+			pde = (pd_entry_t *)
+			    PHYS_TO_DMAP(VM_PAGE_TO_PHYS(dstmpde));
+			pde = &pde[pmap_pde_index(addr)];
 			if (*pde == 0) {
 				*pde = srcptepaddr;
 				dst_pmap->pm_stats.resident_count +=
 				    NBPDR / PAGE_SIZE;
-			}
+			} else
+				pmap_unwire_pte_hold(dst_pmap, addr, dstmpde);
 			continue;
 		}
 

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

@@ -38,7 +38,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/amd64/amd64/trap.c,v 1.289 2005/06/29 23:23:16 peter Exp $");
+__FBSDID("$FreeBSD: src/sys/amd64/amd64/trap.c,v 1.290 2005/08/27 16:03:40 jkoshy Exp $");
 
 /*
  * AMD64 Trap and System call handling
@@ -210,7 +210,8 @@
 			printf(
 			    "pid %ld (%s): trap %d with interrupts disabled\n",
 			    (long)curproc->p_pid, curproc->p_comm, type);
-		else if (type != T_BPTFLT && type != T_TRCTRAP) {
+		else if (type != T_NMI && type != T_BPTFLT &&
+		    type != T_TRCTRAP) {
 			/*
 			 * XXX not quite right, since this may be for a
 			 * multiple fault in user mode.

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

@@ -6,7 +6,7 @@
 #
 # All arguments must be in double quotes.
 #
-# $FreeBSD: src/sys/boot/forth/loader.conf,v 1.99 2005/08/18 01:39:43 iedowse Exp $
+# $FreeBSD: src/sys/boot/forth/loader.conf,v 1.100 2005/08/31 10:51:55 glebius Exp $
 
 ##############################################################
 ###  Basic configuration options  ############################
@@ -108,7 +108,6 @@
 #debug.ktr.mask="0x1200"	# Bitmask of KTR events to enable
 #debug.ktr.verbose="1"		# Enable console dump of KTR events
 #net.graph.maxalloc="128"	# Maximum number of queue items to allocate
-#net.graph.ngqfreemax="64"	# Maximum number of free queue items to cache
 
 
 ##############################################################

==== //depot/projects/netsmp/src/sys/compat/linux/linux_ioctl.c#4 (text+ko) ====

@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/compat/linux/linux_ioctl.c,v 1.128 2005/08/09 10:19:41 rwatson Exp $");
+__FBSDID("$FreeBSD: src/sys/compat/linux/linux_ioctl.c,v 1.130 2005/08/28 13:11:08 delphij Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -46,6 +46,7 @@
 #include <sys/linker_set.h>
 #include <sys/malloc.h>
 #include <sys/proc.h>
+#include <sys/sbuf.h>
 #include <sys/socket.h>
 #include <sys/sockio.h>
 #include <sys/soundcard.h>
@@ -2130,14 +2131,15 @@
 	struct l_ifreq ifr;
 	struct ifnet *ifp;
 	struct ifaddr *ifa;
-	struct iovec iov;
-	struct uio uio;
-	int error, ethno;
+	struct sbuf *sb;
+	int error, ethno, full = 0, valid_len, max_len;
 
 	error = copyin(uifc, &ifc, sizeof(ifc));
 	if (error != 0)
 		return (error);
 
+	max_len = MAXPHYS - 1;
+
 	/* handle the 'request buffer size' case */
 	if (ifc.ifc_buf == PTROUT(NULL)) {
 		ifc.ifc_len = 0;
@@ -2152,25 +2154,24 @@
 		return (error);
 	}
 
-	/* much easier to use uiomove than keep track ourselves */
-	iov.iov_base = PTRIN(ifc.ifc_buf);
-	iov.iov_len = ifc.ifc_len;
-	uio.uio_iov = &iov;
-	uio.uio_iovcnt = 1;
-	uio.uio_offset = 0;
-	uio.uio_resid = ifc.ifc_len;
-	uio.uio_segflg = UIO_USERSPACE;
-	uio.uio_rw = UIO_READ;
-	uio.uio_td = td;
+	if (ifc.ifc_len <= 0)
+		return (EINVAL);
 
+again:
 	/* Keep track of eth interfaces */
 	ethno = 0;
+	if (ifc.ifc_len <= max_len) {
+		max_len = ifc.ifc_len;
+		full = 1;
+	}
+	sb = sbuf_new(NULL, NULL, max_len + 1, SBUF_FIXEDLEN);
+	max_len = 0;
+	valid_len = 0;
 
 	/* Return all AF_INET addresses of all interfaces */
 	IFNET_RLOCK();		/* could sleep XXX */
 	TAILQ_FOREACH(ifp, &ifnet, if_link) {
-		if (uio.uio_resid <= 0)
-			break;
+		int addrs = 0;
 
 		bzero(&ifr, sizeof(ifr));
 		if (IFP_IS_ETH(ifp))
@@ -2183,26 +2184,39 @@
 		TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
 			struct sockaddr *sa = ifa->ifa_addr;
 
-			if (uio.uio_resid <= 0)
-				break;
-
 			if (sa->sa_family == AF_INET) {
 				ifr.ifr_addr.sa_family = LINUX_AF_INET;
 				memcpy(ifr.ifr_addr.sa_data, sa->sa_data,
 				    sizeof(ifr.ifr_addr.sa_data));
+				sbuf_bcat(sb, &ifr, sizeof(ifr));
+				max_len += sizeof(ifr);
+				addrs++;
+			}
 
-				error = uiomove(&ifr, sizeof(ifr), &uio);
-				if (error != 0) {
-					IFNET_RUNLOCK();
-					return (error);
-				}
-			}
+			if (!sbuf_overflowed(sb))
+				valid_len = sbuf_len(sb);
+		}
+		if (addrs == 0) {
+			bzero((caddr_t)&ifr.ifr_addr, sizeof(ifr.ifr_addr));
+			sbuf_bcat(sb, &ifr, sizeof(ifr));
+			max_len += sizeof(ifr);
+
+			if (!sbuf_overflowed(sb))
+				valid_len = sbuf_len(sb);
 		}
 	}
 	IFNET_RUNLOCK();
 
-	ifc.ifc_len -= uio.uio_resid;
+	if (valid_len != max_len && !full) {
+		sbuf_delete(sb);
+		goto again;
+	}
+
+	ifc.ifc_len = valid_len; 
+	sbuf_finish(sb);
+	memcpy(PTRIN(ifc.ifc_buf), sbuf_data(sb), ifc.ifc_len);
 	error = copyout(&ifc, uifc, sizeof(ifc));
+	sbuf_delete(sb);
 
 	return (error);
 }

==== //depot/projects/netsmp/src/sys/compat/ndis/kern_ndis.c#2 (text+ko) ====

@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/compat/ndis/kern_ndis.c,v 1.84 2005/06/10 16:49:02 brooks Exp $");
+__FBSDID("$FreeBSD: src/sys/compat/ndis/kern_ndis.c,v 1.85 2005/08/30 16:21:51 andre Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -719,7 +719,7 @@
 		    p, 0, EXT_NDIS);
 		p->np_refcnt++;
 		totlen += m->m_len;
-		if (m->m_flags & MT_HEADER)
+		if (m->m_flags & M_PKTHDR)
 			*m0 = m;
 		else
 			prev->m_next = m;

==== //depot/projects/netsmp/src/sys/conf/files#7 (text+ko) ====

@@ -1,4 +1,4 @@
-# $FreeBSD: src/sys/conf/files,v 1.1041 2005/08/12 00:27:44 pjd Exp $
+# $FreeBSD: src/sys/conf/files,v 1.1042 2005/08/26 12:48:34 takawata Exp $
 #
 # The long compile-with and dependency lines are required because of
 # limitations in config: backslash-newline doesn't work in strings, and
@@ -1063,6 +1063,7 @@
 geom/label/g_label_ext2fs.c	optional geom_label
 geom/label/g_label_iso9660.c	optional geom_label
 geom/label/g_label_msdosfs.c	optional geom_label
+geom/label/g_label_ntfs.c	optional geom_label
 geom/label/g_label_reiserfs.c	optional geom_label
 geom/label/g_label_ufs.c	optional geom_label
 geom/mirror/g_mirror.c		optional geom_mirror

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

@@ -1,7 +1,7 @@
 # This file tells config what files go into building a kernel,
 # files marked standard are always included.
 #
-# $FreeBSD: src/sys/conf/files.i386,v 1.539 2005/08/18 00:30:22 pjd Exp $
+# $FreeBSD: src/sys/conf/files.i386,v 1.540 2005/08/26 13:42:03 jhb Exp $
 #
 # The long compile-with and dependency lines are required because of
 # limitations in config: backslash-newline doesn't work in strings, and
@@ -321,7 +321,6 @@
 i386/isa/elcr.c			standard
 i386/isa/elink.c		optional ep
 i386/isa/elink.c		optional ie
-i386/isa/if_el.c		optional el
 i386/isa/isa.c			optional isa
 i386/isa/isa_dma.c		optional isa
 i386/isa/nmi.c			standard

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

@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_thermal.c,v 1.58 2005/08/25 11:31:30 ume Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_thermal.c,v 1.59 2005/08/26 02:21:02 kan Exp $");
 
 #include "opt_acpi.h"
 #include <sys/param.h>
@@ -423,6 +423,8 @@
     int		temp;
     ACPI_STATUS	status;
 
+    ACPI_FUNCTION_NAME ("acpi_tz_get_temperature");
+
     status = acpi_GetInteger(sc->tz_handle, "_TMP", &temp);
     if (ACPI_FAILURE(status)) {
 	ACPI_VPRINT(sc->tz_dev, acpi_device_get_parent_softc(sc->tz_dev),

==== //depot/projects/netsmp/src/sys/dev/ata/ata-all.c#4 (text+ko) ====

@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/ata/ata-all.c,v 1.254 2005/08/17 15:00:33 sos Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/ata/ata-all.c,v 1.256 2005/08/29 18:19:06 sos Exp $");
 
 #include "opt_ata.h"
 #include <sys/param.h>
@@ -615,7 +615,9 @@
 		atadev->mode = ATA_DMA_MAX;
 	}
 	else {
-	    if (ata_dma && ch->dma)
+	    if (ata_dma && ch->dma &&
+		(ata_umode(&atadev->param) > 0 ||
+		 ata_wmode(&atadev->param) > 0))
 		atadev->mode = ATA_DMA_MAX;
 	}
     }
@@ -794,6 +796,7 @@
 ata_mode2str(int mode)
 {
     switch (mode) {
+    case -1: return "UNSUPPORTED";
     case ATA_PIO0: return "PIO0";
     case ATA_PIO1: return "PIO1";
     case ATA_PIO2: return "PIO2";

==== //depot/projects/netsmp/src/sys/dev/ata/ata-chipset.c#5 (text+ko) ====

@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/ata/ata-chipset.c,v 1.131 2005/08/23 08:53:01 sos Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/ata/ata-chipset.c,v 1.132 2005/08/29 09:01:57 sos Exp $");
 
 #include "opt_ata.h"
 #include <sys/param.h>
@@ -3941,7 +3941,7 @@
     static struct ata_chip_id new_ids[] =
     {{ ATA_VIA6410,   0x00, 0,      0x00,   ATA_UDMA6, "VIA 6410" },
      { ATA_VIA6420,   0x00, 7,      0x00,   ATA_SA150, "VIA 6420" },
-     { ATA_VIA6421,   0x00, 6,      0x00,   ATA_SA150, "VIA 6421" },
+     { ATA_VIA6421,   0x00, 6,      VIABAR, ATA_SA150, "VIA 6421" },
      { 0, 0, 0, 0, 0, 0 }};
     char buffer[64];
 
@@ -4016,8 +4016,34 @@
     struct ata_pci_controller *ctlr = device_get_softc(device_get_parent(dev));
     struct ata_channel *ch = device_get_softc(dev);
 
-    /* setup the usual register normal pci style */
-    ata_pci_allocate(dev);
+
+    /* newer SATA chips has resources in one BAR for each channel */
+    if (ctlr->chip->cfg2 & VIABAR) {
+	struct resource *r_io;
+	int i, rid;
+		
+	rid = PCIR_BAR(ch->unit);
+	if (!(r_io = bus_alloc_resource_any(device_get_parent(dev),
+	   				    SYS_RES_IOPORT,
+					    &rid, RF_ACTIVE)))
+	    return ENXIO;
+
+	for (i = ATA_DATA; i <= ATA_COMMAND; i ++) {
+	    ch->r_io[i].res = r_io;
+	    ch->r_io[i].offset = i;
+	}
+	ch->r_io[ATA_CONTROL].res = r_io;
+	ch->r_io[ATA_CONTROL].offset = 2 + ATA_IOSIZE;
+	ch->r_io[ATA_IDX_ADDR].res = r_io;
+	ata_default_registers(dev);
+	for (i = ATA_BMCMD_PORT; i <= ATA_BMDTP_PORT; i++) {
+	    ch->r_io[i].res = ctlr->r_res1;
+	    ch->r_io[i].offset = i - ATA_BMCMD_PORT;
+	}
+	ata_generic_hw(dev);
+    }
+    else
+	ata_pci_allocate(dev);
 
     ch->r_io[ATA_SSTATUS].res = ctlr->r_res2;
     ch->r_io[ATA_SSTATUS].offset = (ch->unit << ctlr->chip->cfg1);

==== //depot/projects/netsmp/src/sys/dev/ata/ata-pci.h#5 (text+ko) ====

@@ -25,7 +25,7 @@
  * (INCLUDING 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/dev/ata/ata-pci.h,v 1.52 2005/08/23 08:53:01 sos Exp $
+ * $FreeBSD: src/sys/dev/ata/ata-pci.h,v 1.53 2005/08/29 09:01:57 sos Exp $
  */
 
 /* structure holding chipset config info */
@@ -355,6 +355,7 @@
 #define NV4OFF          0x08
 #define VIACLK          0x10
 #define VIABUG          0x20
+#define VIABAR          0x40
 
 
 /* global prototypes ata-pci.c */

==== //depot/projects/netsmp/src/sys/dev/ed/if_ed.c#6 (text+ko) ====

@@ -26,7 +26,12 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/ed/if_ed.c,v 1.256 2005/08/09 10:19:45 rwatson Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/ed/if_ed.c,v 1.257 2005/08/28 23:56:25 imp Exp $");
+
+/*
+ * TODO:
+ * o lock MII
+ */
 
 /*
  * Device driver for National Semiconductor DS8390/WD83C690 based ethernet
@@ -71,12 +76,15 @@
 
 #include <dev/ed/if_edreg.h>
 #include <dev/ed/if_edvar.h>
+#include <sys/kdb.h>
 
 devclass_t ed_devclass;
 
 static void	ed_init(void *);
+static void	ed_init_locked(struct ed_softc *);
 static int	ed_ioctl(struct ifnet *, u_long, caddr_t);
 static void	ed_start(struct ifnet *);
+static void	ed_start_locked(struct ifnet *);
 static void	ed_reset(struct ifnet *);
 static void	ed_watchdog(struct ifnet *);
 #ifndef ED_NO_MIIBUS
@@ -85,12 +93,15 @@
 
 static void	ed_ds_getmcaf(struct ed_softc *, uint32_t *);
 
-static void	ed_get_packet(struct ed_softc *, char *, u_short);
+static void	ed_get_packet(struct ed_softc *, bus_size_t, u_short);
+static void     ed_stop_hw(struct ed_softc *sc);
 
-static __inline void	ed_rint(struct ed_softc *);
-static __inline void	ed_xmit(struct ed_softc *);
-static __inline char *ed_ring_copy(struct ed_softc *, char *, char *, u_short);
-static u_short	ed_pio_write_mbufs(struct ed_softc *, struct mbuf *, long);
+static __inline void ed_rint(struct ed_softc *);
+static __inline void ed_xmit(struct ed_softc *);
+static __inline void ed_ring_copy(struct ed_softc *, bus_size_t, char *,
+    u_short);
+static u_short	ed_pio_write_mbufs(struct ed_softc *, struct mbuf *,
+    bus_size_t);
 
 static void	ed_setrcr(struct ed_softc *);
 
@@ -257,17 +268,31 @@
 	struct ed_softc *sc = device_get_softc(dev);
 	struct ifnet *ifp;
 
+	sc->dev = dev;
+	ED_LOCK_INIT(sc);
 	ifp = sc->ifp = if_alloc(IFT_ETHER);
 	if (ifp == NULL) {
 		device_printf(dev, "can not if_alloc()\n");
+		ED_LOCK_DESTROY(sc);
 		return (ENOSPC);
 	}
 
-	callout_handle_init(&sc->tick_ch);
+	if (sc->readmem == NULL) {
+		if (sc->mem_shared) {
+			if (sc->isa16bit)
+				sc->readmem = ed_shmem_readmem16;
+			else
+				sc->readmem = ed_shmem_readmem8;
+		} else {
+			sc->readmem = ed_pio_readmem;
+		}
+	}
+	
+	callout_init_mtx(&sc->tick_ch, ED_MUTEX(sc), 0);
 	/*
 	 * Set interface to stopped condition (reset)
 	 */
-	ed_stop(sc);
+	ed_stop_hw(sc);
 
 	/*
 	 * Initialize ifnet structure
@@ -298,15 +323,11 @@
 
 	/*
 	 * Set default state for ALTPHYS flag (used to disable the 
-	 * tranceiver for AUI operation), based on compile-time 
-	 * config option.
+	 * tranceiver for AUI operation), based on config option.
 	 */
+	ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
 	if (device_get_flags(dev) & ED_FLAGS_DISABLE_TRANCEIVER)
-		ifp->if_flags = (IFF_BROADCAST | IFF_SIMPLEX | 
-		    IFF_MULTICAST | IFF_ALTPHYS | IFF_NEEDSGIANT);
-	else
-		ifp->if_flags = (IFF_BROADCAST | IFF_SIMPLEX |
-		    IFF_MULTICAST | IFF_NEEDSGIANT);
+		ifp->if_flags |= IFF_ALTPHYS;
 
 	/*
 	 * Attach the interface
@@ -331,7 +352,7 @@
 			printf("%s ", sc->isa16bit ? "(16 bit)" : "(8 bit)");
 
 #if defined(ED_HPP) || defined(ED_3C503)
-		printf("%s\n", (((sc->vendor == ED_VENDOR_3COM) ||
+		printf("%s", (((sc->vendor == ED_VENDOR_3COM) ||
 				    (sc->vendor == ED_VENDOR_HP)) &&
 			   (ifp->if_flags & IFF_ALTPHYS)) ?
 		    " tranceiver disabled" : "");
@@ -350,15 +371,18 @@
 	struct ed_softc *sc = device_get_softc(dev);
 	struct ifnet *ifp = sc->ifp;
 
-	if (sc->gone)
-		return (0);
-	ed_stop(sc);
+	ED_ASSERT_UNLOCKED(sc);
+	ED_LOCK(sc);
+	if (bus_child_present(dev))
+		ed_stop(sc);
 	ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
+	ED_UNLOCK(sc);
+	callout_drain(&sc->tick_ch);
 	ether_ifdetach(ifp);
 	if_free(ifp);
-	sc->gone = 1;
 	bus_teardown_intr(dev, sc->irq_res, sc->irq_handle);
 	ed_release_resources(dev);
+	ED_LOCK_DESTROY(sc);
 	return (0);
 }
 
@@ -369,35 +393,20 @@
 ed_reset(struct ifnet *ifp)
 {
 	struct ed_softc *sc = ifp->if_softc;
-	int     s;
 
-	if (sc->gone)
-		return;
-	s = splimp();
-
+	ED_ASSERT_LOCKED(sc);
 	/*
 	 * Stop interface and re-initialize.
 	 */
 	ed_stop(sc);
-	ed_init(sc);
-
-	(void) splx(s);
+	ed_init_locked(sc);
 }
 
-/*
- * Take interface offline.
- */
-void
-ed_stop(struct ed_softc *sc)
+static void
+ed_stop_hw(struct ed_softc *sc)
 {
 	int     n = 5000;
 
-#ifndef ED_NO_MIIBUS
-	untimeout(ed_tick, sc, sc->tick_ch);
-	callout_handle_init(&sc->tick_ch);
-#endif
-	if (sc->gone)
-		return;
 	/*
 	 * Stop everything on the interface, and select page 0 registers.
 	 */
@@ -414,6 +423,19 @@
 }
 
 /*
+ * Take interface offline.
+ */
+void
+ed_stop(struct ed_softc *sc)
+{
+	ED_ASSERT_LOCKED(sc);
+#ifndef ED_NO_MIIBUS
+	callout_stop(&sc->tick_ch);
+#endif
+	ed_stop_hw(sc);
+}
+
+/*
  * Device timeout/watchdog routine. Entered if the device neglects to
  *	generate an interrupt after a transmit has been started on it.
  */
@@ -422,12 +444,12 @@
 {
 	struct ed_softc *sc = ifp->if_softc;
 
-	if (sc->gone)

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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200509011804.j81I4YGg043291>