From mm@neo.vx.sk  Mon Oct 14 11:27:08 2013
Return-Path: <mm@neo.vx.sk>
Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115])
	(using TLSv1 with cipher ADH-AES256-SHA (256/256 bits))
	(No client certificate requested)
	by hub.freebsd.org (Postfix) with ESMTP id B54774C7
	for <FreeBSD-gnats-submit@freebsd.org>; Mon, 14 Oct 2013 11:27:08 +0000 (UTC)
	(envelope-from mm@neo.vx.sk)
Received: from neo.vx.sk (neo.vx.sk [176.9.47.205])
	by mx1.freebsd.org (Postfix) with ESMTP id 3C9292F69
	for <FreeBSD-gnats-submit@freebsd.org>; Mon, 14 Oct 2013 11:27:07 +0000 (UTC)
Received: by neo.vx.sk (Postfix, from userid 1001)
	id 469AC50CC; Mon, 14 Oct 2013 13:21:46 +0200 (CEST)
Message-Id: <20131014112146.469AC50CC@neo.vx.sk>
Date: Mon, 14 Oct 2013 13:21:46 +0200 (CEST)
From: Martin Matuska <mm@freebsd.org>
Reply-To: Martin Matuska <mm@freebsd.org>
To: FreeBSD-gnats-submit@freebsd.org
Cc:
Subject: [pf] panics on 10-BETA1 r256398 with VIMAGE and pf
X-Send-Pr-Version: 3.114
X-GNATS-Notify:

>Number:         182964
>Category:       kern
>Synopsis:       [pf] panics on 10-BETA1 r256398 with VIMAGE and pf
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    mm
>State:          closed
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Mon Oct 14 11:30:00 UTC 2013
>Closed-Date:    Thu May 08 05:55:01 UTC 2014
>Last-Modified:  Thu May 08 05:55:01 UTC 2014
>Originator:     Martin Matuska
>Release:        FreeBSD 10.0-BETA1 amd64
>Organization:
>Environment:
>Description:
10-BETA1 r256398 kernel panics if using VIMAGE and pf 
Panic 1:
pf_mtag_free() tries to access a virtualized variable but is called from
outside VNET

#0  doadump (textdump=<value optimized out>) at pcpu.h:219
219     pcpu.h: No such file or directory.
        in pcpu.h
(kgdb) #0  doadump (textdump=<value optimized out>) at pcpu.h:219
#1  0xffffffff804a4450 in kern_reboot (howto=260)
    at /usr/src/sys/kern/kern_shutdown.c:447
#2  0xffffffff804a4814 in panic (fmt=<value optimized out>)
    at /usr/src/sys/kern/kern_shutdown.c:754
#3  0xffffffff8070c3d2 in trap_fatal (frame=<value optimized out>,
    eva=<value optimized out>) at /usr/src/sys/amd64/amd64/trap.c:882
#4  0xffffffff8070c6a9 in trap_pfault (frame=0xfffffe03de1a3800, usermode=0)
    at /usr/src/sys/amd64/amd64/trap.c:699
#5  0xffffffff8070be36 in trap (frame=0xfffffe03de1a3800)
    at /usr/src/sys/amd64/amd64/trap.c:463
#6  0xffffffff806f3212 in calltrap ()
    at /usr/src/sys/amd64/amd64/exception.S:232
#7  0xffffffff8122cb47 in pf_mtag_free (t=0xfffff80111a2f2d0)
    at /usr/src/sys/modules/pf/../../netpfil/pf/pf.c:830
#8  0xffffffff806cd0b0 in uma_zfree_arg (zone=0xfffff8043fdb2000,
    item=0xfffff8011113dd00, udata=0x0) at /usr/src/sys/vm/uma_core.c:2549
#9  0xffffffff8050bd33 in m_freem (mb=<value optimized out>) at uma.h:364
#10 0xffffffff8038ab70 in re_txeof (sc=0xfffffe00009d1000)
    at /usr/src/sys/dev/re/if_re.c:2388
#11 0xffffffff8038ca0d in re_intr_msi (xsc=0xfffffe00009d1000)
    at /usr/src/sys/dev/re/if_re.c:2652
