Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 25 Jul 2009 13:17:38 GMT
From:      Andre Oppermann <andre@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 166554 for review
Message-ID:  <200907251317.n6PDHct7005253@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
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 <sys/cdefs.h>
-__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 <sys/cdefs.h>
-__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 <sys/param.h>
 #include <sys/systm.h>
 #include <sys/kernel.h>
@@ -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 <sys/cdefs.h>
-__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 <sys/cdefs.h>
-__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 <sys/cdefs.h>
-__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 <sys/param.h>
 #include <sys/kernel.h>
@@ -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 <sys/cdefs.h>
-__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 <sys/cdefs.h>
-__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 <sys/cdefs.h>
-__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 <sys/param.h>
 #include <sys/socket.h>
@@ -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) <<<



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