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