From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by dpdk.org (Postfix) with ESMTP id 577575947 for ; Thu, 12 Feb 2015 05:04:57 +0100 (CET) Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by orsmga101.jf.intel.com with ESMTP; 11 Feb 2015 20:04:40 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.09,562,1418112000"; d="scan'208";a="676726479" Received: from pgsmsx107.gar.corp.intel.com ([10.221.44.105]) by fmsmga002.fm.intel.com with ESMTP; 11 Feb 2015 20:04:38 -0800 Received: from shsmsx101.ccr.corp.intel.com (10.239.4.153) by PGSMSX107.gar.corp.intel.com (10.221.44.105) with Microsoft SMTP Server (TLS) id 14.3.195.1; Thu, 12 Feb 2015 12:04:36 +0800 Received: from shsmsx102.ccr.corp.intel.com ([169.254.2.62]) by SHSMSX101.ccr.corp.intel.com ([169.254.1.192]) with mapi id 14.03.0195.001; Thu, 12 Feb 2015 12:04:36 +0800 From: "Chen, Jing D" To: "Shaw, Jeffrey B" Thread-Topic: [PATCH v4 12/15] fm10k: Add scatter receive function Thread-Index: AQHQRZqW9yo8K/N6q0WX1jsHTLwFyJzrMCQAgAE2kDA= Date: Thu, 12 Feb 2015 04:04:35 +0000 Message-ID: <4341B239C0EFF9468EE453F9E9F4604D01675C27@shsmsx102.ccr.corp.intel.com> References: <1423551775-3604-2-git-send-email-jing.d.chen@intel.com> <1423618298-2933-1-git-send-email-jing.d.chen@intel.com> <1423618298-2933-13-git-send-email-jing.d.chen@intel.com> <20150211173238.GB2984@plxv1143.pdx.intel.com> In-Reply-To: <20150211173238.GB2984@plxv1143.pdx.intel.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.239.127.40] Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Cc: "dev@dpdk.org" Subject: Re: [dpdk-dev] [PATCH v4 12/15] fm10k: Add scatter receive function X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 12 Feb 2015 04:04:58 -0000 > -----Original Message----- > From: Shaw, Jeffrey B > Sent: Thursday, February 12, 2015 1:33 AM > To: Chen, Jing D > Cc: dev@dpdk.org; Zhang, Helin; Qiu, Michael; nhorman@tuxdriver.com; > thomas.monjalon@6wind.com; david.marchand@6wind.com > Subject: Re: [PATCH v4 12/15] fm10k: Add scatter receive function >=20 > On Wed, Feb 11, 2015 at 09:31:35AM +0800, Chen Jing D(Mark) wrote: > > > > +uint16_t > > +fm10k_recv_scattered_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, > > + uint16_t nb_pkts) > > +{ > > + struct rte_mbuf *mbuf; > > + union fm10k_rx_desc desc; > > + struct fm10k_rx_queue *q =3D rx_queue; > > + uint16_t count =3D 0; > > + uint16_t nb_rcv, nb_seg; > > + int alloc =3D 0; > > + uint16_t next_dd; > > + struct rte_mbuf *first_seg =3D q->pkt_first_seg; > > + struct rte_mbuf *last_seg =3D q->pkt_last_seg; > > + > > + next_dd =3D q->next_dd; > > + nb_rcv =3D 0; > > + > > + nb_seg =3D RTE_MIN(nb_pkts, q->alloc_thresh); > > + for (count =3D 0; count < nb_seg; count++) { > > + mbuf =3D q->sw_ring[next_dd]; > > + desc =3D q->hw_ring[next_dd]; > > + if (!(desc.d.staterr & FM10K_RXD_STATUS_DD)) > > + break; > > +#ifdef RTE_LIBRTE_FM10K_DEBUG_RX > > + dump_rxd(&desc); > > +#endif > > + > > + if (++next_dd =3D=3D q->nb_desc) { > > + next_dd =3D 0; > > + alloc =3D 1; > > + } > > + > > + /* Prefetch next mbuf while processing current one. */ > > + rte_prefetch0(q->sw_ring[next_dd]); > > + > > + /* > > + * When next RX descriptor is on a cache-line boundary, > > + * prefetch the next 4 RX descriptors and the next 8 pointers > > + * to mbufs. > > + */ > > + if ((next_dd & 0x3) =3D=3D 0) { > > + rte_prefetch0(&q->hw_ring[next_dd]); > > + rte_prefetch0(&q->sw_ring[next_dd]); > > + } > > + > > + /* Fill data length */ > > + rte_pktmbuf_data_len(mbuf) =3D desc.w.length; > > + > > + /* > > + * If this is the first buffer of the received packet, > > + * set the pointer to the first mbuf of the packet and > > + * initialize its context. > > + * Otherwise, update the total length and the number of > segments > > + * of the current scattered packet, and update the pointer to > > + * the last mbuf of the current packet. > > + */ > > + if (!first_seg) { > > + first_seg =3D mbuf; > > + first_seg->pkt_len =3D desc.w.length; > > + } else { > > + first_seg->pkt_len =3D > > + (uint16_t)(first_seg->pkt_len + > > + rte_pktmbuf_data_len(mbuf)); > > + first_seg->nb_segs++; > > + last_seg->next =3D mbuf; > > + } > > + > > + /* > > + * If this is not the last buffer of the received packet, > > + * update the pointer to the last mbuf of the current > scattered > > + * packet and continue to parse the RX ring. > > + */ > > + if (!(desc.d.staterr & FM10K_RXD_STATUS_EOP)) { > > + last_seg =3D mbuf; > > + continue; > > + } > > + > > + first_seg->ol_flags =3D 0; > > +#ifdef RTE_LIBRTE_FM10K_RX_OLFLAGS_ENABLE > > + rx_desc_to_ol_flags(first_seg, &desc); > > +#endif > > + first_seg->hash.rss =3D desc.d.rss; > > + > > + /* Prefetch data of first segment, if configured to do so. */ > > + rte_packet_prefetch((char *)first_seg->buf_addr + > > + first_seg->data_off); > > + > > + /* > > + * Store the mbuf address into the next entry of the array > > + * of returned packets. > > + */ > > + rx_pkts[nb_rcv++] =3D first_seg; > > + > > + /* > > + * Setup receipt context for a new packet. > > + */ > > + first_seg =3D NULL; > > + } > > + > > + q->next_dd =3D next_dd; > > + q->pkt_first_seg =3D first_seg; > > + q->pkt_last_seg =3D last_seg; > > + > > + if ((q->next_dd > q->next_trigger) || (alloc =3D=3D 1)) { > > + rte_mempool_get_bulk(q->mp, (void **)&q->sw_ring[q- > >next_alloc], > > + q->alloc_thresh); >=20 > Same thing here. The return value should be checked in case the > mempool runs out of buffers. Thanks! I'll change accordingly. >=20 > > + for (; q->next_alloc <=3D q->next_trigger; ++q->next_alloc) { > > + mbuf =3D q->sw_ring[q->next_alloc]; > > + > > + /* setup static mbuf fields */ > > + fm10k_pktmbuf_reset(mbuf, q->port_id); > > + > > + /* write descriptor */ > > + desc.q.pkt_addr =3D > MBUF_DMA_ADDR_DEFAULT(mbuf); > > + desc.q.hdr_addr =3D > MBUF_DMA_ADDR_DEFAULT(mbuf); > > + q->hw_ring[q->next_alloc] =3D desc; > > + } > > + FM10K_PCI_REG_WRITE(q->tail_ptr, q->next_trigger); > > + q->next_trigger +=3D q->alloc_thresh; > > + if (q->next_trigger >=3D q->nb_desc) { > > + q->next_trigger =3D q->alloc_thresh - 1; > > + q->next_alloc =3D 0; > > + } > > + } > > + > > + return nb_rcv; > > +} > > +