PERFORCE change 194139 for review

Takuya ASADA syuu at FreeBSD.org
Fri Jun 3 06:27:33 UTC 2011


http://p4web.freebsd.org/@@194139?ac=10

Change 194139 by syuu at x200 on 2011/06/03 06:26:46

	implement queue affinity ioctl

Affected files ...

.. //depot/projects/soc2011/mq_bpf/src/sys/dev/e1000/if_em.c#2 edit
.. //depot/projects/soc2011/mq_bpf/src/sys/dev/e1000/if_igb.c#3 edit
.. //depot/projects/soc2011/mq_bpf/src/sys/net/bpf.c#5 edit
.. //depot/projects/soc2011/mq_bpf/src/sys/net/if_var.h#4 edit

Differences ...

==== //depot/projects/soc2011/mq_bpf/src/sys/dev/e1000/if_em.c#2 (text+ko) ====

@@ -436,7 +436,7 @@
 {
 	struct adapter	*adapter;
 	struct e1000_hw	*hw;
-	int		error = 0;
+	int		error = 0, i;
 
 	INIT_DEBUGOUT("em_attach: begin");
 
@@ -685,7 +685,18 @@
 
 	adapter->led_dev = led_create(em_led_func, adapter,
 	    device_get_nameunit(dev));
-
+	adapter->ifp->if_rxq_num = adapter->num_queues;
+	adapter->ifp->if_txq_num = adapter->num_queues;
+	adapter->ifp->if_rxq_affinity = 
+		(u_long *)malloc(sizeof(u_long) * adapter->num_queues,
+		M_DEVBUF, M_NOWAIT);
+	adapter->ifp->if_txq_affinity = 
+		(u_long *)malloc(sizeof(u_long) * adapter->num_queues,
+		M_DEVBUF, M_NOWAIT);
+	for (i = 0; i < adapter->num_queues; i++) {
+		adapter->ifp->if_rxq_affinity[i] = i;
+		adapter->ifp->if_rxq_affinity[i] = i;
+	}
 	INIT_DEBUGOUT("em_attach: end");
 
 	return (0);
@@ -864,6 +875,10 @@
 		}
 		enq++;
 		drbr_stats_update(ifp, next->m_pkthdr.len, next->m_flags);
+
+		next->m_pkthdr.rxqid = (uint32_t)-1;
+		next->m_pkthdr.txqid = txr->me;
+		
 		ETHER_BPF_MTAP(ifp, next);
 		if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0)
                         break;
@@ -4289,6 +4304,8 @@
 			sendmp->m_pkthdr.flowid = rxr->msix;
 			sendmp->m_flags |= M_FLOWID;
 #endif
+			sendmp->m_pkthdr.rxqid = rxr->msix;
+			sendmp->m_pkthdr.txqid = (uint32_t)-1;
 #ifndef __NO_STRICT_ALIGNMENT
 skip:
 #endif

==== //depot/projects/soc2011/mq_bpf/src/sys/dev/e1000/if_igb.c#3 (text+ko) ====

@@ -426,7 +426,7 @@
 igb_attach(device_t dev)
 {
 	struct adapter	*adapter;
-	int		error = 0;
+	int		error = 0, i;
 	u16		eeprom_data;
 
 	INIT_DEBUGOUT("igb_attach: begin");
@@ -651,9 +651,18 @@
 	adapter->led_dev = led_create(igb_led_func, adapter,
 	    device_get_nameunit(dev));
 
-
 	adapter->ifp->if_rxq_num = adapter->num_queues;
 	adapter->ifp->if_txq_num = adapter->num_queues;
+	adapter->ifp->if_rxq_affinity = 
+		(u_long *)malloc(sizeof(u_long) * adapter->num_queues,
+		M_DEVBUF, M_NOWAIT);
+	adapter->ifp->if_txq_affinity = 
+		(u_long *)malloc(sizeof(u_long) * adapter->num_queues,
+		M_DEVBUF, M_NOWAIT);
+	for (i = 0; i < adapter->num_queues; i++) {
+		adapter->ifp->if_rxq_affinity[i] = i;
+		adapter->ifp->if_rxq_affinity[i] = i;
+	}
 	INIT_DEBUGOUT("igb_attach: end");
 
 	return (0);

==== //depot/projects/soc2011/mq_bpf/src/sys/net/bpf.c#5 (text+ko) ====

@@ -1533,17 +1533,63 @@
 			break;
 		}
 
-	/* XXX: not implemented yet */
 	case BIOCRXQAFFINITY:
-		log(LOG_DEBUG, "BIOCRXQAFFINITY\n");
-		error = EINVAL;
-		break;
+		{
+			u_long index;
+			log(LOG_DEBUG, "BIOCRXQAFFINITY\n");
+			if (d->bd_bif == NULL) {
+				log(LOG_DEBUG, "d->bd_bif == NULL\n");
+				/*
+				 * No interface attached yet.
+				 */
+				error = EINVAL;
+				break;
+			}
+			struct ifnet *const ifp = d->bd_bif->bif_ifp;
+			index = *(u_long *)addr;
+			if (index > ifp->if_rxq_num) {
+				log(LOG_DEBUG, "index too large\n");
+				error = EINVAL;
+				break;
+			}
+			if (!ifp->if_rxq_affinity) {
+				log(LOG_DEBUG, "!ifp->if_rxq_affinity\n");
+				error = EINVAL;
+				break;
+			}
+			*(u_long *)addr = ifp->if_rxq_affinity[index];
+			log(LOG_DEBUG, "index:%lu result:%lu\n", index, *(u_long *)addr);
+			break;
+		}
 
-	/* XXX: not implemented yet */
 	case BIOCTXQAFFINITY:
-		log(LOG_DEBUG, "BIOCTXQAFFINITY\n");
-		error = EINVAL;
-		break;
+		{
+			u_long index;
+			log(LOG_DEBUG, "BIOCTXQAFFINITY\n");
+			if (d->bd_bif == NULL) {
+				log(LOG_DEBUG, "d->bd_bif == NULL\n");
+				/*
+				 * No interface attached yet.
+				 */
+				error = EINVAL;
+				break;
+			}
+			struct ifnet *const ifp = d->bd_bif->bif_ifp;
+			index = *(u_long *)addr;
+			if (index > ifp->if_txq_num) {
+				log(LOG_DEBUG, "index too large\n");
+				error = EINVAL;
+				break;
+			}
+			if (!ifp->if_txq_affinity) {
+				log(LOG_DEBUG, "!ifp->if_txq_affinity\n");
+				error = EINVAL;
+				break;
+			}
+			*(u_long *)addr = ifp->if_txq_affinity[index];
+			log(LOG_DEBUG, "index:%lu result:%lu\n", index, *(u_long *)addr);
+			break;
+		}
 
 	case BIOCENAQMASK:
 		{

==== //depot/projects/soc2011/mq_bpf/src/sys/net/if_var.h#4 (text+ko) ====

@@ -209,6 +209,8 @@
 
 	int	if_rxq_num;
 	int	if_txq_num;
+	u_long	*if_rxq_affinity;
+	u_long	*if_txq_affinity;
 };
 
 typedef void if_init_f_t(void *);


More information about the p4-projects mailing list