DPDK patches and discussions
 help / color / mirror / Atom feed
* [dpdk-dev] [PATCH 0/2] virtio: bugfix and cleanup
@ 2015-12-04  1:12 Stephen Hemminger
  2015-12-04  1:12 ` [dpdk-dev] [PATCH 1/2] virtio: make sure rcv mbuf initialized correctly Stephen Hemminger
                   ` (2 more replies)
  0 siblings, 3 replies; 8+ messages in thread
From: Stephen Hemminger @ 2015-12-04  1:12 UTC (permalink / raw)
  To: huawei.xie, yuanhan.liu; +Cc: dev

Fix for stale offload flags, and simplify transmit checks.

Stephen Hemminger (2):
  virtio: make sure rcv mbuf initialized correctly
  virtio: clean up space checks on xmit

 drivers/net/virtio/virtio_rxtx.c | 72 ++++++++++++++++++----------------------
 1 file changed, 33 insertions(+), 39 deletions(-)

-- 
2.1.4

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [dpdk-dev] [PATCH 1/2] virtio: make sure rcv mbuf initialized correctly
  2015-12-04  1:12 [dpdk-dev] [PATCH 0/2] virtio: bugfix and cleanup Stephen Hemminger
@ 2015-12-04  1:12 ` Stephen Hemminger
  2015-12-04  3:18   ` Yuanhan Liu
  2015-12-04  1:12 ` [dpdk-dev] [PATCH 2/2] virtio: clean up space checks on xmit Stephen Hemminger
  2015-12-06 23:02 ` [dpdk-dev] [PATCH 0/2] virtio: bugfix and cleanup Thomas Monjalon
  2 siblings, 1 reply; 8+ messages in thread
From: Stephen Hemminger @ 2015-12-04  1:12 UTC (permalink / raw)
  To: huawei.xie, yuanhan.liu; +Cc: dev

The virtio driver was not initializing all the fields in
the receive mbuf. This would cause bugs where previous usage
of mbuf would leave stale TCI and offload flags.

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
 drivers/net/virtio/virtio_rxtx.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/drivers/net/virtio/virtio_rxtx.c b/drivers/net/virtio/virtio_rxtx.c
index 5770fa2..466fee6 100644
--- a/drivers/net/virtio/virtio_rxtx.c
+++ b/drivers/net/virtio/virtio_rxtx.c
@@ -611,6 +611,8 @@ virtio_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
 
 		rxm->port = rxvq->port_id;
 		rxm->data_off = RTE_PKTMBUF_HEADROOM;
+		rxm->ol_flags = 0;
+		rxm->vlan_tci = 0;
 
 		rxm->nb_segs = 1;
 		rxm->next = NULL;
@@ -731,6 +733,8 @@ virtio_recv_mergeable_pkts(void *rx_queue,
 		rxm->data_off = RTE_PKTMBUF_HEADROOM;
 		rxm->nb_segs = seg_num;
 		rxm->next = NULL;
+		rxm->ol_flags = 0;
+		rxm->vlan_tci = 0;
 		rxm->pkt_len = (uint32_t)(len[0] - hdr_size);
 		rxm->data_len = (uint16_t)(len[0] - hdr_size);
 
-- 
2.1.4

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [dpdk-dev] [PATCH 2/2] virtio: clean up space checks on xmit
  2015-12-04  1:12 [dpdk-dev] [PATCH 0/2] virtio: bugfix and cleanup Stephen Hemminger
  2015-12-04  1:12 ` [dpdk-dev] [PATCH 1/2] virtio: make sure rcv mbuf initialized correctly Stephen Hemminger
@ 2015-12-04  1:12 ` Stephen Hemminger
  2015-12-04  3:28   ` Yuanhan Liu
  2015-12-06 23:02 ` [dpdk-dev] [PATCH 0/2] virtio: bugfix and cleanup Thomas Monjalon
  2 siblings, 1 reply; 8+ messages in thread
From: Stephen Hemminger @ 2015-12-04  1:12 UTC (permalink / raw)
  To: huawei.xie, yuanhan.liu; +Cc: dev

The space check for transmit ring only needs a single conditional.
I.e only need to recheck for space if there was no space in first check.

This can help performance and simplifies loop.

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
 drivers/net/virtio/virtio_rxtx.c | 68 +++++++++++++++++-----------------------
 1 file changed, 29 insertions(+), 39 deletions(-)

diff --git a/drivers/net/virtio/virtio_rxtx.c b/drivers/net/virtio/virtio_rxtx.c
index 466fee6..7cb932a 100644
--- a/drivers/net/virtio/virtio_rxtx.c
+++ b/drivers/net/virtio/virtio_rxtx.c
@@ -832,7 +832,6 @@ uint16_t
 virtio_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts)
 {
 	struct virtqueue *txvq = tx_queue;
-	struct rte_mbuf *txm;
 	uint16_t nb_used, nb_tx;
 	int error;
 
@@ -846,58 +845,49 @@ virtio_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts)
 	if (likely(nb_used > txvq->vq_nentries - txvq->vq_free_thresh))
 		virtio_xmit_cleanup(txvq, nb_used);
 
