> Date: Sat, 19 Mar 2016 14:15:47 +0100
> From: Stefan Sperling <s...@stsp.name>
> 
> A sparc64 machine of mine crashes every few weeks because the kernel
> runs out of memory.
> 
> The crash usually happens in a malloc call in the vnet(4) ioctl code path.
> I have a cronjob which downs/up vnet interfaces in case they get stuck in
> OACTIVE (another bug which, AFAIK, is not solved yet). So this machine runs
> vnet's ioctl code path every now and then.
> 
> Yesterday it crashed again. The machine was still running a snap from Feb 2.
> kettenis@ has fixed one memory leak in vnet since. I believe I may have
> found another leak, which is addresssed by the diff below.
> 
> Is this diff correct? My machine is now running with it.

ok kettenis@

> Index: vnet.c
> ===================================================================
> RCS file: /cvs/src/sys/arch/sparc64/dev/vnet.c,v
> retrieving revision 1.54
> diff -u -p -r1.54 vnet.c
> --- vnet.c    26 Feb 2016 13:41:51 -0000      1.54
> +++ vnet.c    19 Mar 2016 10:42:06 -0000
> @@ -169,6 +169,7 @@ struct vnet_softc {
>       struct ldc_map  *sc_lm;
>       struct vnet_dring *sc_vd;
>       struct vnet_soft_desc *sc_vsd;
> +#define VNET_NUM_SOFT_DESC   128
>  
>       size_t          sc_peer_desc_size;
>       struct ldc_cookie sc_peer_dring_cookie;
> @@ -1399,10 +1400,10 @@ vnet_init(struct ifnet *ifp)
>               return;
>       }
>  
> -     sc->sc_vd = vnet_dring_alloc(sc->sc_dmatag, 128);
> +     sc->sc_vd = vnet_dring_alloc(sc->sc_dmatag, VNET_NUM_SOFT_DESC);
>       if (sc->sc_vd == NULL)
>               return;
> -     sc->sc_vsd = malloc(128 * sizeof(*sc->sc_vsd), M_DEVBUF,
> +     sc->sc_vsd = malloc(VNET_NUM_SOFT_DESC * sizeof(*sc->sc_vsd), M_DEVBUF,
>           M_NOWAIT|M_ZERO);
>       if (sc->sc_vsd == NULL)
>               return;
> @@ -1453,6 +1454,8 @@ vnet_stop(struct ifnet *ifp)
>       lc->lc_state = 0;
>       lc->lc_tx_state = lc->lc_rx_state = LDC_CHANNEL_DOWN;
>       vnet_ldc_reset(lc);
> +
> +     free(sc->sc_vsd, M_DEVBUF, VNET_NUM_SOFT_DESC * sizeof(*sc->sc_vsd));
>  
>       vnet_dring_free(sc->sc_dmatag, sc->sc_vd);
>  
> 
> 

Reply via email to