From: "Michael S. Tsirkin" <mst@redhat.com>
To: Eric Dumazet <eric.dumazet@gmail.com>
Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org,
virtualization@lists.linux-foundation.org,
Stephen Hemminger <shemminger@vyatta.com>
Subject: Re: [PATCH] virtio-net: fix a race on 32bit arches
Date: Sun, 10 Jun 2012 13:25:12 +0300 [thread overview]
Message-ID: <20120610102512.GB6793@redhat.com> (raw)
In-Reply-To: <1338971724.2760.3913.camel@edumazet-glaptop>
On Wed, Jun 06, 2012 at 10:35:24AM +0200, Eric Dumazet wrote:
> From: Eric Dumazet <edumazet@google.com>
>
> commit 3fa2a1df909 (virtio-net: per cpu 64 bit stats (v2)) added a race
> on 32bit arches.
>
> We must use separate syncp for rx and tx path as they can be run at the
> same time on different cpus. Thus one sequence increment can be lost and
> readers spin forever.
>
> Signed-off-by: Eric Dumazet <edumazet@google.com>
> Cc: Stephen Hemminger <shemminger@vyatta.com>
> Cc: Michael S. Tsirkin <mst@redhat.com>
> Cc: Jason Wang <jasowang@redhat.com>
I'm still thinking about moving tx to take a xmit lock long term,
meanwhile this fix appears appropriate for 3.5.
Acked-by: Michael S. Tsirkin <mst@redhat.com>
Dave, can you pick this up pls?
> ---
> drivers/net/virtio_net.c | 19 ++++++++++++-------
> 1 file changed, 12 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
> index 5214b1e..f18149a 100644
> --- a/drivers/net/virtio_net.c
> +++ b/drivers/net/virtio_net.c
> @@ -42,7 +42,8 @@ module_param(gso, bool, 0444);
> #define VIRTNET_DRIVER_VERSION "1.0.0"
>
> struct virtnet_stats {
> - struct u64_stats_sync syncp;
> + struct u64_stats_sync tx_syncp;
> + struct u64_stats_sync rx_syncp;
> u64 tx_bytes;
> u64 tx_packets;
>
> @@ -300,10 +301,10 @@ static void receive_buf(struct net_device *dev, void *buf, unsigned int len)
>
> hdr = skb_vnet_hdr(skb);
>
> - u64_stats_update_begin(&stats->syncp);
> + u64_stats_update_begin(&stats->rx_syncp);
> stats->rx_bytes += skb->len;
> stats->rx_packets++;
> - u64_stats_update_end(&stats->syncp);
> + u64_stats_update_end(&stats->rx_syncp);
>
> if (hdr->hdr.flags & VIRTIO_NET_HDR_F_NEEDS_CSUM) {
> pr_debug("Needs csum!\n");
> @@ -565,10 +566,10 @@ static unsigned int free_old_xmit_skbs(struct virtnet_info *vi)
> while ((skb = virtqueue_get_buf(vi->svq, &len)) != NULL) {
> pr_debug("Sent skb %p\n", skb);
>
> - u64_stats_update_begin(&stats->syncp);
> + u64_stats_update_begin(&stats->tx_syncp);
> stats->tx_bytes += skb->len;
> stats->tx_packets++;
> - u64_stats_update_end(&stats->syncp);
> + u64_stats_update_end(&stats->tx_syncp);
>
> tot_sgs += skb_vnet_hdr(skb)->num_sg;
> dev_kfree_skb_any(skb);
> @@ -703,12 +704,16 @@ static struct rtnl_link_stats64 *virtnet_stats(struct net_device *dev,
> u64 tpackets, tbytes, rpackets, rbytes;
>
> do {
> - start = u64_stats_fetch_begin(&stats->syncp);
> + start = u64_stats_fetch_begin(&stats->tx_syncp);
> tpackets = stats->tx_packets;
> tbytes = stats->tx_bytes;
> + } while (u64_stats_fetch_retry(&stats->tx_syncp, start));
> +
> + do {
> + start = u64_stats_fetch_begin(&stats->rx_syncp);
> rpackets = stats->rx_packets;
> rbytes = stats->rx_bytes;
> - } while (u64_stats_fetch_retry(&stats->syncp, start));
> + } while (u64_stats_fetch_retry(&stats->rx_syncp, start));
>
> tot->rx_packets += rpackets;
> tot->tx_packets += tpackets;
>
WARNING: multiple messages have this Message-ID (diff)
From: "Michael S. Tsirkin" <mst@redhat.com>
To: Eric Dumazet <eric.dumazet@gmail.com>
Cc: Jason Wang <jasowang@redhat.com>,
netdev@vger.kernel.org, rusty@rustcorp.com.au,
linux-kernel@vger.kernel.org,
virtualization@lists.linux-foundation.org,
Stephen Hemminger <shemminger@vyatta.com>
Subject: Re: [PATCH] virtio-net: fix a race on 32bit arches
Date: Sun, 10 Jun 2012 13:25:12 +0300 [thread overview]
Message-ID: <20120610102512.GB6793@redhat.com> (raw)
In-Reply-To: <1338971724.2760.3913.camel@edumazet-glaptop>
On Wed, Jun 06, 2012 at 10:35:24AM +0200, Eric Dumazet wrote:
> From: Eric Dumazet <edumazet@google.com>
>
> commit 3fa2a1df909 (virtio-net: per cpu 64 bit stats (v2)) added a race
> on 32bit arches.
>
> We must use separate syncp for rx and tx path as they can be run at the
> same time on different cpus. Thus one sequence increment can be lost and
> readers spin forever.
>
> Signed-off-by: Eric Dumazet <edumazet@google.com>
> Cc: Stephen Hemminger <shemminger@vyatta.com>
> Cc: Michael S. Tsirkin <mst@redhat.com>
> Cc: Jason Wang <jasowang@redhat.com>
I'm still thinking about moving tx to take a xmit lock long term,
meanwhile this fix appears appropriate for 3.5.
Acked-by: Michael S. Tsirkin <mst@redhat.com>
Dave, can you pick this up pls?
> ---
> drivers/net/virtio_net.c | 19 ++++++++++++-------
> 1 file changed, 12 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
> index 5214b1e..f18149a 100644
> --- a/drivers/net/virtio_net.c
> +++ b/drivers/net/virtio_net.c
> @@ -42,7 +42,8 @@ module_param(gso, bool, 0444);
> #define VIRTNET_DRIVER_VERSION "1.0.0"
>
> struct virtnet_stats {
> - struct u64_stats_sync syncp;
> + struct u64_stats_sync tx_syncp;
> + struct u64_stats_sync rx_syncp;
> u64 tx_bytes;
> u64 tx_packets;
>
> @@ -300,10 +301,10 @@ static void receive_buf(struct net_device *dev, void *buf, unsigned int len)
>
> hdr = skb_vnet_hdr(skb);
>
> - u64_stats_update_begin(&stats->syncp);
> + u64_stats_update_begin(&stats->rx_syncp);
> stats->rx_bytes += skb->len;
> stats->rx_packets++;
> - u64_stats_update_end(&stats->syncp);
> + u64_stats_update_end(&stats->rx_syncp);
>
> if (hdr->hdr.flags & VIRTIO_NET_HDR_F_NEEDS_CSUM) {
> pr_debug("Needs csum!\n");
> @@ -565,10 +566,10 @@ static unsigned int free_old_xmit_skbs(struct virtnet_info *vi)
> while ((skb = virtqueue_get_buf(vi->svq, &len)) != NULL) {
> pr_debug("Sent skb %p\n", skb);
>
> - u64_stats_update_begin(&stats->syncp);
> + u64_stats_update_begin(&stats->tx_syncp);
> stats->tx_bytes += skb->len;
> stats->tx_packets++;
> - u64_stats_update_end(&stats->syncp);
> + u64_stats_update_end(&stats->tx_syncp);
>
> tot_sgs += skb_vnet_hdr(skb)->num_sg;
> dev_kfree_skb_any(skb);
> @@ -703,12 +704,16 @@ static struct rtnl_link_stats64 *virtnet_stats(struct net_device *dev,
> u64 tpackets, tbytes, rpackets, rbytes;
>
> do {
> - start = u64_stats_fetch_begin(&stats->syncp);
> + start = u64_stats_fetch_begin(&stats->tx_syncp);
> tpackets = stats->tx_packets;
> tbytes = stats->tx_bytes;
> + } while (u64_stats_fetch_retry(&stats->tx_syncp, start));
> +
> + do {
> + start = u64_stats_fetch_begin(&stats->rx_syncp);
> rpackets = stats->rx_packets;
> rbytes = stats->rx_bytes;
> - } while (u64_stats_fetch_retry(&stats->syncp, start));
> + } while (u64_stats_fetch_retry(&stats->rx_syncp, start));
>
> tot->rx_packets += rpackets;
> tot->tx_packets += tpackets;
>
next prev parent reply other threads:[~2012-06-10 10:25 UTC|newest]
Thread overview: 64+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-06-06 8:35 [PATCH] virtio-net: fix a race on 32bit arches Eric Dumazet
2012-06-06 8:35 ` Eric Dumazet
2012-06-06 8:45 ` Eric Dumazet
2012-06-06 8:45 ` Eric Dumazet
2012-06-06 9:37 ` Jason Wang
2012-06-06 9:37 ` Jason Wang
2012-06-06 11:13 ` Michael S. Tsirkin
2012-06-06 11:13 ` Michael S. Tsirkin
2012-06-06 13:10 ` Eric Dumazet
2012-06-06 13:10 ` Eric Dumazet
2012-06-06 14:49 ` Michael S. Tsirkin
2012-06-06 14:49 ` Michael S. Tsirkin
2012-06-06 15:14 ` Stephen Hemminger
2012-06-06 15:14 ` Stephen Hemminger
2012-06-06 18:51 ` Michael S. Tsirkin
2012-06-06 18:51 ` Michael S. Tsirkin
2012-06-06 19:54 ` Eric Dumazet
2012-06-06 19:58 ` Michael S. Tsirkin
2012-06-06 19:58 ` Michael S. Tsirkin
2012-06-06 20:08 ` Eric Dumazet
2012-06-06 20:08 ` Eric Dumazet
2012-06-06 20:16 ` Michael S. Tsirkin
2012-06-06 20:16 ` Michael S. Tsirkin
2012-06-06 20:24 ` Eric Dumazet
2012-06-06 20:24 ` Eric Dumazet
2012-06-06 20:38 ` Eric Dumazet
2012-06-06 20:38 ` Eric Dumazet
2012-06-06 20:35 ` Ben Hutchings
2012-06-06 20:35 ` Ben Hutchings
2012-06-06 20:43 ` Michael S. Tsirkin
2012-06-06 20:43 ` Michael S. Tsirkin
2012-06-06 20:19 ` Ben Hutchings
2012-06-06 20:25 ` Eric Dumazet
2012-06-06 20:25 ` Eric Dumazet
2012-06-06 20:19 ` Ben Hutchings
2012-06-06 19:54 ` Eric Dumazet
2012-06-06 15:19 ` Eric Dumazet
2012-06-06 15:19 ` Eric Dumazet
2012-06-06 16:17 ` Michael S. Tsirkin
2012-06-06 16:17 ` Michael S. Tsirkin
2012-06-06 17:13 ` Eric Dumazet
2012-06-06 17:13 ` Eric Dumazet
2012-06-06 18:43 ` Michael S. Tsirkin
2012-06-06 18:43 ` Michael S. Tsirkin
2012-06-06 20:06 ` Eric Dumazet
2012-06-06 20:06 ` Eric Dumazet
2012-06-06 20:19 ` Michael S. Tsirkin
2012-06-06 20:19 ` Michael S. Tsirkin
2012-06-06 16:57 ` Michael S. Tsirkin
2012-06-06 16:57 ` Michael S. Tsirkin
2012-06-06 20:00 ` Eric Dumazet
2012-06-06 20:00 ` Eric Dumazet
2012-06-10 6:36 ` Rusty Russell
2012-06-10 6:36 ` Rusty Russell
2012-06-10 7:03 ` Michael S. Tsirkin
2012-06-10 7:03 ` Michael S. Tsirkin
2012-06-10 10:21 ` Eric Dumazet
2012-06-10 10:21 ` Eric Dumazet
2012-06-10 10:22 ` Michael S. Tsirkin
2012-06-10 10:22 ` Michael S. Tsirkin
2012-06-10 10:25 ` Michael S. Tsirkin [this message]
2012-06-10 10:25 ` Michael S. Tsirkin
2012-06-11 3:23 ` David Miller
2012-06-11 3:23 ` David Miller
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20120610102512.GB6793@redhat.com \
--to=mst@redhat.com \
--cc=eric.dumazet@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=shemminger@vyatta.com \
--cc=virtualization@lists.linux-foundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.