-	nb_tx = 0;
-
-	while (nb_tx < nb_pkts) {
+	for (nb_tx = 0; nb_tx < nb_pkts; nb_tx++) {
+		struct rte_mbuf *txm = tx_pkts[nb_tx];
 		/* Need one more descriptor for virtio header. */
-		int need = tx_pkts[nb_tx]->nb_segs - txvq->vq_free_cnt + 1;
+		int need = txm->nb_segs - txvq->vq_free_cnt + 1;
 
-		/*Positive value indicates it need free vring descriptors */
+		/* Positive value indicates it need free vring descriptors */
 		if (unlikely(need > 0)) {
 			nb_used = VIRTQUEUE_NUSED(txvq);
 			virtio_rmb();
 			need = RTE_MIN(need, (int)nb_used);
 
 			virtio_xmit_cleanup(txvq, need);
-			need = (int)tx_pkts[nb_tx]->nb_segs -
-				txvq->vq_free_cnt + 1;
+			need = txm->nb_segs - txvq->vq_free_cnt + 1;
+			if (unlikely(need > 0)) {
+				PMD_TX_LOG(ERR,
+					   "No free tx descriptors to transmit");
+				break;
+ 			}
 		}
 
-		/*
-		 * Zero or negative value indicates it has enough free
-		 * descriptors to use for transmitting.
-		 */
-		if (likely(need <= 0)) {
-			txm = tx_pkts[nb_tx];
-
-			/* Do VLAN tag insertion */
-			if (unlikely(txm->ol_flags & PKT_TX_VLAN_PKT)) {
-				error = rte_vlan_insert(&txm);
-				if (unlikely(error)) {
-					rte_pktmbuf_free(txm);
-					++nb_tx;
-					continue;
-				}
-			}
-
-			/* Enqueue Packet buffers */
-			error = virtqueue_enqueue_xmit(txvq, txm);
+		/* Do VLAN tag insertion */
+		if (unlikely(txm->ol_flags & PKT_TX_VLAN_PKT)) {
+			error = rte_vlan_insert(&txm);
 			if (unlikely(error)) {
-				if (error == ENOSPC)
-					PMD_TX_LOG(ERR, "virtqueue_enqueue Free count = 0");
-				else if (error == EMSGSIZE)
-					PMD_TX_LOG(ERR, "virtqueue_enqueue Free count < 1");
-				else
-					PMD_TX_LOG(ERR, "virtqueue_enqueue error: %d", error);
-				break;
+				rte_pktmbuf_free(txm);
+				continue;
 			}
-			nb_tx++;
-			txvq->bytes += txm->pkt_len;
-			virtio_update_packet_stats(txvq, txm);
-		} else {
-			PMD_TX_LOG(ERR, "No free tx descriptors to transmit");
+		}
+
+		/* Enqueue Packet buffers */
+		error = virtqueue_enqueue_xmit(txvq, txm);
+		if (unlikely(error)) {
+			if (error == ENOSPC)
+				PMD_TX_LOG(ERR, "virtqueue_enqueue Free count = 0");
+			else if (error == EMSGSIZE)
+				PMD_TX_LOG(ERR, "virtqueue_enqueue Free count < 1");
+			else
+				PMD_TX_LOG(ERR, "virtqueue_enqueue error: %d", error);
 			break;
 		}
+
+		txvq->bytes += txm->pkt_len;
+		virtio_update_packet_stats(txvq, txm);
 	}
 
 	txvq->packets += nb_tx;
-- 
2.1.4

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [dpdk-dev] [PATCH 1/2] virtio: make sure rcv mbuf initialized correctly
  2015-12-04  1:12 ` [dpdk-dev] [PATCH 1/2] virtio: make sure rcv mbuf initialized correctly Stephen Hemminger
@ 2015-12-04  3:18   ` Yuanhan Liu
  0 siblings, 0 replies; 8+ messages in thread
From: Yuanhan Liu @ 2015-12-04  3:18 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: dev

On Thu, Dec 03, 2015 at 05:12:53PM -0800, Stephen Hemminger wrote:
> The virtio driver was not initializing all the fields in
> the receive mbuf. This would cause bugs where previous usage
> of mbuf would leave stale TCI and offload flags.

Acked-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>

Thanks.

	--yliu

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [dpdk-dev] [PATCH 2/2] virtio: clean up space checks on xmit
  2015-12-04  1:12 ` [dpdk-dev] [PATCH 2/2] virtio: clean up space checks on xmit Stephen Hemminger
@ 2015-12-04  3:28   ` Yuanhan Liu
  2015-12-05 19:50     ` Stephen Hemminger
  0 siblings, 1 reply; 8+ messages in thread
From: Yuanhan Liu @ 2015-12-04  3:28 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: dev

On Thu, Dec 03, 2015 at 05:12:54PM -0800, Stephen Hemminger wrote:
> The space check for transmit ring only needs a single conditional.
> I.e only need to recheck for space if there was no space in first check.
> 
> This can help performance and simplifies loop.

This is a good cleanup. Besides that, I have few minor comments below.

> 
> Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
> ---
>  drivers/net/virtio/virtio_rxtx.c | 68 +++++++++++++++++-----------------------
>  1 file changed, 29 insertions(+), 39 deletions(-)
> 
> diff --git a/drivers/net/virtio/virtio_rxtx.c b/drivers/net/virtio/virtio_rxtx.c
> index 466fee6..7cb932a 100644
> --- a/drivers/net/virtio/virtio_rxtx.c
> +++ b/drivers/net/virtio/virtio_rxtx.c
> @@ -832,7 +832,6 @@ uint16_t
>  virtio_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts)
>  {
>  	struct virtqueue *txvq = tx_queue;
> -	struct rte_mbuf *txm;
>  	uint16_t nb_used, nb_tx;
>  	int error;
>  
> @@ -846,58 +845,49 @@ virtio_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts)
>  	if (likely(nb_used > txvq->vq_nentries - txvq->vq_free_thresh))
>  		virtio_xmit_cleanup(txvq, nb_used);
>  
> -	nb_tx = 0;
> -
> -	while (nb_tx < nb_pkts) {
> +	for (nb_tx = 0; nb_tx < nb_pkts; nb_tx++) {
> +		struct rte_mbuf *txm = tx_pkts[nb_tx];
>  		/* Need one more descriptor for virtio header. */
> -		int need = tx_pkts[nb_tx]->nb_segs - txvq->vq_free_cnt + 1;
> +		int need = txm->nb_segs - txvq->vq_free_cnt + 1;

While reviewing the code, I found the var name `need' is not properly
taken. Maybe `need_cleanup' is better, and it's better to be defined
as bool type. What do you think of that?

(And yes, it has nothing to do with your patch, I just found it we
can rename it to a better name to improve the code readability a bit.
If you agree, would you submit a patch, or should I do it?)

>  
> -		/*Positive value indicates it need free vring descriptors */
> +		/* Positive value indicates it need free vring descriptors */
>  		if (unlikely(need > 0)) {
>  			nb_used = VIRTQUEUE_NUSED(txvq);
>  			virtio_rmb();
>  			need = RTE_MIN(need, (int)nb_used);
>  
>  			virtio_xmit_cleanup(txvq, need);
> -			need = (int)tx_pkts[nb_tx]->nb_segs -
> -				txvq->vq_free_cnt + 1;
> +			need = txm->nb_segs - txvq->vq_free_cnt + 1;
> +			if (unlikely(need > 0)) {
> +				PMD_TX_LOG(ERR,
> +					   "No free tx descriptors to transmit");
> +				break;
> + 			}
   ^

Minor nit: I found a leading white space there.

Otherwise, it looks good:

Acked-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>

	--yliu

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [dpdk-dev] [PATCH 2/2] virtio: clean up space checks on xmit
  2015-12-04  3:28   ` Yuanhan Liu
@ 2015-12-05 19:50     ` Stephen Hemminger
  2015-12-08  1:54       ` Yuanhan Liu
  0 siblings, 1 reply; 8+ messages in thread
From: Stephen Hemminger @ 2015-12-05 19:50 UTC (permalink / raw)
  To: Yuanhan Liu; +Cc: dev

	int error;
> >  
> > @@ -846,58 +845,49 @@ virtio_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts)
> >  	if (likely(nb_used > txvq->vq_nentries - txvq->vq_free_thresh))
> >  		virtio_xmit_cleanup(txvq, nb_used);
> >  
> > -	nb_tx = 0;
> > -
> > -	while (nb_tx < nb_pkts) {
> > +	for (nb_tx = 0; nb_tx < nb_pkts; nb_tx++) {
> > +		struct rte_mbuf *txm = tx_pkts[nb_tx];
> >  		/* Need one more descriptor for virtio header. */
> > -		int need = tx_pkts[nb_tx]->nb_segs - txvq->vq_free_cnt + 1;
> > +		int need = txm->nb_segs - txvq->vq_free_cnt + 1;
> 
> While reviewing the code, I found the var name `need' is not properly
> taken. Maybe `need_cleanup' is better, and it's better to be defined
> as bool type. What do you think of that?

The variable need indicates how many more buffers are needed to
complete the transmit.  In later patches, there is a variable slots
so:
  needed = slots - free

So if needed is positive, then more buffers are needed than available
and transmit is blocked. If needed is negative then there is free
space available.

> 
> (And yes, it has nothing to do with your patch, I just found it we
> can rename it to a better name to improve the code readability a bit.
> If you agree, would you submit a patch, or should I do it?)
> 
> >  
> > -		/*Positive value indicates it need free vring descriptors */
> > +		/* Positive value indicates it need free vring descriptors */
> >  		if (unlikely(need > 0)) {
> >  			nb_used = VIRTQUEUE_NUSED(txvq);
> >  			virtio_rmb();
> >  			need = RTE_MIN(need, (int)nb_used);
> >  
> >  			virtio_xmit_cleanup(txvq, need);
> > -			need = (int)tx_pkts[nb_tx]->nb_segs -
> > -				txvq->vq_free_cnt + 1;
> > +			need = txm->nb_segs - txvq->vq_free_cnt + 1;
> > +			if (unlikely(need > 0)) {
> > +				PMD_TX_LOG(ERR,
> > +					   "No free tx descriptors to transmit");
> > +				break;
> > + 			}
>    ^
> 
> Minor nit: I found a leading white space there.

Hmm. I didn't see it in checkpatch.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [dpdk-dev] [PATCH 0/2] virtio: bugfix and cleanup
  2015-12-04  1:12 [dpdk-dev] [PATCH 0/2] virtio: bugfix and cleanup Stephen Hemminger
  2015-12-04  1:12 ` [dpdk-dev] [PATCH 1/2] virtio: make sure rcv mbuf initialized correctly Stephen Hemminger
  2015-12-04  1:12 ` [dpdk-dev] [PATCH 2/2] virtio: clean up space checks on xmit Stephen Hemminger
@ 2015-12-06 23:02 ` Thomas Monjalon
  2 siblings, 0 replies; 8+ messages in thread
From: Thomas Monjalon @ 2015-12-06 23:02 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: dev

> Fix for stale offload flags, and simplify transmit checks.
> 
> Stephen Hemminger (2):
>   virtio: make sure rcv mbuf initialized correctly
>   virtio: clean up space checks on xmit

Applied, thanks

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [dpdk-dev] [PATCH 2/2] virtio: clean up space checks on xmit
  2015-12-05 19:50     ` Stephen Hemminger
@ 2015-12-08  1:54       ` Yuanhan Liu
  0 siblings, 0 replies; 8+ messages in thread
From: Yuanhan Liu @ 2015-12-08  1:54 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: dev

On Sat, Dec 05, 2015 at 11:50:07AM -0800, Stephen Hemminger wrote:
> 	int error;
> > >  
> > > @@ -846,58 +845,49 @@ virtio_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts)
> > >  	if (likely(nb_used > txvq->vq_nentries - txvq->vq_free_thresh))
> > >  		virtio_xmit_cleanup(txvq, nb_used);
> > >  
> > > -	nb_tx = 0;
> > > -
> > > -	while (nb_tx < nb_pkts) {
> > > +	for (nb_tx = 0; nb_tx < nb_pkts; nb_tx++) {
> > > +		struct rte_mbuf *txm = tx_pkts[nb_tx];
> > >  		/* Need one more descriptor for virtio header. */
> > > -		int need = tx_pkts[nb_tx]->nb_segs - txvq->vq_free_cnt + 1;
> > > +		int need = txm->nb_segs - txvq->vq_free_cnt + 1;
> > 
> > While reviewing the code, I found the var name `need' is not properly
> > taken. Maybe `need_cleanup' is better, and it's better to be defined
> > as bool type. What do you think of that?
> 
> The variable need indicates how many more buffers are needed to
> complete the transmit.  In later patches, there is a variable slots
> so:
>   needed = slots - free
> 
> So if needed is positive, then more buffers are needed than available
> and transmit is blocked. If needed is negative then there is free
> space available.

Yeah, I knew that. And there is a comment for that (thanks for the
explanation anyway!):

	/* Positive value indicates it need free vring descriptors */

I mean, if a var name well taken, we could avoid comments like above.

However, for this case, I simply overlooked that virtio_xmit_cleanup()
takes `need' as the input, so that I thought `need' is just a boolean
var to check if we need to get few more free spaces. And that's how
my above suggestion comes. So, sorry for the noisy.

	--yliu

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2015-12-08  1:53 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-12-04  1:12 [dpdk-dev] [PATCH 0/2] virtio: bugfix and cleanup Stephen Hemminger
2015-12-04  1:12 ` [dpdk-dev] [PATCH 1/2] virtio: make sure rcv mbuf initialized correctly Stephen Hemminger
2015-12-04  3:18   ` Yuanhan Liu
2015-12-04  1:12 ` [dpdk-dev] [PATCH 2/2] virtio: clean up space checks on xmit Stephen Hemminger
2015-12-04  3:28   ` Yuanhan Liu
2015-12-05 19:50     ` Stephen Hemminger
2015-12-08  1:54       ` Yuanhan Liu
2015-12-06 23:02 ` [dpdk-dev] [PATCH 0/2] virtio: bugfix and cleanup Thomas Monjalon

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).