PERFORCE change 82970 for review
Robert Watson
rwatson at FreeBSD.org
Thu Sep 1 18:04:37 GMT 2005
http://perforce.freebsd.org/chv.cgi?CH=82970
Change 82970 by rwatson at 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 at 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) <<<
More information about the p4-projects
mailing list