PERFORCE change 166554 for review
Andre Oppermann
andre at FreeBSD.org
Sat Jul 25 13:17:40 UTC 2009
http://perforce.freebsd.org/chv.cgi?CH=166554
Change 166554 by andre at 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) <<<
More information about the p4-projects
mailing list