Date: Sat, 29 Mar 2014 09:05:26 +0000 (UTC) From: Martin Matuska <mm@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r263908 - in projects/pf/head/sys: net netpfil/pf Message-ID: <201403290905.s2T95QZm081880@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: mm Date: Sat Mar 29 09:05:25 2014 New Revision: 263908 URL: http://svnweb.freebsd.org/changeset/base/263908 Log: 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. Reviewed by: Nikos Vassiliadis, trociny@ Modified: projects/pf/head/sys/net/pfvar.h projects/pf/head/sys/netpfil/pf/pf.c projects/pf/head/sys/netpfil/pf/pf_ioctl.c Modified: projects/pf/head/sys/net/pfvar.h ============================================================================== --- projects/pf/head/sys/net/pfvar.h Sat Mar 29 08:39:53 2014 (r263907) +++ projects/pf/head/sys/net/pfvar.h Sat Mar 29 09:05:25 2014 (r263908) @@ -1528,6 +1528,8 @@ VNET_DECLARE(struct pf_altqqueue *, pf_ VNET_DECLARE(struct pf_rulequeue, pf_unlinked_rules); #define V_pf_unlinked_rules VNET(pf_unlinked_rules) +void pf_mtag_initialize(void); +void pf_mtag_cleanup(void); void pf_vnet_initialize(void); void pf_cleanup(void); Modified: projects/pf/head/sys/netpfil/pf/pf.c ============================================================================== --- projects/pf/head/sys/netpfil/pf/pf.c Sat Mar 29 08:39:53 2014 (r263907) +++ projects/pf/head/sys/netpfil/pf/pf.c Sat Mar 29 09:05:25 2014 (r263908) @@ -192,8 +192,7 @@ MTX_SYSINIT(pf_unlnkdrules_mtx, &pf_unln 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); @@ -294,7 +293,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, @@ -733,7 +732,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_vnet_initialize() { @@ -792,10 +800,6 @@ pf_vnet_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); @@ -807,6 +811,13 @@ pf_vnet_initialize() } void +pf_mtag_cleanup() +{ + + uma_zdestroy(pf_mtag_z); +} + +void pf_cleanup() { struct pf_keyhash *kh; @@ -839,14 +850,13 @@ pf_cleanup() free(pfse, M_PFTEMP); } - 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; @@ -863,7 +873,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 * @@ -874,7 +884,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: projects/pf/head/sys/netpfil/pf/pf_ioctl.c ============================================================================== --- projects/pf/head/sys/netpfil/pf/pf_ioctl.c Sat Mar 29 08:39:53 2014 (r263907) +++ projects/pf/head/sys/netpfil/pf/pf_ioctl.c Sat Mar 29 09:05:25 2014 (r263908) @@ -3676,6 +3676,7 @@ pf_load(void) rw_init(&pf_rules_lock, "pf rulesets"); pf_dev = make_dev(&pf_cdevsw, 0, 0, 0, 0600, PF_NAME); + pf_mtag_initialize(); return (0); } @@ -3711,6 +3712,7 @@ pf_unload(void) pfr_cleanup(); pf_osfp_flush(); pf_cleanup(); + pf_mtag_cleanup(); PF_RULES_WUNLOCK(); destroy_dev(pf_dev); rw_destroy(&pf_rules_lock);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201403290905.s2T95QZm081880>