Oops. The above patch is broken. Don't use it.
Please wait a little.
New one:
Index: if_vioif.c
===================================================================
RCS file: /cvsroot/src/sys/dev/pci/if_vioif.c,v
retrieving revision 1.34
diff -u -p -r1.34 if_vioif.c
--- if_vioif.c 28 Mar 2017 04:10:33 -0000 1.34
+++ if_vioif.c 11 May 2017 09:20:00 -0000
@@ -812,6 +812,7 @@ vioif_start(struct ifnet *ifp)
for (;;) {
int slot, r;
+ struct mbuf *newm;
IFQ_DEQUEUE(&ifp->if_snd, m);
@@ -833,7 +834,23 @@ retry:
r = bus_dmamap_load_mbuf(virtio_dmat(vsc),
sc->sc_tx_dmamaps[slot],
m, BUS_DMA_WRITE|BUS_DMA_NOWAIT);
- if (r != 0) {
+ switch (r) {
+ case 0:
+ break;
+ case EFBIG:
+ printf("%s: loadup_mbuf() returned EFBIG (%d segs)\n",
+ device_xname(sc->sc_dev),
+ sc->sc_tx_dmamaps[slot]->dm_nsegs);
+ newm = m_defrag(m, M_NOWAIT);
+ if ((newm != NULL) &&
+ (bus_dmamap_load_mbuf(virtio_dmat(vsc),
+ sc->sc_tx_dmamaps[slot],
+ newm, BUS_DMA_WRITE|BUS_DMA_NOWAIT) == 0)) {
+ m = newm;
+ break;
+ }
+ /* FALLTHROUGH */
+ default:
virtio_enqueue_abort(vsc, vq, slot);
aprint_error_dev(sc->sc_dev,
"tx dmamap load failed, error code %d\n", r);
BTW, what hypervisor are you using?