5.4-RELEASE lockups on amd64 SMP

Matthew Grooms mgrooms at seton.org
Wed Jun 8 21:42:12 GMT 2005


Are these available for download somewhere? I am getting rejected chunks 
and I suspect it may be the mail client I am using. This does apply 
cleanly to 5.4-RELEASE correct?

Matthew Grooms
Network Engineer
Seton Healthcare Network
http://www.seton.net/
mgrooms at seton.org
(512) 324 9913

Max Laier wrote:
> Matthew,
> 
> can you try the attached diff.  Available for 5 and CURRENT.  I recall that 
> this problem was seen before, strange that I didn't see the problem.  Sounds 
> familiar to you?  Please try the patch and let me know if that helps.  Thanks 
> a lot.
> 
> On Wednesday 08 June 2005 01:35, Matthew Grooms wrote:
> 
>>Once again, here are the backtraces for the panic and lor ...
>>
>>Tracing id 110 tid 100089 td 0xffffff012f3f0c80
>>kdb_enter() at kdb_enter+0x2f
>>panic() at panic+0x249
>>uma_dbg_free() at uma_dbg_free+0x188
>>uma_zfree_arg() at uma_zfree_arg+0x1b0
>>pf_purge_expired_states() at pf_purge_expired_states+0x41
>>pfsync_input at pfsync_input+xb35
>>pf_input() at ip_input+0x10f
>>netisr_processqueue() at netisr_processqueue+0x17
>>swi_net() at swi_net+0xa8
>>ithread_loop() at ithread_loop+0xd9
>>fork_exit() at fork_exit+0xc3
>>fork_trampoline() at fork_trampoline+0xe
>>--- trap 0, rip = 0, rsp = 0xffffffffb44f9d00, rbp = 0 ---
>>db> continue
>>boot() called on cpu#0
>>Uptime: 13h42m43s
>>Dumping 4864 MB
>>  16 32 ...
>>
>>lock order reversal
> 
> ...
> 
>>alltraps_with_regs_pushed() at alltraps_with_regs_pushed+0x5
>>pf_state_tree_lan_ext_RB_REMOVE() at pf_state_tree_lan_ext_RB_REMOVE+0x10c
> 
> 
> This LOR is a consequence of the fault, so it can be disregarded.
> 
> 
> 
> ------------------------------------------------------------------------
> 
> Index: if_pfsync.c
> ===================================================================
> RCS file: /usr/store/mlaier/fcvs/src/sys/contrib/pf/net/if_pfsync.c,v
> retrieving revision 1.15
> diff -u -r1.15 if_pfsync.c
> --- if_pfsync.c	3 May 2005 16:43:32 -0000	1.15
> +++ if_pfsync.c	8 Jun 2005 14:04:44 -0000
> @@ -132,6 +132,7 @@
>  
>  static void	pfsync_clone_destroy(struct ifnet *);
>  static int	pfsync_clone_create(struct if_clone *, int);
> +static void	pfsync_senddef(void *);
>  #else
>  void	pfsyncattach(int);
>  #endif
> @@ -174,6 +175,8 @@
>  	callout_stop(&sc->sc_bulk_tmo);
>  	callout_stop(&sc->sc_bulkfail_tmo);
>  
> +	callout_stop(&sc->sc_send_tmo);
> +
>  #if NBPFILTER > 0
>          bpfdetach(ifp);
>  #endif
> @@ -220,6 +223,7 @@
>  	callout_init(&sc->sc_tmo, 0);
>  	callout_init(&sc->sc_bulk_tmo, 0);
>  	callout_init(&sc->sc_bulkfail_tmo, 0);
> +	callout_init(&sc->sc_send_tmo, 0);
>  	if_attach(ifp);
>  
>  	LIST_INSERT_HEAD(&pfsync_list, sc, sc_next);
> @@ -1033,6 +1037,7 @@
>  		if (pfsyncr.pfsyncr_maxupdates > 255)
>  			return (EINVAL);
>  #ifdef __FreeBSD__
> +		callout_drain(&sc->sc_send_tmo);
>  		PF_LOCK();
>  #endif
>  		sc->sc_maxupdates = pfsyncr.pfsyncr_maxupdates;
> @@ -1789,15 +1794,14 @@
>  #endif
>  
>  		pfsyncstats.pfsyncs_opackets++;
> -
>  #ifdef __FreeBSD__
> -		PF_UNLOCK();
> -#endif
> +		if (IF_HANDOFF(&sc->sc_ifq, m, NULL))
> +			pfsyncstats.pfsyncs_oerrors++;
> +		else
> +			callout_reset(&sc->sc_send_tmo, 1, pfsync_senddef, sc);
> +#else
>  		if (ip_output(m, NULL, NULL, IP_RAWOUTPUT, &sc->sc_imo, NULL))
>  			pfsyncstats.pfsyncs_oerrors++;
> -
> -#ifdef __FreeBSD__
> -		PF_LOCK();
>  #endif
>  	} else
>  		m_freem(m);
> @@ -1807,6 +1811,22 @@
>  
>  
>  #ifdef __FreeBSD__
> +static void
> +pfsync_senddef(void *arg)
> +{
> +	struct pfsync_softc *sc = (struct pfsync_softc *)arg;
> +	struct mbuf *m;
> +
> +	for(;;) {
> +		IF_DEQUEUE(&sc->sc_ifq, m);
> +		if (m == NULL)
> +			break;
> +		if (ip_output(m, NULL, NULL, IP_RAWOUTPUT, &sc->sc_imo, NULL))
> +			pfsyncstats.pfsyncs_oerrors++;
> +	}
> +}
> +
> +
>  static int
>  pfsync_modevent(module_t mod, int type, void *data)
>  {
> Index: if_pfsync.h
> ===================================================================
> RCS file: /usr/store/mlaier/fcvs/src/sys/contrib/pf/net/if_pfsync.h,v
> retrieving revision 1.5
> diff -u -r1.5 if_pfsync.h
> --- if_pfsync.h	3 May 2005 16:43:32 -0000	1.5
> +++ if_pfsync.h	8 Jun 2005 14:06:03 -0000
> @@ -164,6 +164,10 @@
>  	struct in_addr		 sc_sendaddr;
>  	struct mbuf		*sc_mbuf;	/* current cumulative mbuf */
>  	struct mbuf		*sc_mbuf_net;	/* current cumulative mbuf */
> +#ifdef __FreeBSD__
> +	struct ifqueue		 sc_ifq;
> +	struct callout		 sc_send_tmo;
> +#endif
>  	union sc_statep		 sc_statep;
>  	union sc_statep		 sc_statep_net;
>  	u_int32_t		 sc_ureq_received;
> 
> 
> ------------------------------------------------------------------------
> 
> Index: if_pfsync.c
> ===================================================================
> RCS file: /usr/store/mlaier/fcvs/src/sys/contrib/pf/net/if_pfsync.c,v
> retrieving revision 1.11.2.2
> diff -u -r1.11.2.2 if_pfsync.c
> --- if_pfsync.c	19 May 2005 10:59:22 -0000	1.11.2.2
> +++ if_pfsync.c	8 Jun 2005 14:07:17 -0000
> @@ -130,6 +130,7 @@
>  
>  static void	pfsync_clone_destroy(struct ifnet *);
>  static int	pfsync_clone_create(struct if_clone *, int);
> +static void	pfsync_senddef(void *);
>  #else
>  void	pfsyncattach(int);
>  #endif
> @@ -170,6 +171,8 @@
>  	callout_stop(&sc->sc_bulk_tmo);
>  	callout_stop(&sc->sc_bulkfail_tmo);
>  
> +	callout_stop(&sc->sc_send_tmo);
> +
>  #if NBPFILTER > 0
>          bpfdetach(ifp);
>  #endif
> @@ -216,6 +219,7 @@
>  	callout_init(&sc->sc_tmo, 0);
>  	callout_init(&sc->sc_bulk_tmo, 0);
>  	callout_init(&sc->sc_bulkfail_tmo, 0);
> +	callout_init(&sc->sc_send_tmo, 0);
>  	if_attach(&sc->sc_if);
>  
>  	LIST_INSERT_HEAD(&pfsync_list, sc, sc_next);
> @@ -913,6 +917,7 @@
>  		if (pfsyncr.pfsyncr_maxupdates > 255)
>  			return (EINVAL);
>  #ifdef __FreeBSD__
> +		callout_drain(&sc->sc_send_tmo);
>  		PF_LOCK();
>  #endif
>  		sc->sc_maxupdates = pfsyncr.pfsyncr_maxupdates;
> @@ -1634,15 +1639,14 @@
>  #endif
>  
>  		pfsyncstats.pfsyncs_opackets++;
> -
>  #ifdef __FreeBSD__
> -		PF_UNLOCK();
> -#endif
> +		if (IF_HANDOFF(&sc->sc_ifq, m, NULL))
> +			pfsyncstats.pfsyncs_oerrors++;
> +		else
> +			callout_reset(&sc->sc_send_tmo, 1, pfsync_senddef, sc);
> +#else
>  		if (ip_output(m, NULL, NULL, IP_RAWOUTPUT, &sc->sc_imo, NULL))
>  			pfsyncstats.pfsyncs_oerrors++;
> -
> -#ifdef __FreeBSD__
> -		PF_LOCK();
>  #endif
>  	} else
>  		m_freem(m);
> @@ -1652,6 +1656,22 @@
>  
>  
>  #ifdef __FreeBSD__
> +static void
> +pfsync_senddef(void *arg)
> +{
> +	struct pfsync_softc *sc = (struct pfsync_softc *)arg;
> +	struct mbuf *m;
> +
> +	for(;;) {
> +		IF_DEQUEUE(&sc->sc_ifq, m);
> +		if (m == NULL)
> +			break;
> +		if (ip_output(m, NULL, NULL, IP_RAWOUTPUT, &sc->sc_imo, NULL))
> +			pfsyncstats.pfsyncs_oerrors++;
> +	}
> +}
> +
> +
>  static int
>  pfsync_modevent(module_t mod, int type, void *data)
>  {
> Index: if_pfsync.h
> ===================================================================
> RCS file: /usr/store/mlaier/fcvs/src/sys/contrib/pf/net/if_pfsync.h,v
> retrieving revision 1.4
> diff -u -r1.4 if_pfsync.h
> --- if_pfsync.h	16 Jun 2004 23:24:00 -0000	1.4
> +++ if_pfsync.h	8 Jun 2005 14:07:48 -0000
> @@ -158,8 +158,12 @@
>  	struct timeout		 sc_bulkfail_tmo;
>  #endif
>  	struct in_addr		 sc_sendaddr;
> -	struct mbuf		*sc_mbuf;	/* current cummulative mbuf */
> -	struct mbuf		*sc_mbuf_net;	/* current cummulative mbuf */
> +	struct mbuf		*sc_mbuf;	/* current cumulative mbuf */
> +	struct mbuf		*sc_mbuf_net;	/* current cumulative mbuf */
> +#ifdef __FreeBSD__
> +	struct ifqueue		 sc_ifq;
> +	struct callout		 sc_send_tmo;
> +#endif
>  	union sc_statep		 sc_statep;
>  	union sc_statep		 sc_statep_net;
>  	u_int32_t		 sc_ureq_received;


More information about the freebsd-pf mailing list