#12 0xffffffff8047897b in intr_event_execute_handlers (
    p=<value optimized out>, ie=0xfffff80005511a00)
    at /usr/src/sys/kern/kern_intr.c:1263
#13 0xffffffff80478dc6 in ithread_loop (arg=0xfffff80005521080)
    at /usr/src/sys/kern/kern_intr.c:1276
#14 0xffffffff8047654a in fork_exit (
    callout=0xffffffff80478d30 <ithread_loop>, arg=0xfffff80005521080,
    frame=0xfffffe03de1a3ac0) at /usr/src/sys/kern/kern_fork.c:995
#15 0xffffffff806f374e in fork_trampoline ()
    at /usr/src/sys/amd64/amd64/exception.S:606
#16 0x0000000000000000 in ?? ()

Panic 2Ö::
pf_overload_task() tries to access virtualized variables but is called
from outside VNET

#0  doadump (textdump=<value optimized out>) at pcpu.h:219
219     pcpu.h: No such file or directory.
        in pcpu.h
(kgdb) #0  doadump (textdump=<value optimized out>) at pcpu.h:219
#1  0xffffffff804a4450 in kern_reboot (howto=260)
    at /usr/src/sys/kern/kern_shutdown.c:447
#2  0xffffffff804a4814 in panic (fmt=<value optimized out>)
    at /usr/src/sys/kern/kern_shutdown.c:754
#3  0xffffffff8070c3d2 in trap_fatal (frame=<value optimized out>,
    eva=<value optimized out>) at /usr/src/sys/amd64/amd64/trap.c:882
#4  0xffffffff8070c6a9 in trap_pfault (frame=0xfffffe045276f860, usermode=0)
    at /usr/src/sys/amd64/amd64/trap.c:699
#5  0xffffffff8070be36 in trap (frame=0xfffffe045276f860)
    at /usr/src/sys/amd64/amd64/trap.c:463
#6  0xffffffff806f3212 in calltrap ()
    at /usr/src/sys/amd64/amd64/exception.S:232
#7  0xffffffff8121d890 in pf_overload_task (c=<value optimized out>,
    pending=20) at /usr/src/sys/modules/pf/../../netpfil/pf/pf.c:526
#8  0xffffffff804eae86 in taskqueue_run_locked (queue=0xfffff80003f30a00)
    at /usr/src/sys/kern/subr_taskqueue.c:333
#9  0xffffffff804ead41 in taskqueue_run (queue=0xfffff80003f30a00)
    at /usr/src/sys/kern/subr_taskqueue.c:347
#10 0xffffffff8047897b in intr_event_execute_handlers (
    p=<value optimized out>, ie=0xfffff80003f30900)
    at /usr/src/sys/kern/kern_intr.c:1263
#11 0xffffffff80478dc6 in ithread_loop (arg=0xfffff800053a0660)
    at /usr/src/sys/kern/kern_intr.c:1276
#12 0xffffffff8047654a in fork_exit (
    callout=0xffffffff80478d30 <ithread_loop>, arg=0xfffff800053a0660,
    frame=0xfffffe045276fac0) at /usr/src/sys/kern/kern_fork.c:995
#13 0xffffffff806f374e in fork_trampoline ()
    at /usr/src/sys/amd64/amd64/exception.S:606
#14 0x0000000000000000 in ?? ()

>How-To-Repeat:
>Fix:

Onee of possible fixes for Panic 1:
devirtualize V_pf_mtag_z (as discussed on freebsd-pf mailing list)

Index: sys/netpfil/pf/pf.c
===================================================================
--- sys/netpfil/pf/pf.c	(revision 256398)
+++ sys/netpfil/pf/pf.c	(working copy)
@@ -187,8 +187,7 @@
 
 static VNET_DEFINE(uma_zone_t,	pf_sources_z);
 #define	V_pf_sources_z	VNET(pf_sources_z)
-static VNET_DEFINE(uma_zone_t,	pf_mtag_z);
-#define	V_pf_mtag_z	VNET(pf_mtag_z)
+uma_zone_t pf_mtag_z;
 VNET_DEFINE(uma_zone_t,	 pf_state_z);
 VNET_DEFINE(uma_zone_t,	 pf_state_key_z);
 
