git: 15dc713ceb57 - main - netmap: vtnet: add support for netmap offsets

Vincenzo Maffione vmaffione at FreeBSD.org
Wed Apr 7 21:42:53 UTC 2021


The branch main has been updated by vmaffione:

URL: https://cgit.FreeBSD.org/src/commit/?id=15dc713ceb57d0d61c1dc54b1d550da42d250730

commit 15dc713ceb57d0d61c1dc54b1d550da42d250730
Author:     Vincenzo Maffione <vmaffione at FreeBSD.org>
AuthorDate: 2021-04-07 21:32:20 +0000
Commit:     Vincenzo Maffione <vmaffione at FreeBSD.org>
CommitDate: 2021-04-07 21:32:20 +0000

    netmap: vtnet: add support for netmap offsets
    
    Follow-up change to a6d768d845c173823785c71bb18b40074e7a8998.
    This change adds support for netmap offsets.
---
 sys/dev/netmap/if_vtnet_netmap.h | 16 ++++++++++------
 1 file changed, 10 insertions(+), 6 deletions(-)

diff --git a/sys/dev/netmap/if_vtnet_netmap.h b/sys/dev/netmap/if_vtnet_netmap.h
index a05781255218..a423e71331be 100644
--- a/sys/dev/netmap/if_vtnet_netmap.h
+++ b/sys/dev/netmap/if_vtnet_netmap.h
@@ -84,12 +84,14 @@ vtnet_netmap_txsync(struct netmap_kring *kring, int flags)
 		for (; nm_i != head; nm_i = nm_next(nm_i, lim)) {
 			/* we use an empty header here */
 			struct netmap_slot *slot = &ring->slot[nm_i];
+			uint64_t offset = nm_get_offset(kring, slot);
 			u_int len = slot->len;
 			uint64_t paddr;
 			void *addr = PNMB(na, slot, &paddr);
 			int err;
 
-			NM_CHECK_ADDR_LEN(na, addr, len);
+			(void)addr;
+			NM_CHECK_ADDR_LEN_OFF(na, len, offset);
 
 			slot->flags &= ~(NS_REPORT | NS_BUF_CHANGED);
 			/* Initialize the scatterlist, expose it to the hypervisor,
@@ -97,7 +99,7 @@ vtnet_netmap_txsync(struct netmap_kring *kring, int flags)
 			 */
 			sglist_reset(sg); // cheap
 			err = sglist_append(sg, &txq->vtntx_shrhdr, sc->vtnet_hdr_size);
-			err |= sglist_append_phys(sg, paddr, len);
+			err |= sglist_append_phys(sg, paddr + offset, len);
 			KASSERT(err == 0, ("%s: cannot append to sglist %d",
 						__func__, err));
 			err = virtqueue_enqueue(vq, /*cookie=*/txq, sg,
@@ -171,19 +173,21 @@ vtnet_netmap_kring_refill(struct netmap_kring *kring, u_int num)
 	for (nm_i = rxq->vtnrx_nm_refill; num > 0;
 	    nm_i = nm_next(nm_i, lim), num--) {
 		struct netmap_slot *slot = &ring->slot[nm_i];
+		uint64_t offset = nm_get_offset(kring, slot);
 		uint64_t paddr;
 		void *addr = PNMB(na, slot, &paddr);
 		int err;
 
 		if (addr == NETMAP_BUF_BASE(na)) { /* bad buf */
-			if (netmap_ring_reinit(kring))
-				return EFAULT;
+			netmap_ring_reinit(kring);
+			return EFAULT;
 		}
 
 		slot->flags &= ~NS_BUF_CHANGED;
 		sglist_reset(&sg);
 		err = sglist_append(&sg, &rxq->vtnrx_shrhdr, sc->vtnet_hdr_size);
-		err |= sglist_append_phys(&sg, paddr, NETMAP_BUF_SIZE(na));
+		err |= sglist_append_phys(&sg, paddr + offset,
+		    NETMAP_BUF_SIZE(na) - offset);
 		KASSERT(err == 0, ("%s: cannot append to sglist %d",
 					__func__, err));
 		/* writable for the host */
@@ -432,7 +436,7 @@ vtnet_netmap_attach(struct vtnet_softc *sc)
 	bzero(&na, sizeof(na));
 
 	na.ifp = sc->vtnet_ifp;
-	na.na_flags = 0;
+	na.na_flags = NAF_OFFSETS;
 	na.num_tx_desc = vtnet_netmap_tx_slots(sc);
 	na.num_rx_desc = vtnet_netmap_rx_slots(sc);
 	na.num_tx_rings = na.num_rx_rings = sc->vtnet_max_vq_pairs;


More information about the dev-commits-src-all mailing list