svn commit: r343559 - in stable/11/sys/dev: ixl netmap

Vincenzo Maffione vmaffione at FreeBSD.org
Tue Jan 29 18:18:57 UTC 2019


Author: vmaffione
Date: Tue Jan 29 18:18:55 2019
New Revision: 343559
URL: https://svnweb.freebsd.org/changeset/base/343559

Log:
  ixl: remove unnecessary limitations related to netmap
  
  Netmap supports the case where TX rings and RX rings have different size.
  Remove unnecessary limitations related to netmap support, making the code
  simpler.
  Also, check that the value of the hw head index written back from the NIC
  is valid.
  
  Reviewed by:	erj
  Differential Revision:	https://reviews.freebsd.org/D18984

Modified:
  stable/11/sys/dev/ixl/if_ixl.c
  stable/11/sys/dev/ixl/ixl.h
  stable/11/sys/dev/ixl/ixl_txrx.c
  stable/11/sys/dev/netmap/if_ixl_netmap.h

Modified: stable/11/sys/dev/ixl/if_ixl.c
==============================================================================
--- stable/11/sys/dev/ixl/if_ixl.c	Tue Jan 29 18:13:46 2019	(r343558)
+++ stable/11/sys/dev/ixl/if_ixl.c	Tue Jan 29 18:18:55 2019	(r343559)
@@ -659,13 +659,7 @@ ixl_attach(device_t dev)
 #endif
 
 #ifdef DEV_NETMAP
-	if (vsi->num_rx_desc == vsi->num_tx_desc) {
-		vsi->queues[0].num_desc = vsi->num_rx_desc;
-		ixl_netmap_attach(vsi);
-	} else
-		device_printf(dev,
-		    "Netmap is not supported when RX and TX descriptor ring sizes differ\n");
-
+	ixl_netmap_attach(vsi);
 #endif /* DEV_NETMAP */
 
 #ifdef IXL_IW

Modified: stable/11/sys/dev/ixl/ixl.h
==============================================================================
--- stable/11/sys/dev/ixl/ixl.h	Tue Jan 29 18:13:46 2019	(r343558)
+++ stable/11/sys/dev/ixl/ixl.h	Tue Jan 29 18:18:55 2019	(r343559)
@@ -513,9 +513,6 @@ struct ixl_queue {
 	void			*tag;
 	int			num_tx_desc;	/* both tx and rx */
 	int			num_rx_desc;	/* both tx and rx */
-#ifdef DEV_NETMAP
-	int			num_desc;	/* for compatibility with current netmap code in kernel */
-#endif
 	struct tx_ring		txr;
 	struct rx_ring		rxr;
 	struct task		task;

Modified: stable/11/sys/dev/ixl/ixl_txrx.c
==============================================================================
--- stable/11/sys/dev/ixl/ixl_txrx.c	Tue Jan 29 18:13:46 2019	(r343558)
+++ stable/11/sys/dev/ixl/ixl_txrx.c	Tue Jan 29 18:18:55 2019	(r343559)
@@ -1587,7 +1587,7 @@ ixl_rx_discard(struct rx_ring *rxr, int i)
 	struct ixl_rx_buf	*rbuf;
 
 	KASSERT(rxr != NULL, ("Receive ring pointer cannot be null"));
-	KASSERT(i < rxr->que->num_rx_desc, ("Descriptor index must be less than que->num_desc"));
+	KASSERT(i < rxr->que->num_rx_desc, ("Descriptor index must be less than que->num_rx_desc"));
 
 	rbuf = &rxr->buffers[i];
 

Modified: stable/11/sys/dev/netmap/if_ixl_netmap.h
==============================================================================
--- stable/11/sys/dev/netmap/if_ixl_netmap.h	Tue Jan 29 18:13:46 2019	(r343558)
+++ stable/11/sys/dev/netmap/if_ixl_netmap.h	Tue Jan 29 18:18:55 2019	(r343559)
@@ -129,12 +129,8 @@ ixl_netmap_attach(struct ixl_vsi *vsi)
 
 	na.ifp = vsi->ifp;
 	na.na_flags = NAF_BDG_MAYSLEEP;
-	// XXX check that queues is set.
-	nm_prinf("queues is %p", vsi->queues);
-	if (vsi->queues) {
-		na.num_tx_desc = vsi->queues[0].num_desc;
-		na.num_rx_desc = vsi->queues[0].num_desc;
-	}
+	na.num_tx_desc = vsi->num_tx_desc;
+	na.num_rx_desc = vsi->num_rx_desc;
 	na.nm_txsync = ixl_netmap_txsync;
 	na.nm_rxsync = ixl_netmap_rxsync;
 	na.nm_register = ixl_netmap_reg;
@@ -266,8 +262,10 @@ ixl_netmap_txsync(struct netmap_kring *kring, int flag
 	/*
 	 * Second part: reclaim buffers for completed transmissions.
 	 */
-	nic_i = LE32_TO_CPU(*(volatile __le32 *)&txr->base[que->num_desc]);
-	if (nic_i != txr->next_to_clean) {
+	nic_i = LE32_TO_CPU(*(volatile __le32 *)&txr->base[que->num_tx_desc]);
+	if (unlikely(nic_i >= que->num_tx_desc)) {
+		nm_prerr("error: invalid value of hw head index %u", nic_i);
+	} else if (nic_i != txr->next_to_clean) {
 		/* some tx completed, increment avail */
 		txr->next_to_clean = nic_i;
 		kring->nr_hwtail = nm_prev(netmap_idx_n2k(kring, nic_i), lim);


More information about the svn-src-stable-11 mailing list