@@ -749,9 +748,10 @@
 	V_pf_altqs_inactive = &V_pf_altqs[1];
 
 	/* Mbuf tags */
-	V_pf_mtag_z = uma_zcreate("pf mtags", sizeof(struct m_tag) +
-	    sizeof(struct pf_mtag), NULL, NULL, pf_mtag_init, NULL,
-	    UMA_ALIGN_PTR, 0);
+	if (IS_DEFAULT_VNET(curvnet))
+		pf_mtag_z = uma_zcreate("pf mtags", sizeof(struct m_tag) +
+		    sizeof(struct pf_mtag), NULL, NULL, pf_mtag_init, NULL,
+		    UMA_ALIGN_PTR, 0);
 
 	/* Send & overload+flush queues. */
 	STAILQ_INIT(&V_pf_sendqueue);
@@ -803,7 +803,8 @@
 	mtx_destroy(&pf_overloadqueue_mtx);
 	mtx_destroy(&pf_unlnkdrules_mtx);
 
-	uma_zdestroy(V_pf_mtag_z);
+	if (IS_DEFAULT_VNET(curvnet))
+		uma_zdestroy(pf_mtag_z);
 	uma_zdestroy(V_pf_sources_z);
 	uma_zdestroy(V_pf_state_z);
 	uma_zdestroy(V_pf_state_key_z);
@@ -827,7 +828,7 @@
 pf_mtag_free(struct m_tag *t)
 {
 
-	uma_zfree(V_pf_mtag_z, t);
+	uma_zfree(pf_mtag_z, t);
 }
 
 struct pf_mtag *
@@ -838,7 +839,7 @@
 	if ((mtag = m_tag_find(m, PACKET_TAG_PF, NULL)) != NULL)
 		return ((struct pf_mtag *)(mtag + 1));
 
-	mtag = uma_zalloc(V_pf_mtag_z, M_NOWAIT);
+	mtag = uma_zalloc(pf_mtag_z, M_NOWAIT);
 	if (mtag == NULL)
 		return (NULL);
 	bzero(mtag + 1, sizeof(struct pf_mtag));
>Release-Note:
>Audit-Trail:

From: Javier Villavicencio <the_paya@gentoo.org>
To: bug-followup@FreeBSD.org, mm@freebsd.org
Cc:  
Subject: Re: kern/182964: [pf] panics on 10-BETA1 r256398 with VIMAGE and
 pf
