On Wed, Sep 14, 2016 at 21:46 +0200, Mike Belopuhov wrote:
> On Tue, Sep 13, 2016 at 08:50 +0000, Olivier Cherrier wrote:
> > >Synopsis:  crash with oce(4)
> > >Category:  network
> > >Environment:
> >     System      : OpenBSD 6.0
> >     Details     : OpenBSD 6.0 (GENERIC.MP) #2319: Tue Jul 26
> >     13:00:43 MDT 2016
> >                      
> > dera...@amd64.openbsd.org:/usr/src/sys/arch/amd64/compile/GENERIC.MP
> > 
> >     Architecture: OpenBSD.amd64
> >     Machine     : amd64
> > >Description:
> > 
> > After upgrading systems from 5.9 (with patch 004) to 6.0, I am getting
> > crash after a few seconds the network is configured. The problem seems
> > to be linked to oce(4) and pool, at least not linked to carp/vlan since
> > I can reproduce the crash with just «ifconfig ocex up» commands as
> > shown here while booting in single user:
> > 
> 
> I didn't test CARP, but I cound't reproduce this with vlans on
> top of a trunk on top of two oce's with 6.0-release.  I will
> double check -current tomorrow.  I don't see a good reason for
> the "missing descriptor in rxeof" unless it's a stray interrupt
> with a valid completion queue entry which is a bit too weird.
> 
> Perhaps we're not filling the Rx ring with enough slots and get
> a heavily fragmented jumbo frame that the card has managed to
> only partially fit into provided space.  How about this diff?
>

Nah.  This is rubbish, otherwise the driver wouldn't have been
usable at all.  I would still ask you to try it for possbile
side effects and for the extended printf.

Could you downgrade to 5.9 and retry your configuration?
I wonder if there could be some hardware or RAM related
issues.

> diff --git sys/dev/pci/if_oce.c sys/dev/pci/if_oce.c
> index ee74185..a74b35b 100644
> --- sys/dev/pci/if_oce.c
> +++ sys/dev/pci/if_oce.c
> @@ -1078,7 +1078,7 @@ oce_init(void *arg)
>               rq->ring->index  = 0;
>  
>               /* oce splits jumbos into 2k chunks... */
> -             if_rxr_init(&rq->rxring, 8, rq->nitems);
> +             if_rxr_init(&rq->rxring, OCE_MAX_TX_ELEMENTS, rq->nitems);
>  
>               if (!oce_alloc_rx_bufs(rq)) {
>                       printf("%s: failed to allocate rx buffers\n",
> @@ -1560,8 +1560,8 @@ oce_rxeof(struct oce_rq *rq, struct oce_nic_rx_cqe *cqe)
>  
>       for (i = 0; i < cqe->u0.s.num_fragments; i++) {
>               if ((pkt = oce_pkt_get(&rq->pkt_list)) == NULL) {
> -                     printf("%s: missing descriptor in rxeof\n",
> -                         sc->sc_dev.dv_xname);
> +                     printf("%s: missing descriptor in rxeof, frag %d/%u\n",
> +                         sc->sc_dev.dv_xname, i, cqe->u0.s.num_fragments);
>                       goto exit;
>               }
>  
> 

Reply via email to