Re: panic: kernel diagnostic assertion "offset < map->dm_maps" failed

Chavdar Ivanov <[email protected]>
Newsgroups gmane.os.netbsd.devel.network,gmane.os.netbsd.current
Message-ID <CAG0OUxhrUzxiHA5ogtbNKKOM=mD6TN=bTp7DzgufKqc64s+P_w@mail.gmail.com>
That looks the same trace I reported on the 29th of September. At least is
probably not due to my specific no-name 2.5gb interface…

On Tue, 17 Oct 2023 at 07:10, matthew green <[email protected]> wrote:

> > #3  0xffffffff80fe6e5f in kern_assert ()
> > #4  0xffffffff8058be67 in bus_dmamap_sync ()
> > #5  0xffffffff8044edc7 in rge_rxeof ()
> > #6  0xffffffff804536fd in rge_intr ()
>
> i'm pretty sure this is the 2nd bus_dmamap_sync() call, as that's
> the only dma map that has load/unload applied at run time, vs the
> init sequence only, and it implies to me that rx dma map has had
> allocation failures to deplete the entire ring of mbufs, and then
> there are no mappings in the dma map, which leaves the dm_mapsize
> as 0, and triggers this bug.
>
> if i'm right, what's happened is this:
>
> 1237         for (i = sc->rge_ldata.rge_rxq_considx; ; i =
> RGE_NEXT_RX_DESC(i)) {
>
> 1245                 if (RGE_OWN(cur_rx))
> 1246                         break;
>
> 1252                 rxq = &sc->rge_ldata.rge_rxq[i];
> 1253                 m = rxq->rxq_mbuf;
>
> 1257                 /* Invalidate the RX mbuf and unload its map. */
> 1258                 bus_dmamap_sync(sc->sc_dmat, rxq->rxq_dmamap, 0,
> 1259                     rxq->rxq_dmamap->dm_mapsize,
> BUS_DMASYNC_POSTREAD);
> 1260                 bus_dmamap_unload(sc->sc_dmat, rxq->rxq_dmamap);
>
> 1283                  * If allocating a replacement mbuf fails,
> 1284                  * reload the current one.
>
> 1287                 if (rge_newbuf(sc, i) != 0) {
> 1288                         if (sc->rge_head != NULL) {
> 1289                                 m_freem(sc->rge_head);
> 1290                                 sc->rge_head = sc->rge_tail = NULL;
> 1291                         }
> 1292                         rge_discard_rxbuf(sc, i);
> 1293                         continue;
> 1294                 }
>
> loop 'i' has the ability to range between 0 and 1023, and
> accesses each ring entries rge_rxq.  if, over time, each
> value between 0 and 1023 triggers the rge_newbuf() failure
> path, each successive entry will be lost, never to be
> replaced unless an explicit ifconfig down/up occurs.
>
> hmmm, but in thie case, no buffers would should be set to
> be available for rx, so nowthing should pass RGE_OWN() at
> L1245 i'd hope.  i still see the problem with everything
> being depleted, but then it should just stop getting any
> rx packets at all...
>
> networking folks, am i missing something here?  i see the
> same problem in wm(4) as well.  if wm_add_rxbuf() fails,
> where will this ring entry's mbuf ever be replaced again?
>
>
> .mrg.
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.