From owner-p4-projects@FreeBSD.ORG Thu Feb 15 01:39:52 2007 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 6ABFB16A406; Thu, 15 Feb 2007 01:39:52 +0000 (UTC) X-Original-To: perforce@freebsd.org Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 429DE16A401 for ; Thu, 15 Feb 2007 01:39:52 +0000 (UTC) (envelope-from jkim@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [69.147.83.41]) by mx1.freebsd.org (Postfix) with ESMTP id 30F5313C48E for ; Thu, 15 Feb 2007 01:39:52 +0000 (UTC) (envelope-from jkim@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.6/8.13.6) with ESMTP id l1F1dqxI003939 for ; Thu, 15 Feb 2007 01:39:52 GMT (envelope-from jkim@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.6/8.13.4/Submit) id l1F1dpNE003933 for perforce@freebsd.org; Thu, 15 Feb 2007 01:39:51 GMT (envelope-from jkim@freebsd.org) Date: Thu, 15 Feb 2007 01:39:51 GMT Message-Id: <200702150139.l1F1dpNE003933@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to jkim@freebsd.org using -f From: Jung-uk Kim To: Perforce Change Reviews Cc: Subject: PERFORCE change 114529 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 15 Feb 2007 01:39:52 -0000 http://perforce.freebsd.org/chv.cgi?CH=114529 Change 114529 by jkim@jkim_hammer on 2007/02/15 01:38:56 IFC Affected files ... .. //depot/projects/linuxolator/src/sys/amd64/linux32/linux.h#18 integrate .. //depot/projects/linuxolator/src/sys/amd64/linux32/linux32_machdep.c#36 integrate .. //depot/projects/linuxolator/src/sys/amd64/linux32/linux32_proto.h#19 integrate .. //depot/projects/linuxolator/src/sys/amd64/linux32/linux32_syscall.h#19 integrate .. //depot/projects/linuxolator/src/sys/amd64/linux32/linux32_sysent.c#18 integrate .. //depot/projects/linuxolator/src/sys/amd64/linux32/syscalls.master#18 integrate .. //depot/projects/linuxolator/src/sys/dev/bge/if_bge.c#13 integrate .. //depot/projects/linuxolator/src/sys/dev/mii/brgphy.c#9 integrate .. //depot/projects/linuxolator/src/sys/dev/mpt/mpt_pci.c#6 integrate .. //depot/projects/linuxolator/src/sys/dev/pci/pci.c#17 integrate .. //depot/projects/linuxolator/src/sys/dev/sound/pci/envy24.c#4 integrate .. //depot/projects/linuxolator/src/sys/dev/sound/pci/envy24ht.c#3 integrate .. //depot/projects/linuxolator/src/sys/dev/sound/pci/spicds.c#2 integrate .. //depot/projects/linuxolator/src/sys/i386/linux/linux.h#14 integrate .. //depot/projects/linuxolator/src/sys/i386/linux/linux_machdep.c#30 integrate .. //depot/projects/linuxolator/src/sys/i386/linux/linux_proto.h#19 integrate .. //depot/projects/linuxolator/src/sys/i386/linux/linux_syscall.h#18 integrate .. //depot/projects/linuxolator/src/sys/i386/linux/linux_sysent.c#18 integrate .. //depot/projects/linuxolator/src/sys/i386/linux/syscalls.master#17 integrate .. //depot/projects/linuxolator/src/sys/kern/uipc_usrreq.c#7 integrate Differences ... ==== //depot/projects/linuxolator/src/sys/amd64/linux32/linux.h#18 (text+ko) ==== @@ -27,7 +27,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/amd64/linux32/linux.h,v 1.11 2007/02/01 13:36:19 kib Exp $ + * $FreeBSD: src/sys/amd64/linux32/linux.h,v 1.12 2007/02/15 00:54:40 jkim Exp $ */ #ifndef _AMD64_LINUX_LINUX_H_ ==== //depot/projects/linuxolator/src/sys/amd64/linux32/linux32_machdep.c#36 (text+ko) ==== @@ -29,7 +29,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/amd64/linux32/linux32_machdep.c,v 1.30 2007/02/01 13:27:51 kib Exp $"); +__FBSDID("$FreeBSD: src/sys/amd64/linux32/linux32_machdep.c,v 1.33 2007/02/15 01:20:43 jkim Exp $"); #include #include @@ -53,7 +53,10 @@ #include #include +#include +#include #include +#include #include #include @@ -63,15 +66,11 @@ #include #include -#include -#include #include #include #include #include -#include /* needed for pcb definition in linux_set_thread_area */ - /* * Memory and System segment descriptors */ ==== //depot/projects/linuxolator/src/sys/amd64/linux32/linux32_proto.h#19 (text+ko) ==== @@ -2,8 +2,8 @@ * System call prototypes. * * DO NOT EDIT-- this file is automatically generated. - * $FreeBSD$ - * created from FreeBSD: src/sys/amd64/linux32/syscalls.master,v 1.25 2006/12/31 13:16:00 netchild Exp + * $FreeBSD: src/sys/amd64/linux32/linux32_proto.h,v 1.29 2007/02/15 01:15:31 jkim Exp $ + * created from FreeBSD: src/sys/amd64/linux32/syscalls.master,v 1.26 2007/02/15 01:13:36 jkim Exp */ #ifndef _LINUX_SYSPROTO_H_ ==== //depot/projects/linuxolator/src/sys/amd64/linux32/linux32_syscall.h#19 (text+ko) ==== @@ -2,8 +2,8 @@ * System call numbers. * * DO NOT EDIT-- this file is automatically generated. - * $FreeBSD$ - * created from FreeBSD: src/sys/amd64/linux32/syscalls.master,v 1.25 2006/12/31 13:16:00 netchild Exp + * $FreeBSD: src/sys/amd64/linux32/linux32_syscall.h,v 1.29 2007/02/15 01:15:31 jkim Exp $ + * created from FreeBSD: src/sys/amd64/linux32/syscalls.master,v 1.26 2007/02/15 01:13:36 jkim Exp */ #define LINUX_SYS_exit 1 ==== //depot/projects/linuxolator/src/sys/amd64/linux32/linux32_sysent.c#18 (text+ko) ==== @@ -2,8 +2,8 @@ * System call switch table. * * DO NOT EDIT-- this file is automatically generated. - * $FreeBSD$ - * created from FreeBSD: src/sys/amd64/linux32/syscalls.master,v 1.25 2006/12/31 13:16:00 netchild Exp + * $FreeBSD: src/sys/amd64/linux32/linux32_sysent.c,v 1.29 2007/02/15 01:15:31 jkim Exp $ + * created from FreeBSD: src/sys/amd64/linux32/syscalls.master,v 1.26 2007/02/15 01:13:36 jkim Exp */ #include @@ -130,7 +130,7 @@ { AS(linux_newlstat_args), (sy_call_t *)linux_newlstat, AUE_LSTAT, NULL, 0, 0 }, /* 107 = linux_newlstat */ { AS(linux_newfstat_args), (sy_call_t *)linux_newfstat, AUE_FSTAT, NULL, 0, 0 }, /* 108 = linux_newfstat */ { 0, (sy_call_t *)linux_uname, AUE_NULL, NULL, 0, 0 }, /* 109 = linux_uname */ - { 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0 }, /* 110 = iopl */ + { AS(linux_iopl_args), (sy_call_t *)linux_iopl, AUE_NULL, NULL, 0, 0 }, /* 110 = linux_iopl */ { 0, (sy_call_t *)linux_vhangup, AUE_NULL, NULL, 0, 0 }, /* 111 = linux_vhangup */ { 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0 }, /* 112 = idle */ { 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0 }, /* 113 = vm86old */ ==== //depot/projects/linuxolator/src/sys/amd64/linux32/syscalls.master#18 (text+ko) ==== @@ -1,4 +1,4 @@ - $FreeBSD: src/sys/amd64/linux32/syscalls.master,v 1.25 2006/12/31 13:16:00 netchild Exp $ + $FreeBSD: src/sys/amd64/linux32/syscalls.master,v 1.26 2007/02/15 01:13:36 jkim Exp $ ; @(#)syscalls.master 8.1 (Berkeley) 7/19/93 ; System call name/number master file (or rather, slave, from LINUX). ==== //depot/projects/linuxolator/src/sys/dev/bge/if_bge.c#13 (text+ko) ==== @@ -32,7 +32,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/dev/bge/if_bge.c,v 1.176 2007/02/12 23:58:52 jkim Exp $"); +__FBSDID("$FreeBSD: src/sys/dev/bge/if_bge.c,v 1.178 2007/02/14 19:44:15 jkim Exp $"); /* * Broadcom BCM570x family gigabit ethernet driver for FreeBSD. @@ -256,7 +256,7 @@ { BGE_CHIPID_BCM5714_B3, "BCM5714 B3" }, { BGE_CHIPID_BCM5715_A0, "BCM5715 A0" }, { BGE_CHIPID_BCM5715_A1, "BCM5715 A1" }, - /* 5784 and 5787 share the same ASIC ID */ + /* 5754 and 5787 share the same ASIC ID */ { BGE_CHIPID_BCM5787_A0, "BCM5754/5787 A0" }, { BGE_CHIPID_BCM5787_A1, "BCM5754/5787 A1" }, { BGE_CHIPID_BCM5787_A2, "BCM5754/5787 A2" }, @@ -280,7 +280,7 @@ { BGE_ASICREV_BCM5780, "unknown BCM5780" }, { BGE_ASICREV_BCM5714, "unknown BCM5714" }, { BGE_ASICREV_BCM5755, "unknown BCM5755" }, - /* 5784 and 5787 share the same ASIC ID */ + /* 5754 and 5787 share the same ASIC ID */ { BGE_ASICREV_BCM5787, "unknown BCM5754/5787" }, { 0, NULL } @@ -2593,7 +2593,7 @@ dev = sc->bge_dev; - if (BGE_IS_5705_PLUS(sc) && !BGE_IS_5714_FAMILY(sc)) { + if (BGE_IS_575X_PLUS(sc) && !BGE_IS_5714_FAMILY(sc)) { if (sc->bge_flags & BGE_FLAG_PCIE) write_op = bge_writemem_direct; else ==== //depot/projects/linuxolator/src/sys/dev/mii/brgphy.c#9 (text+ko) ==== @@ -31,7 +31,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/dev/mii/brgphy.c,v 1.63 2007/02/13 00:34:32 jkim Exp $"); +__FBSDID("$FreeBSD: src/sys/dev/mii/brgphy.c,v 1.64 2007/02/14 18:21:32 jkim Exp $"); /* * Driver for the Broadcom BCM54xx/57xx 1000baseTX PHY. @@ -619,7 +619,7 @@ int reg; uint16_t val; } dspcode[] = { - { BRGPHY_MII_DSP_ADDR_REG, 0x0a75 }, + { BRGPHY_MII_DSP_RW_PORT, 0x0a75 }, { 0x1c, 0x8c68 }, { 0x1c, 0x8d68 }, { 0x1c, 0x8c68 }, ==== //depot/projects/linuxolator/src/sys/dev/mpt/mpt_pci.c#6 (text+ko) ==== @@ -99,16 +99,17 @@ */ #include -__FBSDID("$FreeBSD: src/sys/dev/mpt/mpt_pci.c,v 1.46 2007/01/05 22:49:05 mjacob Exp $"); +__FBSDID("$FreeBSD: src/sys/dev/mpt/mpt_pci.c,v 1.47 2007/02/14 22:31:21 jhb Exp $"); #include #include #include #if __FreeBSD_version < 700000 +#define pci_msix_count(x) 0 #define pci_msi_count(x) 0 -#define pci_msi_enable(x) 0 #define pci_alloc_msi(x, y) 1 +#define pci_alloc_msix(x, y) 1 #define pci_release_msi(x) do { ; } while (0) #endif @@ -527,14 +528,28 @@ /* Get a handle to the interrupt */ iqd = 0; - if (mpt->msi_enable && pci_msi_count(dev) == 1) { - mpt->pci_msi_count = 1; - if (pci_alloc_msi(dev, &mpt->pci_msi_count) == 0) { - iqd = 1; - } else { - mpt->pci_msi_count = 0; + if (mpt->msi_enable) { + /* + * First try to alloc an MSI-X message. If that + * fails, then try to alloc an MSI message instead. + */ + if (pci_msix_count(dev) == 1) { + mpt->pci_msi_count = 1; + if (pci_alloc_msix(dev, &mpt->pci_msi_count) == 0) { + iqd = 1; + } else { + mpt->pci_msi_count = 0; + } + } + if (iqd == 0 && pci_msi_count(dev) == 1) { + mpt->pci_msi_count = 1; + if (pci_alloc_msi(dev, &mpt->pci_msi_count) == 0) { + iqd = 1; + } else { + mpt->pci_msi_count = 0; + } } - } + } mpt->pci_irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &iqd, RF_ACTIVE | RF_SHAREABLE); if (mpt->pci_irq == NULL) { ==== //depot/projects/linuxolator/src/sys/dev/pci/pci.c#17 (text+ko) ==== @@ -27,7 +27,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/dev/pci/pci.c,v 1.339 2007/02/08 14:33:07 rwatson Exp $"); +__FBSDID("$FreeBSD: src/sys/dev/pci/pci.c,v 1.342 2007/02/14 22:36:27 jhb Exp $"); #include "opt_bus.h" @@ -217,6 +217,7 @@ struct devlist pci_devq; uint32_t pci_generation; uint32_t pci_numdevs = 0; +static int pcie_chipset, pcix_chipset; /* sysctl vars */ SYSCTL_NODE(_hw, OID_AUTO, pci, CTLFLAG_RD, 0, "PCI bus tuning parameters"); @@ -585,6 +586,28 @@ cfg->subvendor = val & 0xffff; cfg->subdevice = val >> 16; } + break; + case PCIY_PCIX: /* PCI-X */ + /* + * Assume we have a PCI-X chipset if we have + * at least one PCI-PCI bridge with a PCI-X + * capability. Note that some systems with + * PCI-express or HT chipsets might match on + * this check as well. + */ + if ((cfg->hdrtype & PCIM_HDRTYPE) == 1) + pcix_chipset = 1; + break; + case PCIY_EXPRESS: /* PCI-express */ + /* + * Assume we have a PCI-express chipset if we have + * at least one PCI-express root port. + */ + val = REG(ptr + PCIR_EXPRESS_FLAGS, 2); + if ((val & PCIM_EXP_FLAGS_TYPE) == + PCIM_EXP_TYPE_ROOT_PORT) + pcie_chipset = 1; + break; default: break; } @@ -1141,7 +1164,7 @@ /* Unfinished range? */ if (run) - printf("%d", irq); + printf("-%d", irq); printf(" for MSI-X\n"); } } @@ -1220,8 +1243,16 @@ for (i = 0; i < cfg->msix.msix_alloc; i++) { resource_list_add(&dinfo->resources, SYS_RES_IRQ, indices[i], irqs[i], irqs[i], 1); + + /* + * The indices in the backend code (PCIB_* methods and the + * MI helper routines for MD code such as pci_enable_msix()) + * are all zero-based. However, the indices passed to this + * function are 1-based so that the correspond 1:1 with the + * SYS_RES_IRQ resource IDs. + */ error = PCIB_REMAP_MSIX(device_get_parent(dev), child, - indices[i], irqs[i]); + indices[i] - 1, irqs[i]); KASSERT(error == 0, ("Failed to remap MSI-X message")); } if (bootverbose) { @@ -1395,6 +1426,10 @@ if (!pci_honor_msi_blacklist) return (0); + /* Blacklist all non-PCI-express and non-PCI-X chipsets. */ + if (!(pcie_chipset || pcix_chipset)) + return (1); + dev = pci_find_bsf(0, 0, 0); if (dev != NULL) return (pci_msi_device_blacklisted(dev)); ==== //depot/projects/linuxolator/src/sys/dev/sound/pci/envy24.c#4 (text+ko) ==== @@ -35,7 +35,7 @@ #include "mixer_if.h" -SND_DECLARE_FILE("$FreeBSD: src/sys/dev/sound/pci/envy24.c,v 1.5 2006/12/17 16:06:45 ariff Exp $"); +SND_DECLARE_FILE("$FreeBSD: src/sys/dev/sound/pci/envy24.c,v 1.6 2007/02/14 15:23:44 ariff Exp $"); MALLOC_DEFINE(M_ENVY24, "envy24", "envy24 audio"); @@ -109,7 +109,7 @@ /* device private data */ struct sc_info { device_t dev; - void *lock; + struct mtx *lock; /* Control/Status registor */ struct resource *cs; ==== //depot/projects/linuxolator/src/sys/dev/sound/pci/envy24ht.c#3 (text+ko) ==== @@ -36,7 +36,7 @@ #include "mixer_if.h" -SND_DECLARE_FILE("$FreeBSD: src/sys/dev/sound/pci/envy24ht.c,v 1.6 2006/12/17 16:06:45 ariff Exp $"); +SND_DECLARE_FILE("$FreeBSD: src/sys/dev/sound/pci/envy24ht.c,v 1.7 2007/02/14 15:23:44 ariff Exp $"); MALLOC_DEFINE(M_ENVY24HT, "envy24ht", "envy24ht audio"); @@ -110,7 +110,7 @@ /* device private data */ struct sc_info { device_t dev; - void *lock; + struct mtx *lock; /* Control/Status registor */ struct resource *cs; ==== //depot/projects/linuxolator/src/sys/dev/sound/pci/spicds.c#2 (text+ko) ==== @@ -24,7 +24,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THEPOSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/sys/dev/sound/pci/spicds.c,v 1.4 2006/09/30 16:53:40 netchild Exp $ + * $FreeBSD: src/sys/dev/sound/pci/spicds.c,v 1.5 2007/02/14 15:23:44 ariff Exp $ */ #include @@ -45,7 +45,7 @@ unsigned int dvc; /* De-emphasis and Volume Control */ unsigned int left, right; char name[SPICDS_NAMELEN]; - void *lock; + struct mtx *lock; }; static void ==== //depot/projects/linuxolator/src/sys/i386/linux/linux.h#14 (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/i386/linux/linux.h,v 1.73 2007/02/01 13:36:19 kib Exp $ + * $FreeBSD: src/sys/i386/linux/linux.h,v 1.74 2007/02/15 00:54:40 jkim Exp $ */ #ifndef _I386_LINUX_LINUX_H_ ==== //depot/projects/linuxolator/src/sys/i386/linux/linux_machdep.c#30 (text+ko) ==== @@ -27,7 +27,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/i386/linux/linux_machdep.c,v 1.69 2007/02/01 13:27:52 kib Exp $"); +__FBSDID("$FreeBSD: src/sys/i386/linux/linux_machdep.c,v 1.70 2007/02/15 00:54:40 jkim Exp $"); #include #include ==== //depot/projects/linuxolator/src/sys/i386/linux/linux_proto.h#19 (text+ko) ==== @@ -2,8 +2,8 @@ * System call prototypes. * * DO NOT EDIT-- this file is automatically generated. - * $FreeBSD$ - * created from FreeBSD: src/sys/i386/linux/syscalls.master,v 1.85 2006/12/31 13:16:00 netchild Exp + * $FreeBSD: src/sys/i386/linux/linux_proto.h,v 1.91 2007/02/15 00:57:03 jkim Exp $ + * created from FreeBSD: src/sys/i386/linux/syscalls.master,v 1.86 2007/02/15 00:54:40 jkim Exp */ #ifndef _LINUX_SYSPROTO_H_ ==== //depot/projects/linuxolator/src/sys/i386/linux/linux_syscall.h#18 (text+ko) ==== @@ -2,8 +2,8 @@ * System call numbers. * * DO NOT EDIT-- this file is automatically generated. - * $FreeBSD$ - * created from FreeBSD: src/sys/i386/linux/syscalls.master,v 1.85 2006/12/31 13:16:00 netchild Exp + * $FreeBSD: src/sys/i386/linux/linux_syscall.h,v 1.84 2007/02/15 00:57:04 jkim Exp $ + * created from FreeBSD: src/sys/i386/linux/syscalls.master,v 1.86 2007/02/15 00:54:40 jkim Exp */ #define LINUX_SYS_exit 1 ==== //depot/projects/linuxolator/src/sys/i386/linux/linux_sysent.c#18 (text+ko) ==== @@ -2,8 +2,8 @@ * System call switch table. * * DO NOT EDIT-- this file is automatically generated. - * $FreeBSD$ - * created from FreeBSD: src/sys/i386/linux/syscalls.master,v 1.85 2006/12/31 13:16:00 netchild Exp + * $FreeBSD: src/sys/i386/linux/linux_sysent.c,v 1.91 2007/02/15 00:57:04 jkim Exp $ + * created from FreeBSD: src/sys/i386/linux/syscalls.master,v 1.86 2007/02/15 00:54:40 jkim Exp */ #include ==== //depot/projects/linuxolator/src/sys/i386/linux/syscalls.master#17 (text+ko) ==== @@ -1,4 +1,4 @@ - $FreeBSD: src/sys/i386/linux/syscalls.master,v 1.85 2006/12/31 13:16:00 netchild Exp $ + $FreeBSD: src/sys/i386/linux/syscalls.master,v 1.86 2007/02/15 00:54:40 jkim Exp $ ; @(#)syscalls.master 8.1 (Berkeley) 7/19/93 ; System call name/number master file (or rather, slave, from LINUX). ==== //depot/projects/linuxolator/src/sys/kern/uipc_usrreq.c#7 (text+ko) ==== @@ -1,7 +1,7 @@ /*- * Copyright (c) 1982, 1986, 1989, 1991, 1993 * The Regents of the University of California. - * Copyright (c) 2004-2006 Robert N. M. Watson + * Copyright (c) 2004-2007 Robert N. M. Watson * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -47,10 +47,16 @@ * passing UNIX domain sockets over other UNIX domain sockets requires the * implementation of a simple garbage collector to find and tear down cycles * of disconnected sockets. + * + * TODO: + * SEQPACKET, RDM + * rethink name space problems + * need a proper out-of-band + * lock pushdown */ #include -__FBSDID("$FreeBSD: src/sys/kern/uipc_usrreq.c,v 1.192 2007/02/13 21:00:57 rwatson Exp $"); +__FBSDID("$FreeBSD: src/sys/kern/uipc_usrreq.c,v 1.194 2007/02/14 15:05:40 rwatson Exp $"); #include "opt_mac.h" @@ -87,24 +93,23 @@ #include -static uma_zone_t unp_zone; -static unp_gen_t unp_gencnt; -static u_int unp_count; +static uma_zone_t unp_zone; +static unp_gen_t unp_gencnt; +static u_int unp_count; /* Count of local sockets. */ +static ino_t unp_ino; /* Prototype for fake inode numbers. */ +static int unp_rights; /* File descriptors in flight. */ +static struct unp_head unp_shead; /* List of local stream sockets. */ +static struct unp_head unp_dhead; /* List of local datagram sockets. */ -static struct unp_head unp_shead, unp_dhead; +static const struct sockaddr sun_noname = { sizeof(sun_noname), AF_LOCAL }; /* - * Unix communications domain. - * - * TODO: - * SEQPACKET, RDM - * rethink name space problems - * need a proper out-of-band - * lock pushdown + * Garbage collection of cyclic file descriptor/socket references occurs + * asynchronously in a taskqueue context in order to avoid recursion and + * reentrance in the UNIX domain socket, file descriptor, and socket layer + * code. See unp_gc() for a full description. */ -static const struct sockaddr sun_noname = { sizeof(sun_noname), AF_LOCAL }; -static ino_t unp_ino; /* prototype for fake inode numbers */ -struct mbuf *unp_addsockcred(struct thread *, struct mbuf *); +static struct task unp_gc_task; /* * Both send and receive buffers are allocated PIPSIZ bytes of buffering for @@ -123,8 +128,6 @@ static u_long unpdg_sendspace = 2*1024; /* really max datagram size */ static u_long unpdg_recvspace = 4*1024; -static int unp_rights; /* file descriptors in flight */ - SYSCTL_NODE(_net, PF_LOCAL, local, CTLFLAG_RW, 0, "Local domain"); SYSCTL_NODE(_net_local, SOCK_STREAM, stream, CTLFLAG_RW, 0, "SOCK_STREAM"); SYSCTL_NODE(_net_local, SOCK_DGRAM, dgram, CTLFLAG_RW, 0, "SOCK_DGRAM"); @@ -159,35 +162,29 @@ * and exposes weaknesses in the socket->protocol API by offering poor * failure modes. */ -static struct mtx unp_mtx; +static struct mtx unp_mtx; #define UNP_LOCK_INIT() \ - mtx_init(&unp_mtx, "unp", NULL, MTX_DEF) + mtx_init(&unp_mtx, "unp", NULL, MTX_DEF | MTX_RECURSE) #define UNP_LOCK() mtx_lock(&unp_mtx) #define UNP_UNLOCK() mtx_unlock(&unp_mtx) #define UNP_LOCK_ASSERT() mtx_assert(&unp_mtx, MA_OWNED) #define UNP_UNLOCK_ASSERT() mtx_assert(&unp_mtx, MA_NOTOWNED) -/* - * Garbage collection of cyclic file descriptor/socket references occurs - * asynchronously in a taskqueue context in order to avoid recursion and - * reentrance in the UNIX domain socket, file descriptor, and socket layer - * code. See unp_gc() for a full description. - */ -static struct task unp_gc_task; - -static int unp_connect(struct socket *,struct sockaddr *, struct thread *); -static int unp_connect2(struct socket *so, struct socket *so2, int); -static void unp_disconnect(struct unpcb *); -static void unp_shutdown(struct unpcb *); -static void unp_drop(struct unpcb *, int); -static void unp_gc(__unused void *, int); -static void unp_scan(struct mbuf *, void (*)(struct file *)); -static void unp_mark(struct file *); -static void unp_discard(struct file *); -static void unp_freerights(struct file **, int); -static int unp_internalize(struct mbuf **, struct thread *); -static int unp_listen(struct socket *, struct unpcb *, int, +static int unp_connect(struct socket *, struct sockaddr *, + struct thread *); +static int unp_connect2(struct socket *so, struct socket *so2, int); +static void unp_disconnect(struct unpcb *); +static void unp_shutdown(struct unpcb *); +static void unp_drop(struct unpcb *, int); +static void unp_gc(__unused void *, int); +static void unp_scan(struct mbuf *, void (*)(struct file *)); +static void unp_mark(struct file *); +static void unp_discard(struct file *); +static void unp_freerights(struct file **, int); +static int unp_internalize(struct mbuf **, struct thread *); +static int unp_listen(struct socket *, struct unpcb *, int, struct thread *); +struct mbuf *unp_addsockcred(struct thread *, struct mbuf *); /* * Definitions of protocols supported in the LOCAL domain. @@ -278,7 +275,7 @@ if (error) return (error); } - unp = uma_zalloc(unp_zone, M_WAITOK | M_ZERO); + unp = uma_zalloc(unp_zone, M_NOWAIT | M_ZERO); if (unp == NULL) return (ENOBUFS); LIST_INIT(&unp->unp_refs); @@ -988,17 +985,9 @@ goto bad2; } if (so->so_proto->pr_flags & PR_CONNREQUIRED) { - if (so2->so_options & SO_ACCEPTCONN) { - /* - * NB: drop locks here so unp_attach is entered w/o - * locks; this avoids a recursive lock of the head - * and holding sleep locks across a (potentially) - * blocking malloc. - */ - UNP_UNLOCK(); + if (so2->so_options & SO_ACCEPTCONN) so3 = sonewconn(so2, 0); - UNP_LOCK(); - } else + else so3 = NULL; if (so3 == NULL) { error = ECONNREFUSED;