diff --git a/sys/net/netmap/netmap_mem2.c b/sys/net/netmap/netmap_mem2.c --- a/sys/net/netmap/netmap_mem2.c +++ b/sys/net/netmap/netmap_mem2.c @@ -984,7 +984,19 @@ netmap_mem_rings_create(struct netmap_adapter *na) cleanup: + /* + * DF-3396: release the packet buffers that were already + * allocated into the rings we managed to create, mirroring + * netmap_mem_rings_delete(), before returning the ring objects. + */ + { + u_int i, lim; + struct netmap_kring *kring; + + for (kring = na->tx_rings; kring != na->tailroom; kring++) { + if (kring->ring == NULL) + continue; + lim = kring->nkr_num_slots; + for (i = 0; i < lim; i++) + netmap_free_buf(na->nm_mem, + kring->ring->slot[i].buf_idx); + } + } netmap_free_rings(na); NMA_UNLOCK(na->nm_mem);