Date: Sun, 17 Nov 2013 14:52:13 -0300

 Hello, I have the exact same panics with VIMAGE and pf on 10.0-BETA3.
 
 Following the discussion at [1] and the commit [2] being reverted in 
 r256729, I was wondering if there would
 be any proper solution out there before 10.0-RELEASE, and, if this combo 
 (pf+VIMAGE) doesn't panic in 9-STABLE?
 
 [1] 
 http://docs.freebsd.org/cgi/getmsg.cgi?fetch=43853+0+archive/2013/freebsd-pf/20131020.freebsd-pf
 [2] http://svnweb.freebsd.org/base?view=revision&amp;revision=256587

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: kern/182964: commit references a PR
Date: Tue, 18 Feb 2014 22:17:26 +0000 (UTC)

 Author: mm
 Date: Tue Feb 18 22:17:12 2014
 New Revision: 262196
 URL: http://svnweb.freebsd.org/changeset/base/262196
 
 Log:
   De-virtualize pf_mtag_z [1]
   Process V_pf_overloadqueue in vnet context [2]
   
   This fixes two VIMAGE kernel panics and allows to simultaneously run host-pf
   and vnet jails. pf inside jails remains broken.
   
   PR:		kern/182964
   Submitted by:	glebius@FreeBSD.org [2], myself [1]
   Tested by:	rodrigc@FreeBSD.org, myself
   MFC after:	2 weeks
 
 Modified:
   head/sys/netpfil/pf/pf.c
 
 Modified: head/sys/netpfil/pf/pf.c
 ==============================================================================
 --- head/sys/netpfil/pf/pf.c	Tue Feb 18 22:16:24 2014	(r262195)
 +++ head/sys/netpfil/pf/pf.c	Tue Feb 18 22:17:12 2014	(r262196)
 @@ -172,7 +172,10 @@ struct pf_overload_entry {
  	struct pf_rule  		*rule;
  };
  
 -SLIST_HEAD(pf_overload_head, pf_overload_entry);
 +struct pf_overload_head {
 +	SLIST_HEAD(, pf_overload_entry) head;
 +	struct vnet			*vnet;
 +};
  static VNET_DEFINE(struct pf_overload_head, pf_overloadqueue);
  #define V_pf_overloadqueue	VNET(pf_overloadqueue)
  static VNET_DEFINE(struct task, pf_overloadtask);
 @@ -187,8 +190,7 @@ struct mtx pf_unlnkdrules_mtx;
  
  static VNET_DEFINE(uma_zone_t,	pf_sources_z);
  #define	V_pf_sources_z	VNET(pf_sources_z)
 -static VNET_DEFINE(uma_zone_t,	pf_mtag_z);
 -#define	V_pf_mtag_z	VNET(pf_mtag_z)
 +uma_zone_t pf_mtag_z;
  VNET_DEFINE(uma_zone_t,	 pf_state_z);
  VNET_DEFINE(uma_zone_t,	 pf_state_key_z);
  
 @@ -510,7 +512,7 @@ pf_src_connlimit(struct pf_state **state
  	pfoe->rule = (*state)->rule.ptr;
  	pfoe->dir = (*state)->direction;
  	PF_OVERLOADQ_LOCK();
 -	SLIST_INSERT_HEAD(&V_pf_overloadqueue, pfoe, next);
 +	SLIST_INSERT_HEAD(&V_pf_overloadqueue.head, pfoe, next);
  	PF_OVERLOADQ_UNLOCK();
  	taskqueue_enqueue(taskqueue_swi, &V_pf_overloadtask);
  
 @@ -527,11 +529,13 @@ pf_overload_task(void *c, int pending)
  
  	PF_OVERLOADQ_LOCK();
  	queue = *(struct pf_overload_head *)c;
 -	SLIST_INIT((struct pf_overload_head *)c);
 +	SLIST_INIT(&((struct pf_overload_head *)c)->head);
  	PF_OVERLOADQ_UNLOCK();
  
 +	CURVNET_SET(queue.vnet);
 +
  	bzero(&p, sizeof(p));
 -	SLIST_FOREACH(pfoe, &queue, next) {
 +	SLIST_FOREACH(pfoe, &queue.head, next) {
  		V_pf_status.lcounters[LCNT_OVERLOAD_TABLE]++;
  		if (V_pf_status.debug >= PF_DEBUG_MISC) {
  			printf("%s: blocking address ", __func__);
 @@ -563,16 +567,18 @@ pf_overload_task(void *c, int pending)
  	/*
  	 * Remove those entries, that don't need flushing.
  	 */
 -	SLIST_FOREACH_SAFE(pfoe, &queue, next, pfoe1)
 +	SLIST_FOREACH_SAFE(pfoe, &queue.head, next, pfoe1)
  		if (pfoe->rule->flush == 0) {
 -			SLIST_REMOVE(&queue, pfoe, pf_overload_entry, next);
 +			SLIST_REMOVE(&queue.head, pfoe, pf_overload_entry, next);
  			free(pfoe, M_PFTEMP);
  		} else
  			V_pf_status.lcounters[LCNT_OVERLOAD_FLUSH]++;
  
  	/* If nothing to flush, return. */
 -	if (SLIST_EMPTY(&queue))
 +	if (SLIST_EMPTY(&queue.head)) {
 +		CURVNET_RESTORE();
  		return;
 +	}
  
  	for (int i = 0; i <= V_pf_hashmask; i++) {
  		struct pf_idhash *ih = &V_pf_idhash[i];
 @@ -582,7 +588,7 @@ pf_overload_task(void *c, int pending)
  		PF_HASHROW_LOCK(ih);
  		LIST_FOREACH(s, &ih->states, entry) {
  		    sk = s->key[PF_SK_WIRE];
 -		    SLIST_FOREACH(pfoe, &queue, next)
 +		    SLIST_FOREACH(pfoe, &queue.head, next)
  			if (sk->af == pfoe->af &&
  			    ((pfoe->rule->flush & PF_FLUSH_GLOBAL) ||
  			    pfoe->rule == s->rule.ptr) &&
 @@ -597,10 +603,12 @@ pf_overload_task(void *c, int pending)
  		}
  		PF_HASHROW_UNLOCK(ih);
  	}
 -	SLIST_FOREACH_SAFE(pfoe, &queue, next, pfoe1)
 +	SLIST_FOREACH_SAFE(pfoe, &queue.head, next, pfoe1)
  		free(pfoe, M_PFTEMP);
  	if (V_pf_status.debug >= PF_DEBUG_MISC)
  		printf("%s: %u states killed", __func__, killed);
 +
 +	CURVNET_RESTORE();
  }
  
  /*
 @@ -790,14 +798,16 @@ pf_initialize()
  	V_pf_altqs_inactive = &V_pf_altqs[1];
  
  	/* Mbuf tags */
 -	V_pf_mtag_z = uma_zcreate("pf mtags", sizeof(struct m_tag) +
 -	    sizeof(struct pf_mtag), NULL, NULL, pf_mtag_init, NULL,
 -	    UMA_ALIGN_PTR, 0);
 +	if (IS_DEFAULT_VNET(curvnet))
 +		pf_mtag_z = uma_zcreate("pf mtags", sizeof(struct m_tag) +
 +		    sizeof(struct pf_mtag), NULL, NULL, pf_mtag_init, NULL,
 +		    UMA_ALIGN_PTR, 0);
  
  	/* Send & overload+flush queues. */
  	STAILQ_INIT(&V_pf_sendqueue);
 -	SLIST_INIT(&V_pf_overloadqueue);
 +	SLIST_INIT(&V_pf_overloadqueue.head);
  	TASK_INIT(&V_pf_overloadtask, 0, pf_overload_task, &V_pf_overloadqueue);
 +	V_pf_overloadqueue.vnet = curvnet;
  	mtx_init(&pf_sendqueue_mtx, "pf send queue", NULL, MTX_DEF);
  	mtx_init(&pf_overloadqueue_mtx, "pf overload/flush queue", NULL,
  	    MTX_DEF);
 @@ -844,7 +854,8 @@ pf_cleanup()
  	mtx_destroy(&pf_overloadqueue_mtx);
  	mtx_destroy(&pf_unlnkdrules_mtx);
  
 -	uma_zdestroy(V_pf_mtag_z);
 +	if (IS_DEFAULT_VNET(curvnet))
 +		uma_zdestroy(pf_mtag_z);
  	uma_zdestroy(V_pf_sources_z);
  	uma_zdestroy(V_pf_state_z);
  	uma_zdestroy(V_pf_state_key_z);
 @@ -868,7 +879,7 @@ static void
  pf_mtag_free(struct m_tag *t)
  {
  
 -	uma_zfree(V_pf_mtag_z, t);
 +	uma_zfree(pf_mtag_z, t);
  }
  
  struct pf_mtag *
 @@ -879,7 +890,7 @@ pf_get_mtag(struct mbuf *m)
  	if ((mtag = m_tag_find(m, PACKET_TAG_PF, NULL)) != NULL)
  		return ((struct pf_mtag *)(mtag + 1));
  
 -	mtag = uma_zalloc(V_pf_mtag_z, M_NOWAIT);
 +	mtag = uma_zalloc(pf_mtag_z, M_NOWAIT);
  	if (mtag == NULL)
  		return (NULL);
  	bzero(mtag + 1, sizeof(struct pf_mtag));
 @@ -1675,7 +1686,7 @@ pf_purge_unlinked_rules()
  	 * an already unlinked rule.
  	 */
  	PF_OVERLOADQ_LOCK();
 -	if (!SLIST_EMPTY(&V_pf_overloadqueue)) {
 +	if (!SLIST_EMPTY(&V_pf_overloadqueue.head)) {
  		PF_OVERLOADQ_UNLOCK();
  		return;
  	}
 _______________________________________________
 svn-src-all@freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/svn-src-all
 To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
 
State-Changed-From-To: open->patched 
State-Changed-By: linimon 
State-Changed-When: Sun Apr 20 01:48:45 UTC 2014 
State-Changed-Why:  
over to committer for possible MFC. 


Responsible-Changed-From-To: freebsd-bugs->mm 
Responsible-Changed-By: linimon 
Responsible-Changed-When: Sun Apr 20 01:48:45 UTC 2014 
Responsible-Changed-Why:  

http://www.freebsd.org/cgi/query-pr.cgi?pr=182964 

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: kern/182964: commit references a PR
Date: Sun, 27 Apr 2014 09:05:39 +0000 (UTC)

 Author: mm
 Date: Sun Apr 27 09:05:34 2014
 New Revision: 265008
 URL: http://svnweb.freebsd.org/changeset/base/265008
 
 Log:
   MFC r264689:
   De-virtualize UMA zone pf_mtag_z and move to global initialization part.
   
   The m_tag struct does not know about vnet context and the pf_mtag_free()
   callback is called unaware of current vnet. This causes a panic.
   
   PR:		kern/182964
 
 Modified:
   stable/10/sys/net/pfvar.h
   stable/10/sys/netpfil/pf/pf.c
   stable/10/sys/netpfil/pf/pf_ioctl.c
 Directory Properties:
   stable/10/   (props changed)
 
 Modified: stable/10/sys/net/pfvar.h
 ==============================================================================
 --- stable/10/sys/net/pfvar.h	Sun Apr 27 08:22:44 2014	(r265007)
 +++ stable/10/sys/net/pfvar.h	Sun Apr 27 09:05:34 2014	(r265008)
 @@ -1531,6 +1531,8 @@ VNET_DECLARE(struct pf_rulequeue, pf_unl
  #define	V_pf_unlinked_rules	VNET(pf_unlinked_rules)
  
  void				 pf_initialize(void);
 +void				 pf_mtag_initialize(void);
 +void				 pf_mtag_cleanup(void);
  void				 pf_cleanup(void);
  
  struct pf_mtag			*pf_get_mtag(struct mbuf *);
 
 Modified: stable/10/sys/netpfil/pf/pf.c
 ==============================================================================
 --- stable/10/sys/netpfil/pf/pf.c	Sun Apr 27 08:22:44 2014	(r265007)
 +++ stable/10/sys/netpfil/pf/pf.c	Sun Apr 27 09:05:34 2014	(r265008)
 @@ -186,8 +186,7 @@ struct mtx pf_unlnkdrules_mtx;
  
  static VNET_DEFINE(uma_zone_t,	pf_sources_z);
  #define	V_pf_sources_z	VNET(pf_sources_z)
 -static VNET_DEFINE(uma_zone_t,	pf_mtag_z);
 -#define	V_pf_mtag_z	VNET(pf_mtag_z)
 +uma_zone_t		pf_mtag_z;
  VNET_DEFINE(uma_zone_t,	 pf_state_z);
  VNET_DEFINE(uma_zone_t,	 pf_state_key_z);
  
 @@ -282,7 +281,7 @@ static int		 pf_insert_src_node(struct p
  			    struct pf_rule *, struct pf_addr *, sa_family_t);
  static u_int		 pf_purge_expired_states(u_int, int);
  static void		 pf_purge_unlinked_rules(void);
 -static int		 pf_mtag_init(void *, int, int);
 +static int		 pf_mtag_uminit(void *, int, int);
  static void		 pf_mtag_free(struct m_tag *);
  #ifdef INET
  static void		 pf_route(struct mbuf **, struct pf_rule *, int,
 @@ -727,7 +726,16 @@ pf_free_src_nodes(struct pf_src_node_lis
  	return (count);
  }
  
 -/* Data storage structures initialization. */
 +void
 +pf_mtag_initialize()
 +{
 +
 +	pf_mtag_z = uma_zcreate("pf mtags", sizeof(struct m_tag) +
 +	    sizeof(struct pf_mtag), NULL, NULL, pf_mtag_uminit, NULL,
 +	    UMA_ALIGN_PTR, 0);
 +}
 +
 +/* Per-vnet data storage structures initialization. */
  void
  pf_initialize()
  {
 @@ -786,10 +794,6 @@ pf_initialize()
  	V_pf_altqs_active = &V_pf_altqs[0];
  	V_pf_altqs_inactive = &V_pf_altqs[1];
  
 -	/* Mbuf tags */
 -	V_pf_mtag_z = uma_zcreate("pf mtags", sizeof(struct m_tag) +
 -	    sizeof(struct pf_mtag), NULL, NULL, pf_mtag_init, NULL,
 -	    UMA_ALIGN_PTR, 0);
  
  	/* Send & overload+flush queues. */
  	STAILQ_INIT(&V_pf_sendqueue);
 @@ -805,6 +809,13 @@ pf_initialize()
  }
  
  void
 +pf_mtag_cleanup()
 +{
 +
 +	uma_zdestroy(pf_mtag_z);
 +}
 +
 +void
  pf_cleanup()
  {
  	struct pf_keyhash	*kh;
 @@ -841,14 +852,13 @@ pf_cleanup()
  	mtx_destroy(&pf_overloadqueue_mtx);
  	mtx_destroy(&pf_unlnkdrules_mtx);
  
 -	uma_zdestroy(V_pf_mtag_z);
  	uma_zdestroy(V_pf_sources_z);
  	uma_zdestroy(V_pf_state_z);
  	uma_zdestroy(V_pf_state_key_z);
  }
  
  static int
 -pf_mtag_init(void *mem, int size, int how)
 +pf_mtag_uminit(void *mem, int size, int how)
  {
  	struct m_tag *t;
  
 @@ -865,7 +875,7 @@ static void
  pf_mtag_free(struct m_tag *t)
  {
  
 -	uma_zfree(V_pf_mtag_z, t);
 +	uma_zfree(pf_mtag_z, t);
  }
  
  struct pf_mtag *
 @@ -876,7 +886,7 @@ pf_get_mtag(struct mbuf *m)
  	if ((mtag = m_tag_find(m, PACKET_TAG_PF, NULL)) != NULL)
  		return ((struct pf_mtag *)(mtag + 1));
  
 -	mtag = uma_zalloc(V_pf_mtag_z, M_NOWAIT);
 +	mtag = uma_zalloc(pf_mtag_z, M_NOWAIT);
  	if (mtag == NULL)
  		return (NULL);
  	bzero(mtag + 1, sizeof(struct pf_mtag));
 
 Modified: stable/10/sys/netpfil/pf/pf_ioctl.c
 ==============================================================================
 --- stable/10/sys/netpfil/pf/pf_ioctl.c	Sun Apr 27 08:22:44 2014	(r265007)
 +++ stable/10/sys/netpfil/pf/pf_ioctl.c	Sun Apr 27 09:05:34 2014	(r265008)
 @@ -204,6 +204,8 @@ pfattach(void)
  	u_int32_t *my_timeout = V_pf_default_rule.timeout;
  	int error;
  
 +	if (IS_DEFAULT_VNET(curvnet))
 +		pf_mtag_initialize();
  	pf_initialize();
  	pfr_initialize();
  	pfi_initialize();
 @@ -3721,6 +3723,8 @@ pf_unload(void)
  	pfr_cleanup();
  	pf_osfp_flush();
  	pf_cleanup();
 +	if (IS_DEFAULT_VNET(curvnet))
 +		pf_mtag_cleanup();
  	PF_RULES_WUNLOCK();
  	destroy_dev(pf_dev);
  	rw_destroy(&pf_rules_lock);
 _______________________________________________
 svn-src-all@freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/svn-src-all
 To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
 
State-Changed-From-To: patched->closed 
State-Changed-By: mm 
State-Changed-When: Thu May 8 05:55:00 UTC 2014 
State-Changed-Why:  
Committed. Thanks! 

http://www.freebsd.org/cgi/query-pr.cgi?pr=182964 
>Unformatted:
