From owner-p4-projects@FreeBSD.ORG Fri May 13 01:55:37 2011 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id CD7031065672; Fri, 13 May 2011 01:55:36 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 90195106566C for ; Fri, 13 May 2011 01:55:36 +0000 (UTC) (envelope-from syuu@FreeBSD.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id 7E34A8FC13 for ; Fri, 13 May 2011 01:55:36 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id p4D1ta4X018298 for ; Fri, 13 May 2011 01:55:36 GMT (envelope-from syuu@FreeBSD.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id p4D1tad4018295 for perforce@freebsd.org; Fri, 13 May 2011 01:55:36 GMT (envelope-from syuu@FreeBSD.org) Date: Fri, 13 May 2011 01:55:36 GMT Message-Id: <201105130155.p4D1tad4018295@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to syuu@FreeBSD.org using -f From: Takuya ASADA To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 193033 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 13 May 2011 01:55:37 -0000 http://p4web.freebsd.org/@@193033?ac=10 Change 193033 by syuu@maitake2 on 2011/05/13 01:54:40 Experimental implementation of multiqueue bpf. Not tested yet. Affected files ... .. //depot/projects/soc2011/multiqueue_bpf/sys/dev/e1000/if_igb.c#2 edit .. //depot/projects/soc2011/multiqueue_bpf/sys/net/bpf.c#2 edit .. //depot/projects/soc2011/multiqueue_bpf/sys/net/bpf.h#2 edit .. //depot/projects/soc2011/multiqueue_bpf/sys/net/bpfdesc.h#2 edit .. //depot/projects/soc2011/multiqueue_bpf/sys/net/if_var.h#2 edit .. //depot/projects/soc2011/multiqueue_bpf/sys/sys/mbuf.h#2 edit Differences ... ==== //depot/projects/soc2011/multiqueue_bpf/sys/dev/e1000/if_igb.c#2 (text+ko) ==== @@ -2694,6 +2694,7 @@ igb_setup_interface(device_t dev, struct adapter *adapter) { struct ifnet *ifp; + int i; INIT_DEBUGOUT("igb_setup_interface: begin"); @@ -2750,7 +2751,10 @@ ** enable this and get full hardware tag filtering. */ ifp->if_capabilities |= IFCAP_VLAN_HWFILTER; - + ifp->if_rcvq_affinity.ra_len = adapter->num_rx_desc; + for (i = 0; i < adapter->num_rx_desc; i++) + ifp->if_rcvq_affinity.ra_q[i] = i; + /* * Specify the media types supported by this adapter and register * callbacks to update media and link information @@ -4438,6 +4442,8 @@ rxr->fmp->m_pkthdr.flowid = que->msix; rxr->fmp->m_flags |= M_FLOWID; #endif + rxr->fmp->m_pkthdr.rcvq = que->msix; + KASSERT(que->msix == PCPU_GET(cpuid), ("que->msix != cpuid")); sendmp = rxr->fmp; /* Make sure to set M_PKTHDR. */ sendmp->m_flags |= M_PKTHDR; ==== //depot/projects/soc2011/multiqueue_bpf/sys/net/bpf.c#2 (text+ko) ==== @@ -690,6 +690,7 @@ d->bd_sig = SIGIO; d->bd_direction = BPF_D_INOUT; d->bd_pid = td->td_proc->p_pid; + d->bd_qmask = (u_int)-1; #ifdef MAC mac_bpfdesc_init(d); mac_bpfdesc_create(td->td_ucred, d); @@ -1510,6 +1511,26 @@ case BIOCROTZBUF: error = bpf_ioctl_rotzbuf(td, d, (struct bpf_zbuf *)addr); break; + case BIOCQLEN: + if (d->bd_bif == NULL) + error = EINVAL; + else + *(int *)addr = d->bd_bif->bif_ifp->if_rcvq_affinity.ra_len; + break; + case BIOCGETQAFFINITY: + if (d->bd_bif == NULL) + error = EINVAL; + else { + int index = *(int *)addr; + *(u_long *)addr = d->bd_bif->bif_ifp->if_rcvq_affinity.ra_q[index]; + } + break; + case BIOCSETQMASK: + d->bd_qmask = *(u_int *)addr; + break; + case BIOCGETQMASK: + *(u_int *)addr = d->bd_qmask; + break; } CURVNET_RESTORE(); return (error); @@ -1882,6 +1903,8 @@ LIST_FOREACH(d, &bp->bif_dlist, bd_next) { if (BPF_CHECK_DIRECTION(d, m->m_pkthdr.rcvif, bp->bif_ifp)) continue; + if (!(d->bd_qmask & m->m_pkthdr.rcvq)) + continue; BPFD_LOCK(d); ++d->bd_rcount; #ifdef BPF_JITTER @@ -1942,6 +1965,8 @@ LIST_FOREACH(d, &bp->bif_dlist, bd_next) { if (BPF_CHECK_DIRECTION(d, m->m_pkthdr.rcvif, bp->bif_ifp)) continue; + if (!(d->bd_qmask & m->m_pkthdr.rcvq)) + continue; BPFD_LOCK(d); ++d->bd_rcount; slen = bpf_filter(d->bd_rfilter, (u_char *)&mb, pktlen, 0); ==== //depot/projects/soc2011/multiqueue_bpf/sys/net/bpf.h#2 (text+ko) ==== @@ -147,6 +147,11 @@ #define BIOCSETFNR _IOW('B', 130, struct bpf_program) #define BIOCGTSTAMP _IOR('B', 131, u_int) #define BIOCSTSTAMP _IOW('B', 132, u_int) +#define BIOCQLEN _IOW('B', 133, u_long) +#define BIOCGETQLEN _IOR('B', 134, int) +#define BIOCGETQAFFINITY _IOWR('B', 135, u_long) +#define BIOCSETQMASK _IOW('B', 136, u_int) +#define BIOCGETQMASK _IOR('B', 137, u_int) /* Obsolete */ #define BIOCGSEESENT BIOCGDIRECTION ==== //depot/projects/soc2011/multiqueue_bpf/sys/net/bpfdesc.h#2 (text+ko) ==== @@ -99,6 +99,7 @@ u_int64_t bd_wdcount; /* number of packets dropped during a write */ u_int64_t bd_zcopy; /* number of zero copy operations */ u_char bd_compat32; /* 32-bit stream on LP64 system */ + u_int bd_qmask; /* XXX: should support large number of queues */ }; /* Values for bd_state */ ==== //depot/projects/soc2011/multiqueue_bpf/sys/net/if_var.h#2 (text+ko) ==== @@ -111,6 +111,12 @@ struct mtx ifq_mtx; }; +/* XXX: should support large number of queues */ +struct rcvq_affinity { + int ra_len; + u_long ra_q[32]; +}; + /* * Structure defining a network interface. * @@ -197,6 +203,8 @@ void *if_lagg; /* lagg glue */ u_char if_alloctype; /* if_type at time of allocation */ + struct rcvq_affinity if_rcvq_affinity; + /* * Spare fields are added so that we can modify sensitive data * structures without changing the kernel binary interface, and must ==== //depot/projects/soc2011/multiqueue_bpf/sys/sys/mbuf.h#2 (text+ko) ==== @@ -118,6 +118,7 @@ uint32_t flowid; /* packet's 4-tuple system * flow identifier */ + int rcvq; /* variables for hardware checksum */ int csum_flags; /* flags regarding checksum */ int csum_data; /* data field used by csum routines */