All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] virtio: Introduce a new kick interface virtqueue_kick_try()
@ 2021-05-19 11:47 ` Xuan Zhuo
  0 siblings, 0 replies; 10+ messages in thread
From: Xuan Zhuo @ 2021-05-19 11:47 UTC (permalink / raw)
  To: virtualization
  Cc: Michael S. Tsirkin, Jason Wang, David S. Miller, Jakub Kicinski, netdev

Unlike virtqueue_kick(), virtqueue_kick_try() returns true only when the
kick is successful. In virtio-net, we want to count the number of kicks.
So we need an interface that can perceive whether the kick is actually
executed.

Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
---
 drivers/net/virtio_net.c     |  8 ++++----
 drivers/virtio/virtio_ring.c | 20 ++++++++++++++++++++
 include/linux/virtio.h       |  2 ++
 3 files changed, 26 insertions(+), 4 deletions(-)

diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
index 9b6a4a875c55..167697030cb6 100644
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -617,7 +617,7 @@ static int virtnet_xdp_xmit(struct net_device *dev,
 	ret = nxmit;
 
 	if (flags & XDP_XMIT_FLUSH) {
-		if (virtqueue_kick_prepare(sq->vq) && virtqueue_notify(sq->vq))
+		if (virtqueue_kick_try(sq->vq))
 			kicks = 1;
 	}
 out:
@@ -1325,7 +1325,7 @@ static bool try_fill_recv(struct virtnet_info *vi, struct receive_queue *rq,
 		if (err)
 			break;
 	} while (rq->vq->num_free);
-	if (virtqueue_kick_prepare(rq->vq) && virtqueue_notify(rq->vq)) {
+	if (virtqueue_kick_try(rq->vq)) {
 		unsigned long flags;
 
 		flags = u64_stats_update_begin_irqsave(&rq->stats.syncp);
@@ -1533,7 +1533,7 @@ static int virtnet_poll(struct napi_struct *napi, int budget)
 
 	if (xdp_xmit & VIRTIO_XDP_TX) {
 		sq = virtnet_xdp_get_sq(vi);
-		if (virtqueue_kick_prepare(sq->vq) && virtqueue_notify(sq->vq)) {
+		if (virtqueue_kick_try(sq->vq)) {
 			u64_stats_update_begin(&sq->stats.syncp);
 			sq->stats.kicks++;
 			u64_stats_update_end(&sq->stats.syncp);
@@ -1710,7 +1710,7 @@ static netdev_tx_t start_xmit(struct sk_buff *skb, struct net_device *dev)
 	}
 
 	if (kick || netif_xmit_stopped(txq)) {
-		if (virtqueue_kick_prepare(sq->vq) && virtqueue_notify(sq->vq)) {
+		if (virtqueue_kick_try(sq->vq)) {
 			u64_stats_update_begin(&sq->stats.syncp);
 			sq->stats.kicks++;
 			u64_stats_update_end(&sq->stats.syncp);
diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c
index 71e16b53e9c1..1462be756875 100644
--- a/drivers/virtio/virtio_ring.c
+++ b/drivers/virtio/virtio_ring.c
@@ -1874,6 +1874,26 @@ bool virtqueue_kick(struct virtqueue *vq)
 }
 EXPORT_SYMBOL_GPL(virtqueue_kick);
 
+/**
+ * virtqueue_kick_try - try update after add_buf
+ * @vq: the struct virtqueue
+ *
+ * After one or more virtqueue_add_* calls, invoke this to kick
+ * the other side.
+ *
+ * Caller must ensure we don't call this with other virtqueue
+ * operations at the same time (except where noted).
+ *
+ * Returns true if kick success, otherwise false.
+ */
+bool virtqueue_kick_try(struct virtqueue *vq)
+{
+	if (virtqueue_kick_prepare(vq) && virtqueue_notify(vq))
+		return true;
+	return false;
+}
+EXPORT_SYMBOL_GPL(virtqueue_kick_try);
+
 /**
  * virtqueue_get_buf - get the next used buffer
  * @_vq: the struct virtqueue we're talking about.
diff --git a/include/linux/virtio.h b/include/linux/virtio.h
index b1894e0323fa..45cd6a0af24d 100644
--- a/include/linux/virtio.h
+++ b/include/linux/virtio.h
@@ -59,6 +59,8 @@ int virtqueue_add_sgs(struct virtqueue *vq,
 
 bool virtqueue_kick(struct virtqueue *vq);
 
+bool virtqueue_kick_try(struct virtqueue *vq);
+
 bool virtqueue_kick_prepare(struct virtqueue *vq);
 
 bool virtqueue_notify(struct virtqueue *vq);
-- 
2.31.0


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

* [PATCH] virtio: Introduce a new kick interface virtqueue_kick_try()
@ 2021-05-19 11:47 ` Xuan Zhuo
  0 siblings, 0 replies; 10+ messages in thread
From: Xuan Zhuo @ 2021-05-19 11:47 UTC (permalink / raw)
  To: virtualization
  Cc: Jakub Kicinski, netdev, David S. Miller, Michael S. Tsirkin

Unlike virtqueue_kick(), virtqueue_kick_try() returns true only when the
kick is successful. In virtio-net, we want to count the number of kicks.
So we need an interface that can perceive whether the kick is actually
executed.

Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
---
 drivers/net/virtio_net.c     |  8 ++++----
 drivers/virtio/virtio_ring.c | 20 ++++++++++++++++++++
 include/linux/virtio.h       |  2 ++
 3 files changed, 26 insertions(+), 4 deletions(-)

diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
index 9b6a4a875c55..167697030cb6 100644
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -617,7 +617,7 @@ static int virtnet_xdp_xmit(struct net_device *dev,
 	ret = nxmit;
 
 	if (flags & XDP_XMIT_FLUSH) {
-		if (virtqueue_kick_prepare(sq->vq) && virtqueue_notify(sq->vq))
+		if (virtqueue_kick_try(sq->vq))
 			kicks = 1;
 	}
 out:
@@ -1325,7 +1325,7 @@ static bool try_fill_recv(struct virtnet_info *vi, struct receive_queue *rq,
 		if (err)
 			break;
 	} while (rq->vq->num_free);
-	if (virtqueue_kick_prepare(rq->vq) && virtqueue_notify(rq->vq)) {
+	if (virtqueue_kick_try(rq->vq)) {
 		unsigned long flags;
 
 		flags = u64_stats_update_begin_irqsave(&rq->stats.syncp);
@@ -1533,7 +1533,7 @@ static int virtnet_poll(struct napi_struct *napi, int budget)
 
 	if (xdp_xmit & VIRTIO_XDP_TX) {
 		sq = virtnet_xdp_get_sq(vi);
-		if (virtqueue_kick_prepare(sq->vq) && virtqueue_notify(sq->vq)) {
+		if (virtqueue_kick_try(sq->vq)) {
 			u64_stats_update_begin(&sq->stats.syncp);
 			sq->stats.kicks++;
 			u64_stats_update_end(&sq->stats.syncp);
@@ -1710,7 +1710,7 @@ static netdev_tx_t start_xmit(struct sk_buff *skb, struct net_device *dev)
 	}
 
 	if (kick || netif_xmit_stopped(txq)) {
-		if (virtqueue_kick_prepare(sq->vq) && virtqueue_notify(sq->vq)) {
+		if (virtqueue_kick_try(sq->vq)) {
 			u64_stats_update_begin(&sq->stats.syncp);
 			sq->stats.kicks++;
 			u64_stats_update_end(&sq->stats.syncp);
diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c
index 71e16b53e9c1..1462be756875 100644
--- a/drivers/virtio/virtio_ring.c
+++ b/drivers/virtio/virtio_ring.c
@@ -1874,6 +1874,26 @@ bool virtqueue_kick(struct virtqueue *vq)
 }
 EXPORT_SYMBOL_GPL(virtqueue_kick);
 
+/**
+ * virtqueue_kick_try - try update after add_buf
+ * @vq: the struct virtqueue
+ *
+ * After one or more virtqueue_add_* calls, invoke this to kick
+ * the other side.
+ *
+ * Caller must ensure we don't call this with other virtqueue
+ * operations at the same time (except where noted).
+ *
+ * Returns true if kick success, otherwise false.
+ */
+bool virtqueue_kick_try(struct virtqueue *vq)
+{
+	if (virtqueue_kick_prepare(vq) && virtqueue_notify(vq))
+		return true;
+	return false;
+}
+EXPORT_SYMBOL_GPL(virtqueue_kick_try);
+
 /**
  * virtqueue_get_buf - get the next used buffer
  * @_vq: the struct virtqueue we're talking about.
diff --git a/include/linux/virtio.h b/include/linux/virtio.h
index b1894e0323fa..45cd6a0af24d 100644
--- a/include/linux/virtio.h
+++ b/include/linux/virtio.h
@@ -59,6 +59,8 @@ int virtqueue_add_sgs(struct virtqueue *vq,
 
 bool virtqueue_kick(struct virtqueue *vq);
 
+bool virtqueue_kick_try(struct virtqueue *vq);
+
 bool virtqueue_kick_prepare(struct virtqueue *vq);
 
 bool virtqueue_notify(struct virtqueue *vq);
-- 
2.31.0

_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

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

* Re: [PATCH] virtio: Introduce a new kick interface virtqueue_kick_try()
  2021-05-19 11:47 ` Xuan Zhuo
@ 2021-05-19 12:44   ` Michael S. Tsirkin
  -1 siblings, 0 replies; 10+ messages in thread
From: Michael S. Tsirkin @ 2021-05-19 12:44 UTC (permalink / raw)
  To: Xuan Zhuo
  Cc: virtualization, Jason Wang, David S. Miller, Jakub Kicinski, netdev

On Wed, May 19, 2021 at 07:47:57PM +0800, Xuan Zhuo wrote:
> Unlike virtqueue_kick(), virtqueue_kick_try() returns true only when the
> kick is successful. In virtio-net, we want to count the number of kicks.
> So we need an interface that can perceive whether the kick is actually
> executed.
> 
> Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
> ---
>  drivers/net/virtio_net.c     |  8 ++++----
>  drivers/virtio/virtio_ring.c | 20 ++++++++++++++++++++
>  include/linux/virtio.h       |  2 ++
>  3 files changed, 26 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
> index 9b6a4a875c55..167697030cb6 100644
> --- a/drivers/net/virtio_net.c
> +++ b/drivers/net/virtio_net.c
> @@ -617,7 +617,7 @@ static int virtnet_xdp_xmit(struct net_device *dev,
>  	ret = nxmit;
>  
>  	if (flags & XDP_XMIT_FLUSH) {
> -		if (virtqueue_kick_prepare(sq->vq) && virtqueue_notify(sq->vq))
> +		if (virtqueue_kick_try(sq->vq))
>  			kicks = 1;
>  	}
>  out:
> @@ -1325,7 +1325,7 @@ static bool try_fill_recv(struct virtnet_info *vi, struct receive_queue *rq,
>  		if (err)
>  			break;
>  	} while (rq->vq->num_free);
> -	if (virtqueue_kick_prepare(rq->vq) && virtqueue_notify(rq->vq)) {
> +	if (virtqueue_kick_try(rq->vq)) {
>  		unsigned long flags;
>  
>  		flags = u64_stats_update_begin_irqsave(&rq->stats.syncp);
> @@ -1533,7 +1533,7 @@ static int virtnet_poll(struct napi_struct *napi, int budget)
>  
>  	if (xdp_xmit & VIRTIO_XDP_TX) {
>  		sq = virtnet_xdp_get_sq(vi);
> -		if (virtqueue_kick_prepare(sq->vq) && virtqueue_notify(sq->vq)) {
> +		if (virtqueue_kick_try(sq->vq)) {
>  			u64_stats_update_begin(&sq->stats.syncp);
>  			sq->stats.kicks++;
>  			u64_stats_update_end(&sq->stats.syncp);
> @@ -1710,7 +1710,7 @@ static netdev_tx_t start_xmit(struct sk_buff *skb, struct net_device *dev)
>  	}
>  
>  	if (kick || netif_xmit_stopped(txq)) {
> -		if (virtqueue_kick_prepare(sq->vq) && virtqueue_notify(sq->vq)) {
> +		if (virtqueue_kick_try(sq->vq)) {
>  			u64_stats_update_begin(&sq->stats.syncp);
>  			sq->stats.kicks++;
>  			u64_stats_update_end(&sq->stats.syncp);
> diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c
> index 71e16b53e9c1..1462be756875 100644
> --- a/drivers/virtio/virtio_ring.c
> +++ b/drivers/virtio/virtio_ring.c
> @@ -1874,6 +1874,26 @@ bool virtqueue_kick(struct virtqueue *vq)
>  }
>  EXPORT_SYMBOL_GPL(virtqueue_kick);
>  
> +/**
> + * virtqueue_kick_try - try update after add_buf
> + * @vq: the struct virtqueue
> + *
> + * After one or more virtqueue_add_* calls, invoke this to kick
> + * the other side.
> + *
> + * Caller must ensure we don't call this with other virtqueue
> + * operations at the same time (except where noted).
> + *
> + * Returns true if kick success, otherwise false.

so what is the difference between this and virtqueue_kick
which says

 * Returns false if kick failed, otherwise true.







> + */
> +bool virtqueue_kick_try(struct virtqueue *vq)
> +{
> +	if (virtqueue_kick_prepare(vq) && virtqueue_notify(vq))
> +		return true;
> +	return false;
> +}
> +EXPORT_SYMBOL_GPL(virtqueue_kick_try);
> +
>  /**
>   * virtqueue_get_buf - get the next used buffer
>   * @_vq: the struct virtqueue we're talking about.
> diff --git a/include/linux/virtio.h b/include/linux/virtio.h
> index b1894e0323fa..45cd6a0af24d 100644
> --- a/include/linux/virtio.h
> +++ b/include/linux/virtio.h
> @@ -59,6 +59,8 @@ int virtqueue_add_sgs(struct virtqueue *vq,
>  
>  bool virtqueue_kick(struct virtqueue *vq);
>  
> +bool virtqueue_kick_try(struct virtqueue *vq);
> +
>  bool virtqueue_kick_prepare(struct virtqueue *vq);
>  
>  bool virtqueue_notify(struct virtqueue *vq);
> -- 
> 2.31.0


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

* Re: [PATCH] virtio: Introduce a new kick interface virtqueue_kick_try()
@ 2021-05-19 12:44   ` Michael S. Tsirkin
  0 siblings, 0 replies; 10+ messages in thread
From: Michael S. Tsirkin @ 2021-05-19 12:44 UTC (permalink / raw)
  To: Xuan Zhuo; +Cc: Jakub Kicinski, netdev, David S. Miller, virtualization

On Wed, May 19, 2021 at 07:47:57PM +0800, Xuan Zhuo wrote:
> Unlike virtqueue_kick(), virtqueue_kick_try() returns true only when the
> kick is successful. In virtio-net, we want to count the number of kicks.
> So we need an interface that can perceive whether the kick is actually
> executed.
> 
> Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
> ---
>  drivers/net/virtio_net.c     |  8 ++++----
>  drivers/virtio/virtio_ring.c | 20 ++++++++++++++++++++
>  include/linux/virtio.h       |  2 ++
>  3 files changed, 26 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
> index 9b6a4a875c55..167697030cb6 100644
> --- a/drivers/net/virtio_net.c
> +++ b/drivers/net/virtio_net.c
> @@ -617,7 +617,7 @@ static int virtnet_xdp_xmit(struct net_device *dev,
>  	ret = nxmit;
>  
>  	if (flags & XDP_XMIT_FLUSH) {
> -		if (virtqueue_kick_prepare(sq->vq) && virtqueue_notify(sq->vq))
> +		if (virtqueue_kick_try(sq->vq))
>  			kicks = 1;
>  	}
>  out:
> @@ -1325,7 +1325,7 @@ static bool try_fill_recv(struct virtnet_info *vi, struct receive_queue *rq,
>  		if (err)
>  			break;
>  	} while (rq->vq->num_free);
> -	if (virtqueue_kick_prepare(rq->vq) && virtqueue_notify(rq->vq)) {
> +	if (virtqueue_kick_try(rq->vq)) {
>  		unsigned long flags;
>  
>  		flags = u64_stats_update_begin_irqsave(&rq->stats.syncp);
> @@ -1533,7 +1533,7 @@ static int virtnet_poll(struct napi_struct *napi, int budget)
>  
>  	if (xdp_xmit & VIRTIO_XDP_TX) {
>  		sq = virtnet_xdp_get_sq(vi);
> -		if (virtqueue_kick_prepare(sq->vq) && virtqueue_notify(sq->vq)) {
> +		if (virtqueue_kick_try(sq->vq)) {
>  			u64_stats_update_begin(&sq->stats.syncp);
>  			sq->stats.kicks++;
>  			u64_stats_update_end(&sq->stats.syncp);
> @@ -1710,7 +1710,7 @@ static netdev_tx_t start_xmit(struct sk_buff *skb, struct net_device *dev)
>  	}
>  
>  	if (kick || netif_xmit_stopped(txq)) {
> -		if (virtqueue_kick_prepare(sq->vq) && virtqueue_notify(sq->vq)) {
> +		if (virtqueue_kick_try(sq->vq)) {
>  			u64_stats_update_begin(&sq->stats.syncp);
>  			sq->stats.kicks++;
>  			u64_stats_update_end(&sq->stats.syncp);
> diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c
> index 71e16b53e9c1..1462be756875 100644
> --- a/drivers/virtio/virtio_ring.c
> +++ b/drivers/virtio/virtio_ring.c
> @@ -1874,6 +1874,26 @@ bool virtqueue_kick(struct virtqueue *vq)
>  }
>  EXPORT_SYMBOL_GPL(virtqueue_kick);
>  
> +/**
> + * virtqueue_kick_try - try update after add_buf
> + * @vq: the struct virtqueue
> + *
> + * After one or more virtqueue_add_* calls, invoke this to kick
> + * the other side.
> + *
> + * Caller must ensure we don't call this with other virtqueue
> + * operations at the same time (except where noted).
> + *
> + * Returns true if kick success, otherwise false.

so what is the difference between this and virtqueue_kick
which says

 * Returns false if kick failed, otherwise true.







> + */
> +bool virtqueue_kick_try(struct virtqueue *vq)
> +{
> +	if (virtqueue_kick_prepare(vq) && virtqueue_notify(vq))
> +		return true;
> +	return false;
> +}
> +EXPORT_SYMBOL_GPL(virtqueue_kick_try);
> +
>  /**
>   * virtqueue_get_buf - get the next used buffer
>   * @_vq: the struct virtqueue we're talking about.
> diff --git a/include/linux/virtio.h b/include/linux/virtio.h
> index b1894e0323fa..45cd6a0af24d 100644
> --- a/include/linux/virtio.h
> +++ b/include/linux/virtio.h
> @@ -59,6 +59,8 @@ int virtqueue_add_sgs(struct virtqueue *vq,
>  
>  bool virtqueue_kick(struct virtqueue *vq);
>  
> +bool virtqueue_kick_try(struct virtqueue *vq);
> +
>  bool virtqueue_kick_prepare(struct virtqueue *vq);
>  
>  bool virtqueue_notify(struct virtqueue *vq);
> -- 
> 2.31.0

_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

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

* Re: [PATCH] virtio: Introduce a new kick interface virtqueue_kick_try()
  2021-05-19 12:44   ` Michael S. Tsirkin
  (?)
@ 2021-05-19 13:14   ` Xuan Zhuo
  -1 siblings, 0 replies; 10+ messages in thread
From: Xuan Zhuo @ 2021-05-19 13:14 UTC (permalink / raw)
  To: Michael S. Tsirkin
  Cc: Jakub Kicinski, netdev, David S. Miller, virtualization

On Wed, 19 May 2021 08:44:01 -0400, Michael S. Tsirkin <mst@redhat.com> wrote:
> On Wed, May 19, 2021 at 07:47:57PM +0800, Xuan Zhuo wrote:
> > Unlike virtqueue_kick(), virtqueue_kick_try() returns true only when the
> > kick is successful. In virtio-net, we want to count the number of kicks.
> > So we need an interface that can perceive whether the kick is actually
> > executed.
> >
> > Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
> > ---
> >  drivers/net/virtio_net.c     |  8 ++++----
> >  drivers/virtio/virtio_ring.c | 20 ++++++++++++++++++++
> >  include/linux/virtio.h       |  2 ++
> >  3 files changed, 26 insertions(+), 4 deletions(-)
> >
> > diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
> > index 9b6a4a875c55..167697030cb6 100644
> > --- a/drivers/net/virtio_net.c
> > +++ b/drivers/net/virtio_net.c
> > @@ -617,7 +617,7 @@ static int virtnet_xdp_xmit(struct net_device *dev,
> >  	ret = nxmit;
> >
> >  	if (flags & XDP_XMIT_FLUSH) {
> > -		if (virtqueue_kick_prepare(sq->vq) && virtqueue_notify(sq->vq))
> > +		if (virtqueue_kick_try(sq->vq))
> >  			kicks = 1;
> >  	}
> >  out:
> > @@ -1325,7 +1325,7 @@ static bool try_fill_recv(struct virtnet_info *vi, struct receive_queue *rq,
> >  		if (err)
> >  			break;
> >  	} while (rq->vq->num_free);
> > -	if (virtqueue_kick_prepare(rq->vq) && virtqueue_notify(rq->vq)) {
> > +	if (virtqueue_kick_try(rq->vq)) {
> >  		unsigned long flags;
> >
> >  		flags = u64_stats_update_begin_irqsave(&rq->stats.syncp);
> > @@ -1533,7 +1533,7 @@ static int virtnet_poll(struct napi_struct *napi, int budget)
> >
> >  	if (xdp_xmit & VIRTIO_XDP_TX) {
> >  		sq = virtnet_xdp_get_sq(vi);
> > -		if (virtqueue_kick_prepare(sq->vq) && virtqueue_notify(sq->vq)) {
> > +		if (virtqueue_kick_try(sq->vq)) {
> >  			u64_stats_update_begin(&sq->stats.syncp);
> >  			sq->stats.kicks++;
> >  			u64_stats_update_end(&sq->stats.syncp);
> > @@ -1710,7 +1710,7 @@ static netdev_tx_t start_xmit(struct sk_buff *skb, struct net_device *dev)
> >  	}
> >
> >  	if (kick || netif_xmit_stopped(txq)) {
> > -		if (virtqueue_kick_prepare(sq->vq) && virtqueue_notify(sq->vq)) {
> > +		if (virtqueue_kick_try(sq->vq)) {
> >  			u64_stats_update_begin(&sq->stats.syncp);
> >  			sq->stats.kicks++;
> >  			u64_stats_update_end(&sq->stats.syncp);
> > diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c
> > index 71e16b53e9c1..1462be756875 100644
> > --- a/drivers/virtio/virtio_ring.c
> > +++ b/drivers/virtio/virtio_ring.c
> > @@ -1874,6 +1874,26 @@ bool virtqueue_kick(struct virtqueue *vq)
> >  }
> >  EXPORT_SYMBOL_GPL(virtqueue_kick);
> >
> > +/**
> > + * virtqueue_kick_try - try update after add_buf
> > + * @vq: the struct virtqueue
> > + *
> > + * After one or more virtqueue_add_* calls, invoke this to kick
> > + * the other side.
> > + *
> > + * Caller must ensure we don't call this with other virtqueue
> > + * operations at the same time (except where noted).
> > + *
> > + * Returns true if kick success, otherwise false.
>
> so what is the difference between this and virtqueue_kick
> which says
>
>  * Returns false if kick failed, otherwise true.

Calling virtqueue_kick, we can only know whether there is a kick failure, we
don't know whether kick is called. It may return true, but kick is not called.

virtqueue_kick_try() returns true only if the kick is successful, so that we can
know whether kick has been called based on the return value, so as to count the
number of kick calls.

Thanks.

>
>
>
>
>
>
>
> > + */
> > +bool virtqueue_kick_try(struct virtqueue *vq)
> > +{
> > +	if (virtqueue_kick_prepare(vq) && virtqueue_notify(vq))
> > +		return true;
> > +	return false;
> > +}
> > +EXPORT_SYMBOL_GPL(virtqueue_kick_try);
> > +
> >  /**
> >   * virtqueue_get_buf - get the next used buffer
> >   * @_vq: the struct virtqueue we're talking about.
> > diff --git a/include/linux/virtio.h b/include/linux/virtio.h
> > index b1894e0323fa..45cd6a0af24d 100644
> > --- a/include/linux/virtio.h
> > +++ b/include/linux/virtio.h
> > @@ -59,6 +59,8 @@ int virtqueue_add_sgs(struct virtqueue *vq,
> >
> >  bool virtqueue_kick(struct virtqueue *vq);
> >
> > +bool virtqueue_kick_try(struct virtqueue *vq);
> > +
> >  bool virtqueue_kick_prepare(struct virtqueue *vq);
> >
> >  bool virtqueue_notify(struct virtqueue *vq);
> > --
> > 2.31.0
>
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

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

* Re: [PATCH] virtio: Introduce a new kick interface virtqueue_kick_try()
  2021-05-19 11:47 ` Xuan Zhuo
@ 2021-05-31  6:34   ` Jason Wang
  -1 siblings, 0 replies; 10+ messages in thread
From: Jason Wang @ 2021-05-31  6:34 UTC (permalink / raw)
  To: Xuan Zhuo, virtualization
  Cc: Michael S. Tsirkin, David S. Miller, Jakub Kicinski, netdev


在 2021/5/19 下午7:47, Xuan Zhuo 写道:
> Unlike virtqueue_kick(), virtqueue_kick_try() returns true only when the
> kick is successful. In virtio-net, we want to count the number of kicks.
> So we need an interface that can perceive whether the kick is actually
> executed.
>
> Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com>


Acked-by: Jason Wang <jasowang@redhat.com>

Thanks


> ---
>   drivers/net/virtio_net.c     |  8 ++++----
>   drivers/virtio/virtio_ring.c | 20 ++++++++++++++++++++
>   include/linux/virtio.h       |  2 ++
>   3 files changed, 26 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
> index 9b6a4a875c55..167697030cb6 100644
> --- a/drivers/net/virtio_net.c
> +++ b/drivers/net/virtio_net.c
> @@ -617,7 +617,7 @@ static int virtnet_xdp_xmit(struct net_device *dev,
>   	ret = nxmit;
>   
>   	if (flags & XDP_XMIT_FLUSH) {
> -		if (virtqueue_kick_prepare(sq->vq) && virtqueue_notify(sq->vq))
> +		if (virtqueue_kick_try(sq->vq))
>   			kicks = 1;
>   	}
>   out:
> @@ -1325,7 +1325,7 @@ static bool try_fill_recv(struct virtnet_info *vi, struct receive_queue *rq,
>   		if (err)
>   			break;
>   	} while (rq->vq->num_free);
> -	if (virtqueue_kick_prepare(rq->vq) && virtqueue_notify(rq->vq)) {
> +	if (virtqueue_kick_try(rq->vq)) {
>   		unsigned long flags;
>   
>   		flags = u64_stats_update_begin_irqsave(&rq->stats.syncp);
> @@ -1533,7 +1533,7 @@ static int virtnet_poll(struct napi_struct *napi, int budget)
>   
>   	if (xdp_xmit & VIRTIO_XDP_TX) {
>   		sq = virtnet_xdp_get_sq(vi);
> -		if (virtqueue_kick_prepare(sq->vq) && virtqueue_notify(sq->vq)) {
> +		if (virtqueue_kick_try(sq->vq)) {
>   			u64_stats_update_begin(&sq->stats.syncp);
>   			sq->stats.kicks++;
>   			u64_stats_update_end(&sq->stats.syncp);
> @@ -1710,7 +1710,7 @@ static netdev_tx_t start_xmit(struct sk_buff *skb, struct net_device *dev)
>   	}
>   
>   	if (kick || netif_xmit_stopped(txq)) {
> -		if (virtqueue_kick_prepare(sq->vq) && virtqueue_notify(sq->vq)) {
> +		if (virtqueue_kick_try(sq->vq)) {
>   			u64_stats_update_begin(&sq->stats.syncp);
>   			sq->stats.kicks++;
>   			u64_stats_update_end(&sq->stats.syncp);
> diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c
> index 71e16b53e9c1..1462be756875 100644
> --- a/drivers/virtio/virtio_ring.c
> +++ b/drivers/virtio/virtio_ring.c
> @@ -1874,6 +1874,26 @@ bool virtqueue_kick(struct virtqueue *vq)
>   }
>   EXPORT_SYMBOL_GPL(virtqueue_kick);
>   
> +/**
> + * virtqueue_kick_try - try update after add_buf
> + * @vq: the struct virtqueue
> + *
> + * After one or more virtqueue_add_* calls, invoke this to kick
> + * the other side.
> + *
> + * Caller must ensure we don't call this with other virtqueue
> + * operations at the same time (except where noted).
> + *
> + * Returns true if kick success, otherwise false.
> + */
> +bool virtqueue_kick_try(struct virtqueue *vq)
> +{
> +	if (virtqueue_kick_prepare(vq) && virtqueue_notify(vq))
> +		return true;
> +	return false;
> +}
> +EXPORT_SYMBOL_GPL(virtqueue_kick_try);
> +
>   /**
>    * virtqueue_get_buf - get the next used buffer
>    * @_vq: the struct virtqueue we're talking about.
> diff --git a/include/linux/virtio.h b/include/linux/virtio.h
> index b1894e0323fa..45cd6a0af24d 100644
> --- a/include/linux/virtio.h
> +++ b/include/linux/virtio.h
> @@ -59,6 +59,8 @@ int virtqueue_add_sgs(struct virtqueue *vq,
>   
>   bool virtqueue_kick(struct virtqueue *vq);
>   
> +bool virtqueue_kick_try(struct virtqueue *vq);
> +
>   bool virtqueue_kick_prepare(struct virtqueue *vq);
>   
>   bool virtqueue_notify(struct virtqueue *vq);


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

* Re: [PATCH] virtio: Introduce a new kick interface virtqueue_kick_try()
@ 2021-05-31  6:34   ` Jason Wang
  0 siblings, 0 replies; 10+ messages in thread
From: Jason Wang @ 2021-05-31  6:34 UTC (permalink / raw)
  To: Xuan Zhuo, virtualization
  Cc: Jakub Kicinski, netdev, David S. Miller, Michael S. Tsirkin


在 2021/5/19 下午7:47, Xuan Zhuo 写道:
> Unlike virtqueue_kick(), virtqueue_kick_try() returns true only when the
> kick is successful. In virtio-net, we want to count the number of kicks.
> So we need an interface that can perceive whether the kick is actually
> executed.
>
> Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com>


Acked-by: Jason Wang <jasowang@redhat.com>

Thanks


> ---
>   drivers/net/virtio_net.c     |  8 ++++----
>   drivers/virtio/virtio_ring.c | 20 ++++++++++++++++++++
>   include/linux/virtio.h       |  2 ++
>   3 files changed, 26 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
> index 9b6a4a875c55..167697030cb6 100644
> --- a/drivers/net/virtio_net.c
> +++ b/drivers/net/virtio_net.c
> @@ -617,7 +617,7 @@ static int virtnet_xdp_xmit(struct net_device *dev,
>   	ret = nxmit;
>   
>   	if (flags & XDP_XMIT_FLUSH) {
> -		if (virtqueue_kick_prepare(sq->vq) && virtqueue_notify(sq->vq))
> +		if (virtqueue_kick_try(sq->vq))
>   			kicks = 1;
>   	}
>   out:
> @@ -1325,7 +1325,7 @@ static bool try_fill_recv(struct virtnet_info *vi, struct receive_queue *rq,
>   		if (err)
>   			break;
>   	} while (rq->vq->num_free);
> -	if (virtqueue_kick_prepare(rq->vq) && virtqueue_notify(rq->vq)) {
> +	if (virtqueue_kick_try(rq->vq)) {
>   		unsigned long flags;
>   
>   		flags = u64_stats_update_begin_irqsave(&rq->stats.syncp);
> @@ -1533,7 +1533,7 @@ static int virtnet_poll(struct napi_struct *napi, int budget)
>   
>   	if (xdp_xmit & VIRTIO_XDP_TX) {
>   		sq = virtnet_xdp_get_sq(vi);
> -		if (virtqueue_kick_prepare(sq->vq) && virtqueue_notify(sq->vq)) {
> +		if (virtqueue_kick_try(sq->vq)) {
>   			u64_stats_update_begin(&sq->stats.syncp);
>   			sq->stats.kicks++;
>   			u64_stats_update_end(&sq->stats.syncp);
> @@ -1710,7 +1710,7 @@ static netdev_tx_t start_xmit(struct sk_buff *skb, struct net_device *dev)
>   	}
>   
>   	if (kick || netif_xmit_stopped(txq)) {
> -		if (virtqueue_kick_prepare(sq->vq) && virtqueue_notify(sq->vq)) {
> +		if (virtqueue_kick_try(sq->vq)) {
>   			u64_stats_update_begin(&sq->stats.syncp);
>   			sq->stats.kicks++;
>   			u64_stats_update_end(&sq->stats.syncp);
> diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c
> index 71e16b53e9c1..1462be756875 100644
> --- a/drivers/virtio/virtio_ring.c
> +++ b/drivers/virtio/virtio_ring.c
> @@ -1874,6 +1874,26 @@ bool virtqueue_kick(struct virtqueue *vq)
>   }
>   EXPORT_SYMBOL_GPL(virtqueue_kick);
>   
> +/**
> + * virtqueue_kick_try - try update after add_buf
> + * @vq: the struct virtqueue
> + *
> + * After one or more virtqueue_add_* calls, invoke this to kick
> + * the other side.
> + *
> + * Caller must ensure we don't call this with other virtqueue
> + * operations at the same time (except where noted).
> + *
> + * Returns true if kick success, otherwise false.
> + */
> +bool virtqueue_kick_try(struct virtqueue *vq)
> +{
> +	if (virtqueue_kick_prepare(vq) && virtqueue_notify(vq))
> +		return true;
> +	return false;
> +}
> +EXPORT_SYMBOL_GPL(virtqueue_kick_try);
> +
>   /**
>    * virtqueue_get_buf - get the next used buffer
>    * @_vq: the struct virtqueue we're talking about.
> diff --git a/include/linux/virtio.h b/include/linux/virtio.h
> index b1894e0323fa..45cd6a0af24d 100644
> --- a/include/linux/virtio.h
> +++ b/include/linux/virtio.h
> @@ -59,6 +59,8 @@ int virtqueue_add_sgs(struct virtqueue *vq,
>   
>   bool virtqueue_kick(struct virtqueue *vq);
>   
> +bool virtqueue_kick_try(struct virtqueue *vq);
> +
>   bool virtqueue_kick_prepare(struct virtqueue *vq);
>   
>   bool virtqueue_notify(struct virtqueue *vq);

_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

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

* Re: [PATCH] virtio: Introduce a new kick interface virtqueue_kick_try()
  2021-05-31  6:34   ` Jason Wang
  (?)
@ 2021-10-19  8:13   ` Xuan Zhuo
  2021-10-19 10:37       ` Michael S. Tsirkin
  -1 siblings, 1 reply; 10+ messages in thread
From: Xuan Zhuo @ 2021-10-19  8:13 UTC (permalink / raw)
  To: Jason Wang
  Cc: Jakub Kicinski, netdev, virtualization, David S. Miller,
	Michael S. Tsirkin

On Mon, 31 May 2021 14:34:16 +0800, Jason Wang <jasowang@redhat.com> wrote:
>
> ÔÚ 2021/5/19 ÏÂÎç7:47, Xuan Zhuo дµÀ:
> > Unlike virtqueue_kick(), virtqueue_kick_try() returns true only when the
> > kick is successful. In virtio-net, we want to count the number of kicks.
> > So we need an interface that can perceive whether the kick is actually
> > executed.
> >
> > Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
>
>
> Acked-by: Jason Wang <jasowang@redhat.com>

Hi, this patch seems to have not been merged, is there something wrong with me?

Thanks.

>
> Thanks
>
>
> > ---
> >   drivers/net/virtio_net.c     |  8 ++++----
> >   drivers/virtio/virtio_ring.c | 20 ++++++++++++++++++++
> >   include/linux/virtio.h       |  2 ++
> >   3 files changed, 26 insertions(+), 4 deletions(-)
> >
> > diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
> > index 9b6a4a875c55..167697030cb6 100644
> > --- a/drivers/net/virtio_net.c
> > +++ b/drivers/net/virtio_net.c
> > @@ -617,7 +617,7 @@ static int virtnet_xdp_xmit(struct net_device *dev,
> >   	ret = nxmit;
> >
> >   	if (flags & XDP_XMIT_FLUSH) {
> > -		if (virtqueue_kick_prepare(sq->vq) && virtqueue_notify(sq->vq))
> > +		if (virtqueue_kick_try(sq->vq))
> >   			kicks = 1;
> >   	}
> >   out:
> > @@ -1325,7 +1325,7 @@ static bool try_fill_recv(struct virtnet_info *vi, struct receive_queue *rq,
> >   		if (err)
> >   			break;
> >   	} while (rq->vq->num_free);
> > -	if (virtqueue_kick_prepare(rq->vq) && virtqueue_notify(rq->vq)) {
> > +	if (virtqueue_kick_try(rq->vq)) {
> >   		unsigned long flags;
> >
> >   		flags = u64_stats_update_begin_irqsave(&rq->stats.syncp);
> > @@ -1533,7 +1533,7 @@ static int virtnet_poll(struct napi_struct *napi, int budget)
> >
> >   	if (xdp_xmit & VIRTIO_XDP_TX) {
> >   		sq = virtnet_xdp_get_sq(vi);
> > -		if (virtqueue_kick_prepare(sq->vq) && virtqueue_notify(sq->vq)) {
> > +		if (virtqueue_kick_try(sq->vq)) {
> >   			u64_stats_update_begin(&sq->stats.syncp);
> >   			sq->stats.kicks++;
> >   			u64_stats_update_end(&sq->stats.syncp);
> > @@ -1710,7 +1710,7 @@ static netdev_tx_t start_xmit(struct sk_buff *skb, struct net_device *dev)
> >   	}
> >
> >   	if (kick || netif_xmit_stopped(txq)) {
> > -		if (virtqueue_kick_prepare(sq->vq) && virtqueue_notify(sq->vq)) {
> > +		if (virtqueue_kick_try(sq->vq)) {
> >   			u64_stats_update_begin(&sq->stats.syncp);
> >   			sq->stats.kicks++;
> >   			u64_stats_update_end(&sq->stats.syncp);
> > diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c
> > index 71e16b53e9c1..1462be756875 100644
> > --- a/drivers/virtio/virtio_ring.c
> > +++ b/drivers/virtio/virtio_ring.c
> > @@ -1874,6 +1874,26 @@ bool virtqueue_kick(struct virtqueue *vq)
> >   }
> >   EXPORT_SYMBOL_GPL(virtqueue_kick);
> >
> > +/**
> > + * virtqueue_kick_try - try update after add_buf
> > + * @vq: the struct virtqueue
> > + *
> > + * After one or more virtqueue_add_* calls, invoke this to kick
> > + * the other side.
> > + *
> > + * Caller must ensure we don't call this with other virtqueue
> > + * operations at the same time (except where noted).
> > + *
> > + * Returns true if kick success, otherwise false.
> > + */
> > +bool virtqueue_kick_try(struct virtqueue *vq)
> > +{
> > +	if (virtqueue_kick_prepare(vq) && virtqueue_notify(vq))
> > +		return true;
> > +	return false;
> > +}
> > +EXPORT_SYMBOL_GPL(virtqueue_kick_try);
> > +
> >   /**
> >    * virtqueue_get_buf - get the next used buffer
> >    * @_vq: the struct virtqueue we're talking about.
> > diff --git a/include/linux/virtio.h b/include/linux/virtio.h
> > index b1894e0323fa..45cd6a0af24d 100644
> > --- a/include/linux/virtio.h
> > +++ b/include/linux/virtio.h
> > @@ -59,6 +59,8 @@ int virtqueue_add_sgs(struct virtqueue *vq,
> >
> >   bool virtqueue_kick(struct virtqueue *vq);
> >
> > +bool virtqueue_kick_try(struct virtqueue *vq);
> > +
> >   bool virtqueue_kick_prepare(struct virtqueue *vq);
> >
> >   bool virtqueue_notify(struct virtqueue *vq);
>
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

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

* Re: [PATCH] virtio: Introduce a new kick interface virtqueue_kick_try()
  2021-10-19  8:13   ` Xuan Zhuo
@ 2021-10-19 10:37       ` Michael S. Tsirkin
  0 siblings, 0 replies; 10+ messages in thread
From: Michael S. Tsirkin @ 2021-10-19 10:37 UTC (permalink / raw)
  To: Xuan Zhuo
  Cc: Jason Wang, David S. Miller, Jakub Kicinski, netdev, virtualization

On Tue, Oct 19, 2021 at 04:13:19PM +0800, Xuan Zhuo wrote:
> On Mon, 31 May 2021 14:34:16 +0800, Jason Wang <jasowang@redhat.com> wrote:
> >
> > ÔÚ 2021/5/19 ÏÂÎç7:47, Xuan Zhuo дµÀ:
> > > Unlike virtqueue_kick(), virtqueue_kick_try() returns true only when the
> > > kick is successful. In virtio-net, we want to count the number of kicks.
> > > So we need an interface that can perceive whether the kick is actually
> > > executed.
> > >
> > > Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
> >
> >
> > Acked-by: Jason Wang <jasowang@redhat.com>
> 
> Hi, this patch seems to have not been merged, is there something wrong with me?
> 
> Thanks.

The commit log does not make it clear, but this is just
code refactoring. Pls make it clearer in the log.
Also, if we add a new API like this as a cleanup,
it needs to be documented much better.


> >
> > Thanks
> >
> >
> > > ---
> > >   drivers/net/virtio_net.c     |  8 ++++----
> > >   drivers/virtio/virtio_ring.c | 20 ++++++++++++++++++++
> > >   include/linux/virtio.h       |  2 ++
> > >   3 files changed, 26 insertions(+), 4 deletions(-)
> > >
> > > diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
> > > index 9b6a4a875c55..167697030cb6 100644
> > > --- a/drivers/net/virtio_net.c
> > > +++ b/drivers/net/virtio_net.c
> > > @@ -617,7 +617,7 @@ static int virtnet_xdp_xmit(struct net_device *dev,
> > >   	ret = nxmit;
> > >
> > >   	if (flags & XDP_XMIT_FLUSH) {
> > > -		if (virtqueue_kick_prepare(sq->vq) && virtqueue_notify(sq->vq))
> > > +		if (virtqueue_kick_try(sq->vq))
> > >   			kicks = 1;
> > >   	}
> > >   out:
> > > @@ -1325,7 +1325,7 @@ static bool try_fill_recv(struct virtnet_info *vi, struct receive_queue *rq,
> > >   		if (err)
> > >   			break;
> > >   	} while (rq->vq->num_free);
> > > -	if (virtqueue_kick_prepare(rq->vq) && virtqueue_notify(rq->vq)) {
> > > +	if (virtqueue_kick_try(rq->vq)) {
> > >   		unsigned long flags;
> > >
> > >   		flags = u64_stats_update_begin_irqsave(&rq->stats.syncp);
> > > @@ -1533,7 +1533,7 @@ static int virtnet_poll(struct napi_struct *napi, int budget)
> > >
> > >   	if (xdp_xmit & VIRTIO_XDP_TX) {
> > >   		sq = virtnet_xdp_get_sq(vi);
> > > -		if (virtqueue_kick_prepare(sq->vq) && virtqueue_notify(sq->vq)) {
> > > +		if (virtqueue_kick_try(sq->vq)) {
> > >   			u64_stats_update_begin(&sq->stats.syncp);
> > >   			sq->stats.kicks++;
> > >   			u64_stats_update_end(&sq->stats.syncp);
> > > @@ -1710,7 +1710,7 @@ static netdev_tx_t start_xmit(struct sk_buff *skb, struct net_device *dev)
> > >   	}
> > >
> > >   	if (kick || netif_xmit_stopped(txq)) {
> > > -		if (virtqueue_kick_prepare(sq->vq) && virtqueue_notify(sq->vq)) {
> > > +		if (virtqueue_kick_try(sq->vq)) {
> > >   			u64_stats_update_begin(&sq->stats.syncp);
> > >   			sq->stats.kicks++;
> > >   			u64_stats_update_end(&sq->stats.syncp);
> > > diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c
> > > index 71e16b53e9c1..1462be756875 100644
> > > --- a/drivers/virtio/virtio_ring.c
> > > +++ b/drivers/virtio/virtio_ring.c
> > > @@ -1874,6 +1874,26 @@ bool virtqueue_kick(struct virtqueue *vq)
> > >   }
> > >   EXPORT_SYMBOL_GPL(virtqueue_kick);
> > >
> > > +/**
> > > + * virtqueue_kick_try - try update after add_buf
> > > + * @vq: the struct virtqueue
> > > + *
> > > + * After one or more virtqueue_add_* calls, invoke this to kick
> > > + * the other side.
> > > + *
> > > + * Caller must ensure we don't call this with other virtqueue
> > > + * operations at the same time (except where noted).
> > > + *
> > > + * Returns true if kick success, otherwise false.

on a successful kick?

> > > + */

I don't really understand what this is doing, the comment
doesn't seem to explain. Try implies it might fail to update.

virtqueue_kick seems to be documented the same:
 * Returns false if kick failed, otherwise true.


> > > +bool virtqueue_kick_try(struct virtqueue *vq)
> > > +{
> > > +	if (virtqueue_kick_prepare(vq) && virtqueue_notify(vq))
> > > +		return true;
> > > +	return false;
> > > +}
> > > +EXPORT_SYMBOL_GPL(virtqueue_kick_try);
> > > +
> > >   /**
> > >    * virtqueue_get_buf - get the next used buffer
> > >    * @_vq: the struct virtqueue we're talking about.
> > > diff --git a/include/linux/virtio.h b/include/linux/virtio.h
> > > index b1894e0323fa..45cd6a0af24d 100644
> > > --- a/include/linux/virtio.h
> > > +++ b/include/linux/virtio.h
> > > @@ -59,6 +59,8 @@ int virtqueue_add_sgs(struct virtqueue *vq,
> > >
> > >   bool virtqueue_kick(struct virtqueue *vq);
> > >
> > > +bool virtqueue_kick_try(struct virtqueue *vq);
> > > +
> > >   bool virtqueue_kick_prepare(struct virtqueue *vq);
> > >
> > >   bool virtqueue_notify(struct virtqueue *vq);
> >


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

* Re: [PATCH] virtio: Introduce a new kick interface virtqueue_kick_try()
@ 2021-10-19 10:37       ` Michael S. Tsirkin
  0 siblings, 0 replies; 10+ messages in thread
From: Michael S. Tsirkin @ 2021-10-19 10:37 UTC (permalink / raw)
  To: Xuan Zhuo; +Cc: Jakub Kicinski, virtualization, David S. Miller, netdev

On Tue, Oct 19, 2021 at 04:13:19PM +0800, Xuan Zhuo wrote:
> On Mon, 31 May 2021 14:34:16 +0800, Jason Wang <jasowang@redhat.com> wrote:
> >
> > ÔÚ 2021/5/19 ÏÂÎç7:47, Xuan Zhuo дµÀ:
> > > Unlike virtqueue_kick(), virtqueue_kick_try() returns true only when the
> > > kick is successful. In virtio-net, we want to count the number of kicks.
> > > So we need an interface that can perceive whether the kick is actually
> > > executed.
> > >
> > > Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
> >
> >
> > Acked-by: Jason Wang <jasowang@redhat.com>
> 
> Hi, this patch seems to have not been merged, is there something wrong with me?
> 
> Thanks.

The commit log does not make it clear, but this is just
code refactoring. Pls make it clearer in the log.
Also, if we add a new API like this as a cleanup,
it needs to be documented much better.


> >
> > Thanks
> >
> >
> > > ---
> > >   drivers/net/virtio_net.c     |  8 ++++----
> > >   drivers/virtio/virtio_ring.c | 20 ++++++++++++++++++++
> > >   include/linux/virtio.h       |  2 ++
> > >   3 files changed, 26 insertions(+), 4 deletions(-)
> > >
> > > diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
> > > index 9b6a4a875c55..167697030cb6 100644
> > > --- a/drivers/net/virtio_net.c
> > > +++ b/drivers/net/virtio_net.c
> > > @@ -617,7 +617,7 @@ static int virtnet_xdp_xmit(struct net_device *dev,
> > >   	ret = nxmit;
> > >
> > >   	if (flags & XDP_XMIT_FLUSH) {
> > > -		if (virtqueue_kick_prepare(sq->vq) && virtqueue_notify(sq->vq))
> > > +		if (virtqueue_kick_try(sq->vq))
> > >   			kicks = 1;
> > >   	}
> > >   out:
> > > @@ -1325,7 +1325,7 @@ static bool try_fill_recv(struct virtnet_info *vi, struct receive_queue *rq,
> > >   		if (err)
> > >   			break;
> > >   	} while (rq->vq->num_free);
> > > -	if (virtqueue_kick_prepare(rq->vq) && virtqueue_notify(rq->vq)) {
> > > +	if (virtqueue_kick_try(rq->vq)) {
> > >   		unsigned long flags;
> > >
> > >   		flags = u64_stats_update_begin_irqsave(&rq->stats.syncp);
> > > @@ -1533,7 +1533,7 @@ static int virtnet_poll(struct napi_struct *napi, int budget)
> > >
> > >   	if (xdp_xmit & VIRTIO_XDP_TX) {
> > >   		sq = virtnet_xdp_get_sq(vi);
> > > -		if (virtqueue_kick_prepare(sq->vq) && virtqueue_notify(sq->vq)) {
> > > +		if (virtqueue_kick_try(sq->vq)) {
> > >   			u64_stats_update_begin(&sq->stats.syncp);
> > >   			sq->stats.kicks++;
> > >   			u64_stats_update_end(&sq->stats.syncp);
> > > @@ -1710,7 +1710,7 @@ static netdev_tx_t start_xmit(struct sk_buff *skb, struct net_device *dev)
> > >   	}
> > >
> > >   	if (kick || netif_xmit_stopped(txq)) {
> > > -		if (virtqueue_kick_prepare(sq->vq) && virtqueue_notify(sq->vq)) {
> > > +		if (virtqueue_kick_try(sq->vq)) {
> > >   			u64_stats_update_begin(&sq->stats.syncp);
> > >   			sq->stats.kicks++;
> > >   			u64_stats_update_end(&sq->stats.syncp);
> > > diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c
> > > index 71e16b53e9c1..1462be756875 100644
> > > --- a/drivers/virtio/virtio_ring.c
> > > +++ b/drivers/virtio/virtio_ring.c
> > > @@ -1874,6 +1874,26 @@ bool virtqueue_kick(struct virtqueue *vq)
> > >   }
> > >   EXPORT_SYMBOL_GPL(virtqueue_kick);
> > >
> > > +/**
> > > + * virtqueue_kick_try - try update after add_buf
> > > + * @vq: the struct virtqueue
> > > + *
> > > + * After one or more virtqueue_add_* calls, invoke this to kick
> > > + * the other side.
> > > + *
> > > + * Caller must ensure we don't call this with other virtqueue
> > > + * operations at the same time (except where noted).
> > > + *
> > > + * Returns true if kick success, otherwise false.

on a successful kick?

> > > + */

I don't really understand what this is doing, the comment
doesn't seem to explain. Try implies it might fail to update.

virtqueue_kick seems to be documented the same:
 * Returns false if kick failed, otherwise true.


> > > +bool virtqueue_kick_try(struct virtqueue *vq)
> > > +{
> > > +	if (virtqueue_kick_prepare(vq) && virtqueue_notify(vq))
> > > +		return true;
> > > +	return false;
> > > +}
> > > +EXPORT_SYMBOL_GPL(virtqueue_kick_try);
> > > +
> > >   /**
> > >    * virtqueue_get_buf - get the next used buffer
> > >    * @_vq: the struct virtqueue we're talking about.
> > > diff --git a/include/linux/virtio.h b/include/linux/virtio.h
> > > index b1894e0323fa..45cd6a0af24d 100644
> > > --- a/include/linux/virtio.h
> > > +++ b/include/linux/virtio.h
> > > @@ -59,6 +59,8 @@ int virtqueue_add_sgs(struct virtqueue *vq,
> > >
> > >   bool virtqueue_kick(struct virtqueue *vq);
> > >
> > > +bool virtqueue_kick_try(struct virtqueue *vq);
> > > +
> > >   bool virtqueue_kick_prepare(struct virtqueue *vq);
> > >
> > >   bool virtqueue_notify(struct virtqueue *vq);
> >

_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

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

end of thread, other threads:[~2021-10-19 10:39 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-05-19 11:47 [PATCH] virtio: Introduce a new kick interface virtqueue_kick_try() Xuan Zhuo
2021-05-19 11:47 ` Xuan Zhuo
2021-05-19 12:44 ` Michael S. Tsirkin
2021-05-19 12:44   ` Michael S. Tsirkin
2021-05-19 13:14   ` Xuan Zhuo
2021-05-31  6:34 ` Jason Wang
2021-05-31  6:34   ` Jason Wang
2021-10-19  8:13   ` Xuan Zhuo
2021-10-19 10:37     ` Michael S. Tsirkin
2021-10-19 10:37       ` Michael S. Tsirkin

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.