Date: Fri, 3 Jun 2011 06:27:32 GMT From: Takuya ASADA <syuu@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 194139 for review Message-ID: <201106030627.p536RWeU016673@skunkworks.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@194139?ac=10 Change 194139 by syuu@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 *);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201106030627.p536RWeU016673>