From owner-p4-projects@FreeBSD.ORG Sat Jul 25 13:17:39 2009 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 67802106568E; Sat, 25 Jul 2009 13:17:39 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 1E414106568B for ; Sat, 25 Jul 2009 13:17:39 +0000 (UTC) (envelope-from andre@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 0A02B8FC16 for ; Sat, 25 Jul 2009 13:17:39 +0000 (UTC) (envelope-from andre@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.3/8.14.3) with ESMTP id n6PDHdgp005255 for ; Sat, 25 Jul 2009 13:17:39 GMT (envelope-from andre@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id n6PDHct7005253 for perforce@freebsd.org; Sat, 25 Jul 2009 13:17:38 GMT (envelope-from andre@freebsd.org) Date: Sat, 25 Jul 2009 13:17:38 GMT Message-Id: <200907251317.n6PDHct7005253@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to andre@freebsd.org using -f From: Andre Oppermann To: Perforce Change Reviews Cc: Subject: PERFORCE change 166554 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: Sat, 25 Jul 2009 13:17:40 -0000 http://perforce.freebsd.org/chv.cgi?CH=166554 Change 166554 by andre@andre_flirtbox on 2009/07/25 13:16:53 IFC. Affected files ... .. //depot/projects/tcp_reass/amd64/amd64/pmap.c#11 integrate .. //depot/projects/tcp_reass/arm/arm/pmap.c#9 integrate .. //depot/projects/tcp_reass/conf/files#11 integrate .. //depot/projects/tcp_reass/dev/e1000/e1000_ich8lan.c#4 integrate .. //depot/projects/tcp_reass/dev/e1000/if_em.c#5 integrate .. //depot/projects/tcp_reass/dev/e1000/if_igb.c#6 integrate .. //depot/projects/tcp_reass/dev/ixgbe/ixgbe.c#5 integrate .. //depot/projects/tcp_reass/fs/procfs/procfs_map.c#5 integrate .. //depot/projects/tcp_reass/i386/i386/pmap.c#10 integrate .. //depot/projects/tcp_reass/i386/xen/pmap.c#6 integrate .. //depot/projects/tcp_reass/ia64/ia64/pmap.c#8 integrate .. //depot/projects/tcp_reass/kern/kern_proc.c#7 integrate .. //depot/projects/tcp_reass/kern/kern_vimage.c#9 integrate .. //depot/projects/tcp_reass/kern/uipc_domain.c#7 integrate .. //depot/projects/tcp_reass/mips/mips/pmap.c#6 integrate .. //depot/projects/tcp_reass/net/flowtable.c#8 integrate .. //depot/projects/tcp_reass/net/if.c#12 integrate .. //depot/projects/tcp_reass/net/if_clone.c#7 integrate .. //depot/projects/tcp_reass/net/if_clone.h#4 integrate .. //depot/projects/tcp_reass/net/if_gif.c#8 integrate .. //depot/projects/tcp_reass/net/if_loop.c#8 integrate .. //depot/projects/tcp_reass/net/route.c#10 integrate .. //depot/projects/tcp_reass/net/rtsock.c#9 integrate .. //depot/projects/tcp_reass/net/vnet.c#2 integrate .. //depot/projects/tcp_reass/net/vnet.h#8 integrate .. //depot/projects/tcp_reass/net80211/ieee80211.c#8 integrate .. //depot/projects/tcp_reass/net80211/ieee80211_output.c#8 integrate .. //depot/projects/tcp_reass/netgraph/bluetooth/socket/ng_btsocket.c#4 integrate .. //depot/projects/tcp_reass/netgraph/netgraph.h#8 integrate .. //depot/projects/tcp_reass/netgraph/ng_base.c#9 integrate .. //depot/projects/tcp_reass/netgraph/ng_eiface.c#8 integrate .. //depot/projects/tcp_reass/netgraph/ng_ether.c#7 integrate .. //depot/projects/tcp_reass/netgraph/ng_iface.c#9 integrate .. //depot/projects/tcp_reass/netgraph/ng_socket.c#5 integrate .. //depot/projects/tcp_reass/netinet/igmp.c#10 integrate .. //depot/projects/tcp_reass/netinet/in_proto.c#6 integrate .. //depot/projects/tcp_reass/netinet/ipfw/ip_fw2.c#6 integrate .. //depot/projects/tcp_reass/netinet6/in6_proto.c#8 integrate .. //depot/projects/tcp_reass/netinet6/mld6.c#10 integrate .. //depot/projects/tcp_reass/netipsec/ipsec.c#8 integrate .. //depot/projects/tcp_reass/netipsec/keysock.c#7 integrate .. //depot/projects/tcp_reass/powerpc/booke/pmap.c#7 integrate .. //depot/projects/tcp_reass/sparc64/sparc64/pmap.c#6 integrate .. //depot/projects/tcp_reass/sys/domain.h#5 integrate .. //depot/projects/tcp_reass/sys/kernel.h#8 integrate .. //depot/projects/tcp_reass/sys/param.h#11 integrate .. //depot/projects/tcp_reass/sys/sysctl.h#10 integrate .. //depot/projects/tcp_reass/sys/user.h#8 integrate .. //depot/projects/tcp_reass/sys/vimage.h#9 integrate .. //depot/projects/tcp_reass/vm/sg_pager.c#1 branch .. //depot/projects/tcp_reass/vm/vm.h#5 integrate .. //depot/projects/tcp_reass/vm/vm_fault.c#8 integrate .. //depot/projects/tcp_reass/vm/vm_map.c#9 integrate .. //depot/projects/tcp_reass/vm/vm_meter.c#5 integrate .. //depot/projects/tcp_reass/vm/vm_object.c#10 integrate .. //depot/projects/tcp_reass/vm/vm_object.h#7 integrate .. //depot/projects/tcp_reass/vm/vm_page.c#10 integrate .. //depot/projects/tcp_reass/vm/vm_pageout.c#7 integrate .. //depot/projects/tcp_reass/vm/vm_pager.c#5 integrate .. //depot/projects/tcp_reass/vm/vm_pager.h#5 integrate Differences ... ==== //depot/projects/tcp_reass/amd64/amd64/pmap.c#11 (text+ko) ==== @@ -77,7 +77,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/amd64/amd64/pmap.c,v 1.666 2009/07/22 14:32:38 kib Exp $"); +__FBSDID("$FreeBSD: src/sys/amd64/amd64/pmap.c,v 1.667 2009/07/24 13:50:29 jhb Exp $"); /* * Manages physical address maps. @@ -3359,7 +3359,7 @@ int pat_mode; VM_OBJECT_LOCK_ASSERT(object, MA_OWNED); - KASSERT(object->type == OBJT_DEVICE, + KASSERT(object->type == OBJT_DEVICE || object->type == OBJT_SG, ("pmap_object_init_pt: non-device object")); if ((addr & (NBPDR - 1)) == 0 && (size & (NBPDR - 1)) == 0) { if (!vm_object_populate(object, pindex, pindex + atop(size))) ==== //depot/projects/tcp_reass/arm/arm/pmap.c#9 (text+ko) ==== @@ -147,7 +147,7 @@ #include "opt_vm.h" #include -__FBSDID("$FreeBSD: src/sys/arm/arm/pmap.c,v 1.112 2009/07/20 07:53:07 raj Exp $"); +__FBSDID("$FreeBSD: src/sys/arm/arm/pmap.c,v 1.113 2009/07/24 13:50:29 jhb Exp $"); #include #include #include @@ -3101,7 +3101,7 @@ { VM_OBJECT_LOCK_ASSERT(object, MA_OWNED); - KASSERT(object->type == OBJT_DEVICE, + KASSERT(object->type == OBJT_DEVICE || object->type == OBJT_SG, ("pmap_object_init_pt: non-device object")); } ==== //depot/projects/tcp_reass/conf/files#11 (text+ko) ==== @@ -1,4 +1,4 @@ -# $FreeBSD: src/sys/conf/files,v 1.1455 2009/07/21 12:32:46 mav Exp $ +# $FreeBSD: src/sys/conf/files,v 1.1456 2009/07/24 13:50:29 jhb Exp $ # # The long compile-with and dependency lines are required because of # limitations in config: backslash-newline doesn't work in strings, and @@ -2637,6 +2637,7 @@ vm/device_pager.c standard vm/phys_pager.c standard vm/redzone.c optional DEBUG_REDZONE +vm/sg_pager.c standard vm/swap_pager.c standard vm/uma_core.c standard vm/uma_dbg.c standard ==== //depot/projects/tcp_reass/dev/e1000/e1000_ich8lan.c#4 (text+ko) ==== @@ -30,7 +30,7 @@ POSSIBILITY OF SUCH DAMAGE. ******************************************************************************/ -/*$FreeBSD: src/sys/dev/e1000/e1000_ich8lan.c,v 1.4 2009/06/24 17:41:29 jfv Exp $*/ +/*$FreeBSD: src/sys/dev/e1000/e1000_ich8lan.c,v 1.5 2009/07/24 16:54:22 jfv Exp $*/ /* * 82562G 10/100 Network Connection @@ -307,7 +307,6 @@ { struct e1000_nvm_info *nvm = &hw->nvm; struct e1000_dev_spec_ich8lan *dev_spec = &hw->dev_spec.ich8lan; - union ich8_hws_flash_status hsfsts; u32 gfpreg, sector_base_addr, sector_end_addr; s32 ret_val = E1000_SUCCESS; u16 i; @@ -346,20 +345,6 @@ /* Adjust to word count */ nvm->flash_bank_size /= sizeof(u16); - /* - * Make sure the flash bank size does not overwrite the 4k - * sector ranges. We may have 64k allotted to us but we only care - * about the first 2 4k sectors. Therefore, if we have anything less - * than 64k set in the HSFSTS register, we will reduce the bank size - * down to 4k and let the rest remain unused. If berasesz == 3, then - * we are working in 64k mode. Otherwise we are not. - */ - if (nvm->flash_bank_size > E1000_SHADOW_RAM_WORDS) { - hsfsts.regval = E1000_READ_FLASH_REG16(hw, ICH_FLASH_HSFSTS); - if (hsfsts.hsf_status.berasesz != 3) - nvm->flash_bank_size = E1000_SHADOW_RAM_WORDS; - } - nvm->word_size = E1000_SHADOW_RAM_WORDS; /* Clear shadow ram */ @@ -1961,13 +1946,8 @@ iteration = 1; break; case 2: - if (hw->mac.type == e1000_ich9lan) { - sector_size = ICH_FLASH_SEG_SIZE_8K; - iteration = flash_bank_size / ICH_FLASH_SEG_SIZE_8K; - } else { - ret_val = -E1000_ERR_NVM; - goto out; - } + sector_size = ICH_FLASH_SEG_SIZE_8K; + iteration = 1; break; case 3: sector_size = ICH_FLASH_SEG_SIZE_64K; ==== //depot/projects/tcp_reass/dev/e1000/if_em.c#5 (text+ko) ==== @@ -30,7 +30,7 @@ POSSIBILITY OF SUCH DAMAGE. ******************************************************************************/ -/*$FreeBSD: src/sys/dev/e1000/if_em.c,v 1.19 2009/06/29 18:17:10 jfv Exp $*/ +/*$FreeBSD: src/sys/dev/e1000/if_em.c,v 1.21 2009/07/24 21:35:52 jfv Exp $*/ #ifdef HAVE_KERNEL_OPTION_HEADERS #include "opt_device_polling.h" @@ -815,9 +815,9 @@ #if __FreeBSD_version >= 700029 /* Register for VLAN events */ adapter->vlan_attach = EVENTHANDLER_REGISTER(vlan_config, - em_register_vlan, 0, EVENTHANDLER_PRI_FIRST); + em_register_vlan, adapter, EVENTHANDLER_PRI_FIRST); adapter->vlan_detach = EVENTHANDLER_REGISTER(vlan_unconfig, - em_unregister_vlan, 0, EVENTHANDLER_PRI_FIRST); + em_unregister_vlan, adapter, EVENTHANDLER_PRI_FIRST); #endif /* Tell the stack that the interface is not active */ @@ -919,9 +919,6 @@ bus_generic_detach(dev); if_free(ifp); -#if __FreeBSD_version >= 800000 - drbr_free(adapter->br, M_DEVBUF); -#endif em_free_transmit_structures(adapter); em_free_receive_structures(adapter); @@ -3644,7 +3641,8 @@ adapter->txtag = NULL; } #if __FreeBSD_version >= 800000 - buf_ring_free(adapter->br, M_DEVBUF); + if (adapter->br != NULL) + buf_ring_free(adapter->br, M_DEVBUF); #endif } @@ -4715,12 +4713,15 @@ * config EVENT */ static void -em_register_vlan(void *unused, struct ifnet *ifp, u16 vtag) +em_register_vlan(void *arg, struct ifnet *ifp, u16 vtag) { struct adapter *adapter = ifp->if_softc; u32 index, bit; - if ((vtag == 0) || (vtag > 4095)) /* Invalid */ + if (ifp->if_softc != arg) /* Not our event */ + return; + + if ((vtag == 0) || (vtag > 4095)) /* Invalid ID */ return; index = (vtag >> 5) & 0x7F; @@ -4736,11 +4737,14 @@ * unconfig EVENT */ static void -em_unregister_vlan(void *unused, struct ifnet *ifp, u16 vtag) +em_unregister_vlan(void *arg, struct ifnet *ifp, u16 vtag) { struct adapter *adapter = ifp->if_softc; u32 index, bit; + if (ifp->if_softc != arg) + return; + if ((vtag == 0) || (vtag > 4095)) /* Invalid */ return; ==== //depot/projects/tcp_reass/dev/e1000/if_igb.c#6 (text+ko) ==== @@ -30,7 +30,7 @@ POSSIBILITY OF SUCH DAMAGE. ******************************************************************************/ -/*$FreeBSD: src/sys/dev/e1000/if_igb.c,v 1.19 2009/07/14 19:32:36 bz Exp $*/ +/*$FreeBSD: src/sys/dev/e1000/if_igb.c,v 1.21 2009/07/24 21:35:52 jfv Exp $*/ #ifdef HAVE_KERNEL_OPTION_HEADERS @@ -600,9 +600,9 @@ /* Register for VLAN events */ adapter->vlan_attach = EVENTHANDLER_REGISTER(vlan_config, - igb_register_vlan, 0, EVENTHANDLER_PRI_FIRST); + igb_register_vlan, adapter, EVENTHANDLER_PRI_FIRST); adapter->vlan_detach = EVENTHANDLER_REGISTER(vlan_unconfig, - igb_unregister_vlan, 0, EVENTHANDLER_PRI_FIRST); + igb_unregister_vlan, adapter, EVENTHANDLER_PRI_FIRST); /* Tell the stack that the interface is not active */ adapter->ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE); @@ -3068,7 +3068,8 @@ } } #if __FreeBSD_version >= 800000 - buf_ring_free(txr->br, M_DEVBUF); + if (txr->br != NULL) + buf_ring_free(txr->br, M_DEVBUF); #endif if (txr->tx_buffers != NULL) { free(txr->tx_buffers, M_DEVBUF); @@ -4304,11 +4305,14 @@ * config EVENT */ static void -igb_register_vlan(void *unused, struct ifnet *ifp, u16 vtag) +igb_register_vlan(void *arg, struct ifnet *ifp, u16 vtag) { struct adapter *adapter = ifp->if_softc; u32 index, bit; + if (ifp->if_softc != arg) /* Not our event */ + return; + if ((vtag == 0) || (vtag > 4095)) /* Invalid */ return; @@ -4325,11 +4329,14 @@ * unconfig EVENT */ static void -igb_unregister_vlan(void *unused, struct ifnet *ifp, u16 vtag) +igb_unregister_vlan(void *arg, struct ifnet *ifp, u16 vtag) { struct adapter *adapter = ifp->if_softc; u32 index, bit; + if (ifp->if_softc != arg) + return; + if ((vtag == 0) || (vtag > 4095)) /* Invalid */ return; ==== //depot/projects/tcp_reass/dev/ixgbe/ixgbe.c#5 (text+ko) ==== @@ -30,7 +30,7 @@ POSSIBILITY OF SUCH DAMAGE. ******************************************************************************/ -/*$FreeBSD: src/sys/dev/ixgbe/ixgbe.c,v 1.15 2009/07/01 16:13:01 jfv Exp $*/ +/*$FreeBSD: src/sys/dev/ixgbe/ixgbe.c,v 1.17 2009/07/24 21:35:52 jfv Exp $*/ #ifdef HAVE_KERNEL_OPTION_HEADERS #include "opt_device_polling.h" @@ -539,9 +539,9 @@ /* Register for VLAN events */ adapter->vlan_attach = EVENTHANDLER_REGISTER(vlan_config, - ixgbe_register_vlan, 0, EVENTHANDLER_PRI_FIRST); + ixgbe_register_vlan, adapter, EVENTHANDLER_PRI_FIRST); adapter->vlan_detach = EVENTHANDLER_REGISTER(vlan_unconfig, - ixgbe_unregister_vlan, 0, EVENTHANDLER_PRI_FIRST); + ixgbe_unregister_vlan, adapter, EVENTHANDLER_PRI_FIRST); /* let hardware know driver is loaded */ ctrl_ext = IXGBE_READ_REG(hw, IXGBE_CTRL_EXT); @@ -2961,7 +2961,8 @@ } } #if __FreeBSD_version >= 800000 - buf_ring_free(txr->br, M_DEVBUF); + if (txr->br != NULL) + buf_ring_free(txr->br, M_DEVBUF); #endif if (txr->tx_buffers != NULL) { free(txr->tx_buffers, M_DEVBUF); @@ -4123,11 +4124,14 @@ ** repopulate the real table. */ static void -ixgbe_register_vlan(void *unused, struct ifnet *ifp, u16 vtag) +ixgbe_register_vlan(void *arg, struct ifnet *ifp, u16 vtag) { struct adapter *adapter = ifp->if_softc; u16 index, bit; + if (ifp->if_softc != arg) /* Not our event */ + return; + if ((vtag == 0) || (vtag > 4095)) /* Invalid */ return; @@ -4145,11 +4149,14 @@ ** in the soft vfta. */ static void -ixgbe_unregister_vlan(void *unused, struct ifnet *ifp, u16 vtag) +ixgbe_unregister_vlan(void *arg, struct ifnet *ifp, u16 vtag) { struct adapter *adapter = ifp->if_softc; u16 index, bit; + if (ifp->if_softc != arg) + return; + if ((vtag == 0) || (vtag > 4095)) /* Invalid */ return; ==== //depot/projects/tcp_reass/fs/procfs/procfs_map.c#5 (text+ko) ==== @@ -32,7 +32,7 @@ * * @(#)procfs_status.c 8.3 (Berkeley) 2/17/94 * - * $FreeBSD: src/sys/fs/procfs/procfs_map.c,v 1.50 2009/06/23 20:45:22 kib Exp $ + * $FreeBSD: src/sys/fs/procfs/procfs_map.c,v 1.51 2009/07/24 13:50:29 jhb Exp $ */ #include "opt_compat.h" @@ -174,6 +174,7 @@ type = "swap"; vp = NULL; break; + case OBJT_SG: case OBJT_DEVICE: type = "device"; vp = NULL; ==== //depot/projects/tcp_reass/i386/i386/pmap.c#10 (text+ko) ==== @@ -75,7 +75,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/i386/i386/pmap.c,v 1.642 2009/07/19 21:40:19 alc Exp $"); +__FBSDID("$FreeBSD: src/sys/i386/i386/pmap.c,v 1.644 2009/07/24 13:50:29 jhb Exp $"); /* * Manages physical address maps. @@ -3448,7 +3448,7 @@ int pat_mode; VM_OBJECT_LOCK_ASSERT(object, MA_OWNED); - KASSERT(object->type == OBJT_DEVICE, + KASSERT(object->type == OBJT_DEVICE || object->type == OBJT_SG, ("pmap_object_init_pt: non-device object")); if (pseflag && (addr & (NBPDR - 1)) == 0 && (size & (NBPDR - 1)) == 0) { @@ -4482,6 +4482,7 @@ pt_entry_t *pte; u_int opte, npte; pd_entry_t *pde; + boolean_t changed; base = trunc_page(va); offset = va & PAGE_MASK; @@ -4505,6 +4506,8 @@ return (EINVAL); } + changed = FALSE; + /* * Ok, all the pages exist and are 4k, so run through them updating * their cache mode. @@ -4522,6 +4525,8 @@ npte |= pmap_cache_bits(mode, 0); } while (npte != opte && !atomic_cmpset_int((u_int *)pte, opte, npte)); + if (npte != opte) + changed = TRUE; tmpva += PAGE_SIZE; size -= PAGE_SIZE; } @@ -4530,10 +4535,12 @@ * Flush CPU caches to make sure any data isn't cached that shouldn't * be, etc. */ - pmap_invalidate_range(kernel_pmap, base, tmpva); - /* If "Self Snoop" is supported, do nothing. */ - if (!(cpu_feature & CPUID_SS)) - pmap_invalidate_cache(); + if (changed) { + pmap_invalidate_range(kernel_pmap, base, tmpva); + /* If "Self Snoop" is supported, do nothing. */ + if (!(cpu_feature & CPUID_SS)) + pmap_invalidate_cache(); + } return (0); } ==== //depot/projects/tcp_reass/i386/xen/pmap.c#6 (text+ko) ==== @@ -75,7 +75,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/i386/xen/pmap.c,v 1.15 2009/07/19 21:40:19 alc Exp $"); +__FBSDID("$FreeBSD: src/sys/i386/xen/pmap.c,v 1.16 2009/07/24 13:50:29 jhb Exp $"); /* * Manages physical address maps. @@ -3093,7 +3093,7 @@ vm_page_t p; VM_OBJECT_LOCK_ASSERT(object, MA_OWNED); - KASSERT(object->type == OBJT_DEVICE, + KASSERT(object->type == OBJT_DEVICE || object->type == OBJT_SG, ("pmap_object_init_pt: non-device object")); if (pseflag && ((addr & (NBPDR - 1)) == 0) && ((size & (NBPDR - 1)) == 0)) { ==== //depot/projects/tcp_reass/ia64/ia64/pmap.c#8 (text+ko) ==== @@ -46,7 +46,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/ia64/ia64/pmap.c,v 1.205 2009/07/11 22:27:20 marcel Exp $"); +__FBSDID("$FreeBSD: src/sys/ia64/ia64/pmap.c,v 1.206 2009/07/24 13:50:29 jhb Exp $"); #include #include @@ -1751,7 +1751,7 @@ { VM_OBJECT_LOCK_ASSERT(object, MA_OWNED); - KASSERT(object->type == OBJT_DEVICE, + KASSERT(object->type == OBJT_DEVICE || object->type == OBJT_SG, ("pmap_object_init_pt: non-device object")); } ==== //depot/projects/tcp_reass/kern/kern_proc.c#7 (text+ko) ==== @@ -30,7 +30,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/kern/kern_proc.c,v 1.282 2009/06/19 17:10:35 brooks Exp $"); +__FBSDID("$FreeBSD: src/sys/kern/kern_proc.c,v 1.285 2009/07/24 19:12:19 brooks Exp $"); #include "opt_compat.h" #include "opt_ddb.h" @@ -730,11 +730,17 @@ kp->ki_uid = cred->cr_uid; kp->ki_ruid = cred->cr_ruid; kp->ki_svuid = cred->cr_svuid; - kp->ki_ngroups = cred->cr_ngroups; - kp->ki_groups = cred->cr_groups; + kp->ki_cr_flags = cred->cr_flags; + /* XXX bde doesn't like KI_NGROUPS */ + if (cred->cr_ngroups > KI_NGROUPS) { + kp->ki_ngroups = KI_NGROUPS; + kp->ki_cr_flags |= KI_CRF_GRP_OVERFLOW; + } else + kp->ki_ngroups = cred->cr_ngroups; + bcopy(cred->cr_groups, kp->ki_groups, + kp->ki_ngroups * sizeof(gid_t)); kp->ki_rgid = cred->cr_rgid; kp->ki_svgid = cred->cr_svgid; - kp->ki_cr_flags = cred->cr_flags; /* If jailed(cred), emulate the old P_JAILED flag. */ if (jailed(cred)) { kp->ki_flag |= P_JAILED; @@ -1486,6 +1492,9 @@ case OBJT_DEAD: kve->kve_type = KVME_TYPE_DEAD; break; + case OBJT_SG: + kve->kve_type = KVME_TYPE_SG; + break; default: kve->kve_type = KVME_TYPE_UNKNOWN; break; @@ -1658,6 +1667,9 @@ case OBJT_DEAD: kve->kve_type = KVME_TYPE_DEAD; break; + case OBJT_SG: + kve->kve_type = KVME_TYPE_SG; + break; default: kve->kve_type = KVME_TYPE_UNKNOWN; break; @@ -1814,6 +1826,43 @@ } #endif +/* + * This sysctl allows a process to retrieve the full list of groups from + * itself or another process. + */ +static int +sysctl_kern_proc_groups(SYSCTL_HANDLER_ARGS) +{ + pid_t *pidp = (pid_t *)arg1; + unsigned int arglen = arg2; + struct proc *p; + struct ucred *cred; + int error; + + if (arglen != 1) + return (EINVAL); + if (*pidp == -1) { /* -1 means this process */ + p = req->td->td_proc; + } else { + p = pfind(*pidp); + if (p == NULL) + return (ESRCH); + if ((error = p_cansee(curthread, p)) != 0) { + PROC_UNLOCK(p); + return (error); + } + } + + cred = crhold(p->p_ucred); + if (*pidp != -1) + PROC_UNLOCK(p); + + error = SYSCTL_OUT(req, cred->cr_groups, + cred->cr_ngroups * sizeof(gid_t)); + crfree(cred); + return (error); +} + SYSCTL_NODE(_kern, KERN_PROC, proc, CTLFLAG_RD, 0, "Process table"); SYSCTL_PROC(_kern_proc, KERN_PROC_ALL, all, CTLFLAG_RD|CTLTYPE_STRUCT| @@ -1898,3 +1947,6 @@ static SYSCTL_NODE(_kern_proc, KERN_PROC_KSTACK, kstack, CTLFLAG_RD | CTLFLAG_MPSAFE, sysctl_kern_proc_kstack, "Process kernel stacks"); #endif + +static SYSCTL_NODE(_kern_proc, KERN_PROC_GROUPS, groups, CTLFLAG_RD | + CTLFLAG_MPSAFE, sysctl_kern_proc_groups, "Process groups"); ==== //depot/projects/tcp_reass/kern/kern_vimage.c#9 (text+ko) ==== @@ -29,7 +29,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/kern/kern_vimage.c,v 1.16 2009/07/19 17:40:45 rwatson Exp $"); +__FBSDID("$FreeBSD: src/sys/kern/kern_vimage.c,v 1.17 2009/07/23 20:46:49 rwatson Exp $"); #include "opt_ddb.h" @@ -52,12 +52,6 @@ MALLOC_DEFINE(M_VNET, "vnet", "network stack control block"); -static TAILQ_HEAD(vnet_modlink_head, vnet_modlink) vnet_modlink_head; -static TAILQ_HEAD(vnet_modpending_head, vnet_modlink) vnet_modpending_head; -static void vnet_mod_complete_registration(struct vnet_modlink *); -static int vnet_mod_constructor(struct vnet_modlink *); -static int vnet_mod_destructor(struct vnet_modlink *); - struct rwlock vnet_rwlock; struct sx vnet_sxlock; @@ -130,185 +124,10 @@ return (error); } - -/* - * Kernel interfaces and handlers. - */ - -void -vnet_mod_register(const struct vnet_modinfo *vmi) -{ - - vnet_mod_register_multi(vmi, NULL, NULL); -} - -void -vnet_mod_register_multi(const struct vnet_modinfo *vmi, void *iarg, - char *iname) -{ - struct vnet_modlink *vml, *vml_iter; - - /* Do not register the same {module, iarg} pair more than once. */ - TAILQ_FOREACH(vml_iter, &vnet_modlink_head, vml_mod_le) - if (vml_iter->vml_modinfo == vmi && vml_iter->vml_iarg == iarg) - break; - if (vml_iter != NULL) - panic("registering an already registered vnet module: %s", - vml_iter->vml_modinfo->vmi_name); - vml = malloc(sizeof(struct vnet_modlink), M_VNET, M_NOWAIT); - - /* - * XXX we support only statically assigned module IDs at the time. - * In principle modules should be able to get a dynamically - * assigned ID at registration time. - * - * If a module is registered in multiple instances, then each - * instance must have both iarg and iname set. - */ - if (vmi->vmi_id >= VNET_MOD_MAX) - panic("invalid vnet module ID: %d", vmi->vmi_id); - if (vmi->vmi_name == NULL) - panic("vnet module with no name: %d", vmi->vmi_id); - if ((iarg == NULL) ^ (iname == NULL)) - panic("invalid vnet module instance: %s", vmi->vmi_name); - - vml->vml_modinfo = vmi; - vml->vml_iarg = iarg; - vml->vml_iname = iname; - - /* Check whether the module we depend on is already registered. */ - if (vmi->vmi_dependson != vmi->vmi_id) { - TAILQ_FOREACH(vml_iter, &vnet_modlink_head, vml_mod_le) - if (vml_iter->vml_modinfo->vmi_id == - vmi->vmi_dependson) - break; /* Depencency found, we are done. */ - if (vml_iter == NULL) { -#ifdef DEBUG_ORDERING - printf("dependency %d missing for vnet mod %s," - "postponing registration\n", - vmi->vmi_dependson, vmi->vmi_name); -#endif /* DEBUG_ORDERING */ - TAILQ_INSERT_TAIL(&vnet_modpending_head, vml, - vml_mod_le); - return; - } - } - - vnet_mod_complete_registration(vml); -} - -void -vnet_mod_complete_registration(struct vnet_modlink *vml) -{ - VNET_ITERATOR_DECL(vnet_iter); - struct vnet_modlink *vml_iter; - - TAILQ_INSERT_TAIL(&vnet_modlink_head, vml, vml_mod_le); - - VNET_FOREACH(vnet_iter) { - CURVNET_SET_QUIET(vnet_iter); - vnet_mod_constructor(vml); - CURVNET_RESTORE(); - } - - /* Check for pending modules depending on us. */ - do { - TAILQ_FOREACH(vml_iter, &vnet_modpending_head, vml_mod_le) - if (vml_iter->vml_modinfo->vmi_dependson == - vml->vml_modinfo->vmi_id) - break; - if (vml_iter != NULL) { -#ifdef DEBUG_ORDERING - printf("vnet mod %s now registering," - "dependency %d loaded\n", - vml_iter->vml_modinfo->vmi_name, - vml->vml_modinfo->vmi_id); -#endif /* DEBUG_ORDERING */ - TAILQ_REMOVE(&vnet_modpending_head, vml_iter, - vml_mod_le); - vnet_mod_complete_registration(vml_iter); - } - } while (vml_iter != NULL); -} - -void -vnet_mod_deregister(const struct vnet_modinfo *vmi) -{ - - vnet_mod_deregister_multi(vmi, NULL, NULL); -} - -void -vnet_mod_deregister_multi(const struct vnet_modinfo *vmi, void *iarg, - char *iname) -{ - VNET_ITERATOR_DECL(vnet_iter); - struct vnet_modlink *vml; - - TAILQ_FOREACH(vml, &vnet_modlink_head, vml_mod_le) - if (vml->vml_modinfo == vmi && vml->vml_iarg == iarg) - break; - if (vml == NULL) - panic("cannot deregister unregistered vnet module %s", - vmi->vmi_name); - - VNET_FOREACH(vnet_iter) { - CURVNET_SET_QUIET(vnet_iter); - vnet_mod_destructor(vml); - CURVNET_RESTORE(); - } - - TAILQ_REMOVE(&vnet_modlink_head, vml, vml_mod_le); - free(vml, M_VNET); -} - -static int -vnet_mod_constructor(struct vnet_modlink *vml) -{ - const struct vnet_modinfo *vmi = vml->vml_modinfo; - -#ifdef DEBUG_ORDERING - printf("instantiating vnet_%s", vmi->vmi_name); - if (vml->vml_iarg) - printf("/%s", vml->vml_iname); - printf(": "); - if (vmi->vmi_iattach != NULL) - printf("iattach()"); - printf("\n"); -#endif - - if (vmi->vmi_iattach != NULL) - vmi->vmi_iattach(vml->vml_iarg); - - return (0); -} - -static int -vnet_mod_destructor(struct vnet_modlink *vml) -{ - const struct vnet_modinfo *vmi = vml->vml_modinfo; - -#ifdef DEBUG_ORDERING - printf("destroying vnet_%s", vmi->vmi_name); - if (vml->vml_iarg) - printf("/%s", vml->vml_iname); - printf(": "); - if (vmi->vmi_idetach != NULL) - printf("idetach(); "); - printf("\n"); -#endif - - if (vmi->vmi_idetach) - vmi->vmi_idetach(vml->vml_iarg); - - return (0); -} - struct vnet * vnet_alloc(void) { struct vnet *vnet; - struct vnet_modlink *vml; vnet = malloc(sizeof(struct vnet), M_VNET, M_WAITOK | M_ZERO); vnet->vnet_magic_n = VNET_MAGIC_N; @@ -316,11 +135,12 @@ /* Initialize / attach vnet module instances. */ CURVNET_SET_QUIET(vnet); - TAILQ_FOREACH(vml, &vnet_modlink_head, vml_mod_le) - vnet_mod_constructor(vml); + + sx_xlock(&vnet_sxlock); + vnet_sysinit(); CURVNET_RESTORE(); - VNET_LIST_WLOCK(); + rw_wlock(&vnet_rwlock); LIST_INSERT_HEAD(&vnet_head, vnet, vnet_le); VNET_LIST_WUNLOCK(); @@ -331,14 +151,13 @@ vnet_destroy(struct vnet *vnet) { struct ifnet *ifp, *nifp; - struct vnet_modlink *vml; KASSERT(vnet->vnet_sockcnt == 0, ("%s: vnet still has sockets", __func__)); VNET_LIST_WLOCK(); LIST_REMOVE(vnet, vnet_le); - VNET_LIST_WUNLOCK(); + rw_wunlock(&vnet_rwlock); CURVNET_SET_QUIET(vnet); @@ -348,10 +167,8 @@ if_vmove(ifp, ifp->if_home_vnet); } - /* Detach / free per-module state instances. */ - TAILQ_FOREACH_REVERSE(vml, &vnet_modlink_head, - vnet_modlink_head, vml_mod_le) - vnet_mod_destructor(vml); + vnet_sysuninit(); + sx_xunlock(&vnet_sxlock); CURVNET_RESTORE(); @@ -387,9 +204,6 @@ vnet0_init(void *arg) { - TAILQ_INIT(&vnet_modlink_head); - TAILQ_INIT(&vnet_modpending_head); - /* * We MUST clear curvnet in vi_init_done() before going SMP, * otherwise CURVNET_SET() macros would scream about unnecessary @@ -402,20 +216,8 @@ static void vnet_init_done(void *unused) { - struct vnet_modlink *vml_iter; curvnet = NULL; - - if (TAILQ_EMPTY(&vnet_modpending_head)) - return; - - printf("vnet modules with unresolved dependencies:\n"); - TAILQ_FOREACH(vml_iter, &vnet_modpending_head, vml_mod_le) - printf(" %d:%s depending on %d\n", - vml_iter->vml_modinfo->vmi_id, - vml_iter->vml_modinfo->vmi_name, - vml_iter->vml_modinfo->vmi_dependson); - panic("going nowhere without my vnet modules!"); } SYSINIT(vnet_init_done, SI_SUB_VNET_DONE, SI_ORDER_FIRST, vnet_init_done, ==== //depot/projects/tcp_reass/kern/uipc_domain.c#7 (text+ko) ==== @@ -30,7 +30,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/kern/uipc_domain.c,v 1.59 2009/07/14 22:48:30 rwatson Exp $"); +__FBSDID("$FreeBSD: src/sys/kern/uipc_domain.c,v 1.60 2009/07/23 20:46:49 rwatson Exp $"); #include #include @@ -59,17 +59,12 @@ */ static void domaininit(void *); -SYSINIT(domain, SI_SUB_PROTO_DOMAIN, SI_ORDER_FIRST, domaininit, NULL); +SYSINIT(domain, SI_SUB_PROTO_DOMAININIT, SI_ORDER_ANY, domaininit, NULL); static void domainfinalize(void *); SYSINIT(domainfin, SI_SUB_PROTO_IFATTACHDOMAIN, SI_ORDER_FIRST, domainfinalize, NULL); -static vnet_attach_fn net_init_domain; -#ifdef VIMAGE -static vnet_detach_fn net_detach_domain; -#endif - static struct callout pffast_callout; static struct callout pfslow_callout; @@ -106,15 +101,6 @@ .pru_sopoll = pru_sopoll_notsupp, }; -#ifdef VIMAGE -vnet_modinfo_t vnet_domain_modinfo = { - .vmi_id = VNET_MOD_DOMAIN, - .vmi_name = "domain", - .vmi_iattach = net_init_domain, - .vmi_idetach = net_detach_domain, -}; -#endif - static void protosw_init(struct protosw *pr) { @@ -174,10 +160,10 @@ * Note: you cant unload it again because a socket may be using it. * XXX can't fail at this time. */ -static int -net_init_domain(const void *arg) +void +domain_init(void *arg) { - const struct domain *dp = arg; + struct domain *dp = arg; struct protosw *pr; if (dp->dom_init) @@ -191,17 +177,21 @@ max_datalen = MHLEN - max_hdr; if (max_datalen < 1) panic("%s: max_datalen < 1", __func__); - return (0); } #ifdef VIMAGE -/* - * Detach / free a domain instance. - */ -static int -net_detach_domain(const void *arg) +void +vnet_domain_init(void *arg) +{ + + /* Virtualized case is no different -- call init functions. */ + domain_init(arg); +} + +void +vnet_domain_uninit(void *arg) { - const struct domain *dp = arg; + struct domain *dp = arg; struct protosw *pr; >>> TRUNCATED FOR MAIL (1000 lines) <<<