Currently, the same field is being used to store both the generic virtio device status and the virtio-net-specific status.
This can become problematic since they have different sets of status bits that may collide (e.g: VIRTIO_CONFIG_STATUS_ACK and VIRTIO_NET_S_LINK_UP). Split them in different fields. Signed-off-by: Adrian Moreno <amore...@redhat.com> --- drivers/net/virtio/virtio_user/virtio_user_dev.h | 5 ++++- drivers/net/virtio/virtio_user_ethdev.c | 11 ++++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.h b/drivers/net/virtio/virtio_user/virtio_user_dev.h index 56e638f8a..10b274d19 100644 --- a/drivers/net/virtio/virtio_user/virtio_user_dev.h +++ b/drivers/net/virtio/virtio_user/virtio_user_dev.h @@ -43,7 +43,10 @@ struct virtio_user_dev { uint64_t protocol_features; /* negotiated protocol features * (Vhost-user only) */ - uint8_t status; + + uint8_t virtio_net_status; /* virtio-net device status */ + uint8_t status; /* virtio device status */ + uint16_t port_id; uint8_t mac_addr[RTE_ETHER_ADDR_LEN]; char path[PATH_MAX]; diff --git a/drivers/net/virtio/virtio_user_ethdev.c b/drivers/net/virtio/virtio_user_ethdev.c index e51425c4f..5b06d8e89 100644 --- a/drivers/net/virtio/virtio_user_ethdev.c +++ b/drivers/net/virtio/virtio_user_ethdev.c @@ -205,7 +205,8 @@ virtio_user_read_dev_config(struct virtio_hw *hw, size_t offset, } r = recv(dev->vhostfd, buf, 128, MSG_PEEK); if (r == 0 || (r < 0 && errno != EAGAIN)) { - dev->status &= (~VIRTIO_NET_S_LINK_UP); + dev->virtio_net_status &= + (~VIRTIO_NET_S_LINK_UP); PMD_DRV_LOG(ERR, "virtio-user port %u is down", hw->port_id); @@ -217,7 +218,7 @@ virtio_user_read_dev_config(struct virtio_hw *hw, size_t offset, virtio_user_delayed_handler, (void *)hw); } else { - dev->status |= VIRTIO_NET_S_LINK_UP; + dev->virtio_net_status |= VIRTIO_NET_S_LINK_UP; } if (fcntl(dev->vhostfd, F_SETFL, flags & ~O_NONBLOCK) == -1) { @@ -225,12 +226,12 @@ virtio_user_read_dev_config(struct virtio_hw *hw, size_t offset, return; } } else if (dev->is_server) { - dev->status &= (~VIRTIO_NET_S_LINK_UP); + dev->virtio_net_status &= (~VIRTIO_NET_S_LINK_UP); if (virtio_user_server_reconnect(dev) >= 0) - dev->status |= VIRTIO_NET_S_LINK_UP; + dev->virtio_net_status |= VIRTIO_NET_S_LINK_UP; } - *(uint16_t *)dst = dev->status; + *(uint16_t *)dst = dev->virtio_net_status; } if (offset == offsetof(struct virtio_net_config, max_virtqueue_pairs)) -- 2.26.2