diff mbox series

[03/40] net/virtio: refactor virtio-user device

Message ID 20201220211405.313012-4-maxime.coquelin@redhat.com (mailing list archive)
State Superseded, archived
Delegated to: Maxime Coquelin
Headers show
Series net/virtio: Virtio PMD rework | expand

Checks

Context Check Description
ci/checkpatch warning coding style issues

Commit Message

Maxime Coquelin Dec. 20, 2020, 9:13 p.m. UTC
This patch moves the virtio_hw structure into the virtio_user_dev
structure, with the goal of making virtio_hw bus-agnostic.

Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com>
---
 drivers/net/virtio/virtio_ethdev.c            |  2 +-
 drivers/net/virtio/virtio_pci.h               |  1 -
 .../net/virtio/virtio_user/virtio_user_dev.h  |  1 +
 drivers/net/virtio/virtio_user_ethdev.c       | 62 ++++++++-----------
 4 files changed, 27 insertions(+), 39 deletions(-)

Comments

Xia, Chenbo Dec. 30, 2020, 3:02 a.m. UTC | #1
> -----Original Message-----
> From: Maxime Coquelin <maxime.coquelin@redhat.com>
> Sent: Monday, December 21, 2020 5:13 AM
> To: dev@dpdk.org; Xia, Chenbo <chenbo.xia@intel.com>; olivier.matz@6wind.com;
> amorenoz@redhat.com; david.marchand@redhat.com
> Cc: Maxime Coquelin <maxime.coquelin@redhat.com>
> Subject: [PATCH 03/40] net/virtio: refactor virtio-user device
> 
> This patch moves the virtio_hw structure into the virtio_user_dev
> structure, with the goal of making virtio_hw bus-agnostic.
> 
> Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com>
> ---
>  drivers/net/virtio/virtio_ethdev.c            |  2 +-
>  drivers/net/virtio/virtio_pci.h               |  1 -
>  .../net/virtio/virtio_user/virtio_user_dev.h  |  1 +
>  drivers/net/virtio/virtio_user_ethdev.c       | 62 ++++++++-----------
>  4 files changed, 27 insertions(+), 39 deletions(-)
> 
> diff --git a/drivers/net/virtio/virtio_ethdev.c
> b/drivers/net/virtio/virtio_ethdev.c
> index b3086297c0..3ace25ac80 100644
> --- a/drivers/net/virtio/virtio_ethdev.c
> +++ b/drivers/net/virtio/virtio_ethdev.c
> @@ -747,7 +747,7 @@ virtio_dev_close(struct rte_eth_dev *dev)
> 
>  #ifdef RTE_VIRTIO_USER
>  	if (hw->bus_type == VIRTIO_BUS_USER)
> -		virtio_user_dev_uninit(hw->virtio_user_dev);
> +		virtio_user_dev_uninit(dev->data->dev_private);
>  	else
>  #endif
>  	if (dev->device) {
> diff --git a/drivers/net/virtio/virtio_pci.h b/drivers/net/virtio/virtio_pci.h
> index 6388f0a74d..b35a596169 100644
> --- a/drivers/net/virtio/virtio_pci.h
> +++ b/drivers/net/virtio/virtio_pci.h
> @@ -277,7 +277,6 @@ struct virtio_hw {
>  	uint16_t    *notify_base;
>  	struct virtio_pci_common_cfg *common_cfg;
>  	struct virtio_net_config *dev_cfg;
> -	void	    *virtio_user_dev;
>  	/*
>  	 * App management thread and virtio interrupt handler thread
>  	 * both can change device state, this lock is meant to avoid
> diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.h
> b/drivers/net/virtio/virtio_user/virtio_user_dev.h
> index e053897d8f..59f4dd1f24 100644
> --- a/drivers/net/virtio/virtio_user/virtio_user_dev.h
> +++ b/drivers/net/virtio/virtio_user/virtio_user_dev.h
> @@ -24,6 +24,7 @@ struct virtio_user_queue {
>  };
> 
>  struct virtio_user_dev {
> +	struct virtio_hw hw;
>  	enum virtio_user_backend_type backend_type;
>  	/* for vhost_user backend */
>  	int		vhostfd;
> diff --git a/drivers/net/virtio/virtio_user_ethdev.c
> b/drivers/net/virtio/virtio_user_ethdev.c
> index 516d0ee577..1f1f63a1a5 100644
> --- a/drivers/net/virtio/virtio_user_ethdev.c
> +++ b/drivers/net/virtio/virtio_user_ethdev.c
> @@ -26,13 +26,13 @@
>  #include "virtio_user/virtio_user_dev.h"
>  #include "virtio_user/vhost.h"
> 
> -#define virtio_user_get_dev(hw) \
> -	((struct virtio_user_dev *)(hw)->virtio_user_dev)
> +#define virtio_user_get_dev(hw) container_of(hw, struct virtio_user_dev, hw)
> 
>  static void
> -virtio_user_reset_queues_packed(struct rte_eth_dev *dev)
> +virtio_user_reset_queues_packed(struct rte_eth_dev *eth_dev)
>  {
> -	struct virtio_hw *hw = dev->data->dev_private;
> +	struct virtio_user_dev *dev = eth_dev->data->dev_private;
> +	struct virtio_hw *hw = &dev->hw;
>  	struct virtnet_rx *rxvq;
>  	struct virtnet_tx *txvq;
>  	uint16_t i;
> @@ -48,14 +48,14 @@ virtio_user_reset_queues_packed(struct rte_eth_dev *dev)
>  	rte_delay_ms(1);
> 
>  	/* Vring reset for each Tx queue and Rx queue. */
> -	for (i = 0; i < dev->data->nb_rx_queues; i++) {
> -		rxvq = dev->data->rx_queues[i];
> +	for (i = 0; i < eth_dev->data->nb_rx_queues; i++) {
> +		rxvq = eth_dev->data->rx_queues[i];
>  		virtqueue_rxvq_reset_packed(rxvq->vq);
> -		virtio_dev_rx_queue_setup_finish(dev, i);
> +		virtio_dev_rx_queue_setup_finish(eth_dev, i);
>  	}
> 
> -	for (i = 0; i < dev->data->nb_tx_queues; i++) {
> -		txvq = dev->data->tx_queues[i];
> +	for (i = 0; i < eth_dev->data->nb_tx_queues; i++) {
> +		txvq = eth_dev->data->tx_queues[i];
>  		virtqueue_txvq_reset_packed(txvq->vq);
>  	}
> 
> @@ -69,7 +69,7 @@ virtio_user_server_reconnect(struct virtio_user_dev *dev)
>  {
>  	int ret, connectfd, old_status;
>  	struct rte_eth_dev *eth_dev = &rte_eth_devices[dev->port_id];
> -	struct virtio_hw *hw = eth_dev->data->dev_private;
> +	struct virtio_hw *hw = &dev->hw;
>  	uint64_t protocol_features;
> 
>  	connectfd = accept(dev->listenfd, NULL, NULL);
> @@ -605,21 +605,15 @@ virtio_user_eth_dev_alloc(struct rte_vdev_device *vdev)
>  	struct virtio_hw *hw;
>  	struct virtio_user_dev *dev;
> 
> -	eth_dev = rte_eth_vdev_allocate(vdev, sizeof(*hw));
> +	eth_dev = rte_eth_vdev_allocate(vdev, sizeof(*dev));
>  	if (!eth_dev) {
>  		PMD_INIT_LOG(ERR, "cannot alloc rte_eth_dev");
>  		return NULL;
>  	}
> 
>  	data = eth_dev->data;
> -	hw = eth_dev->data->dev_private;
> -
> -	dev = rte_zmalloc(NULL, sizeof(*dev), 0);
> -	if (!dev) {
> -		PMD_INIT_LOG(ERR, "malloc virtio_user_dev failed");
> -		rte_eth_dev_release_port(eth_dev);
> -		return NULL;
> -	}
> +	dev = eth_dev->data->dev_private;
> +	hw = &dev->hw;
> 
>  	hw->port_id = data->port_id;
>  	dev->port_id = data->port_id;
> @@ -634,17 +628,13 @@ virtio_user_eth_dev_alloc(struct rte_vdev_device *vdev)
>  	hw->use_vec_tx = 0;
>  	hw->use_inorder_rx = 0;
>  	hw->use_inorder_tx = 0;
> -	hw->virtio_user_dev = dev;
> +
>  	return eth_dev;
>  }
> 
>  static void
>  virtio_user_eth_dev_free(struct rte_eth_dev *eth_dev)
>  {
> -	struct rte_eth_dev_data *data = eth_dev->data;
> -	struct virtio_hw *hw = data->dev_private;
> -
> -	rte_free(hw->virtio_user_dev);
>  	rte_eth_dev_release_port(eth_dev);
>  }
> 
> @@ -653,11 +643,12 @@ virtio_user_eth_dev_free(struct rte_eth_dev *eth_dev)
>   * Returns 0 on success.
>   */
>  static int
> -virtio_user_pmd_probe(struct rte_vdev_device *dev)
> +virtio_user_pmd_probe(struct rte_vdev_device *vdev)
>  {
>  	struct rte_kvargs *kvlist = NULL;
>  	struct rte_eth_dev *eth_dev;
>  	struct virtio_hw *hw;
> +	struct virtio_user_dev *dev;
>  	enum virtio_user_backend_type backend_type = VIRTIO_USER_BACKEND_UNKNOWN;
>  	uint64_t queues = VIRTIO_USER_DEF_Q_NUM;
>  	uint64_t cq = VIRTIO_USER_DEF_CQ_EN;
> @@ -673,7 +664,7 @@ virtio_user_pmd_probe(struct rte_vdev_device *dev)
>  	int ret = -1;
> 
>  	if (rte_eal_process_type() == RTE_PROC_SECONDARY) {
> -		const char *name = rte_vdev_device_name(dev);
> +		const char *name = rte_vdev_device_name(vdev);
>  		eth_dev = rte_eth_dev_attach_secondary(name);
>  		if (!eth_dev) {
>  			PMD_INIT_LOG(ERR, "Failed to probe %s", name);
> @@ -687,12 +678,12 @@ virtio_user_pmd_probe(struct rte_vdev_device *dev)
>  		}
> 
>  		eth_dev->dev_ops = &virtio_user_secondary_eth_dev_ops;
> -		eth_dev->device = &dev->device;
> +		eth_dev->device = &vdev->device;
>  		rte_eth_dev_probing_finish(eth_dev);
>  		return 0;
>  	}
> 
> -	kvlist = rte_kvargs_parse(rte_vdev_device_args(dev), valid_args);
> +	kvlist = rte_kvargs_parse(rte_vdev_device_args(vdev), valid_args);
>  	if (!kvlist) {
>  		PMD_INIT_LOG(ERR, "error when parsing param");
>  		goto end;
> @@ -832,14 +823,15 @@ virtio_user_pmd_probe(struct rte_vdev_device *dev)
>  		}
>  	}
> 
> -	eth_dev = virtio_user_eth_dev_alloc(dev);
> +	eth_dev = virtio_user_eth_dev_alloc(vdev);
>  	if (!eth_dev) {
>  		PMD_INIT_LOG(ERR, "virtio_user fails to alloc device");
>  		goto end;
>  	}
> 
> -	hw = eth_dev->data->dev_private;
> -	if (virtio_user_dev_init(hw->virtio_user_dev, path, queues, cq,
> +	dev = eth_dev->data->dev_private;
> +	hw = &dev->hw;
> +	if (virtio_user_dev_init(dev, path, queues, cq,
>  			 queue_size, mac_addr, &ifname, server_mode,
>  			 mrg_rxbuf, in_order, packed_vq, backend_type) < 0) {
>  		PMD_INIT_LOG(ERR, "virtio_user_dev_init fails");
> @@ -912,7 +904,6 @@ static int virtio_user_pmd_dma_map(struct rte_vdev_device
> *vdev, void *addr,
>  	const char *name;
>  	struct rte_eth_dev *eth_dev;
>  	struct virtio_user_dev *dev;
> -	struct virtio_hw *hw;
> 
>  	if (!vdev)
>  		return -EINVAL;
> @@ -923,8 +914,7 @@ static int virtio_user_pmd_dma_map(struct rte_vdev_device
> *vdev, void *addr,
>  	if (!eth_dev)
>  		return 0;
> 
> -	hw = (struct virtio_hw *)eth_dev->data->dev_private;
> -	dev = hw->virtio_user_dev;
> +	dev = eth_dev->data->dev_private;
> 
>  	if (dev->ops->dma_map)
>  		return dev->ops->dma_map(dev, addr, iova, len);
> @@ -938,7 +928,6 @@ static int virtio_user_pmd_dma_unmap(struct
> rte_vdev_device *vdev, void *addr,
>  	const char *name;
>  	struct rte_eth_dev *eth_dev;
>  	struct virtio_user_dev *dev;
> -	struct virtio_hw *hw;
> 
>  	if (!vdev)
>  		return -EINVAL;
> @@ -949,8 +938,7 @@ static int virtio_user_pmd_dma_unmap(struct
> rte_vdev_device *vdev, void *addr,
>  	if (!eth_dev)
>  		return 0;
> 
> -	hw = (struct virtio_hw *)eth_dev->data->dev_private;
> -	dev = hw->virtio_user_dev;
> +	dev = eth_dev->data->dev_private;
> 
>  	if (dev->ops->dma_unmap)
>  		return dev->ops->dma_unmap(dev, addr, iova, len);
> --
> 2.29.2

Reviewed-by: Chenbo Xia <chenbo.xia@intel.com>
David Marchand Jan. 5, 2021, 9:16 p.m. UTC | #2
On Sun, Dec 20, 2020 at 10:14 PM Maxime Coquelin
<maxime.coquelin@redhat.com> wrote:
>
> This patch moves the virtio_hw structure into the virtio_user_dev
> structure, with the goal of making virtio_hw bus-agnostic.
>
> Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com>

Just one comment, the rest lgtm.


> diff --git a/drivers/net/virtio/virtio_user_ethdev.c b/drivers/net/virtio/virtio_user_ethdev.c
> index 516d0ee577..1f1f63a1a5 100644
> --- a/drivers/net/virtio/virtio_user_ethdev.c
> +++ b/drivers/net/virtio/virtio_user_ethdev.c
> @@ -26,13 +26,13 @@
>  #include "virtio_user/virtio_user_dev.h"
>  #include "virtio_user/vhost.h"
>
> -#define virtio_user_get_dev(hw) \
> -       ((struct virtio_user_dev *)(hw)->virtio_user_dev)
> +#define virtio_user_get_dev(hw) container_of(hw, struct virtio_user_dev, hw)

Since the hw parameter is expanded as both the object and the field
name too, this macro prevents us from calling anything but
virtio_user_get_dev(hw).
Maxime Coquelin Jan. 14, 2021, 9:26 a.m. UTC | #3
On 1/5/21 10:16 PM, David Marchand wrote:
> On Sun, Dec 20, 2020 at 10:14 PM Maxime Coquelin
> <maxime.coquelin@redhat.com> wrote:
>>
>> This patch moves the virtio_hw structure into the virtio_user_dev
>> structure, with the goal of making virtio_hw bus-agnostic.
>>
>> Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com>
> 
> Just one comment, the rest lgtm.
> 
> 
>> diff --git a/drivers/net/virtio/virtio_user_ethdev.c b/drivers/net/virtio/virtio_user_ethdev.c
>> index 516d0ee577..1f1f63a1a5 100644
>> --- a/drivers/net/virtio/virtio_user_ethdev.c
>> +++ b/drivers/net/virtio/virtio_user_ethdev.c
>> @@ -26,13 +26,13 @@
>>  #include "virtio_user/virtio_user_dev.h"
>>  #include "virtio_user/vhost.h"
>>
>> -#define virtio_user_get_dev(hw) \
>> -       ((struct virtio_user_dev *)(hw)->virtio_user_dev)
>> +#define virtio_user_get_dev(hw) container_of(hw, struct virtio_user_dev, hw)
> 
> Since the hw parameter is expanded as both the object and the field
> name too, this macro prevents us from calling anything but
> virtio_user_get_dev(hw).

Indeed!

I propose to change the parameter to hwp (hw pointer).

Thanks,
Maxime
diff mbox series

Patch

diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c
index b3086297c0..3ace25ac80 100644
--- a/drivers/net/virtio/virtio_ethdev.c
+++ b/drivers/net/virtio/virtio_ethdev.c
@@ -747,7 +747,7 @@  virtio_dev_close(struct rte_eth_dev *dev)
 
 #ifdef RTE_VIRTIO_USER
 	if (hw->bus_type == VIRTIO_BUS_USER)
-		virtio_user_dev_uninit(hw->virtio_user_dev);
+		virtio_user_dev_uninit(dev->data->dev_private);
 	else
 #endif
 	if (dev->device) {
diff --git a/drivers/net/virtio/virtio_pci.h b/drivers/net/virtio/virtio_pci.h
index 6388f0a74d..b35a596169 100644
--- a/drivers/net/virtio/virtio_pci.h
+++ b/drivers/net/virtio/virtio_pci.h
@@ -277,7 +277,6 @@  struct virtio_hw {
 	uint16_t    *notify_base;
 	struct virtio_pci_common_cfg *common_cfg;
 	struct virtio_net_config *dev_cfg;
-	void	    *virtio_user_dev;
 	/*
 	 * App management thread and virtio interrupt handler thread
 	 * both can change device state, this lock is meant to avoid
diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.h b/drivers/net/virtio/virtio_user/virtio_user_dev.h
index e053897d8f..59f4dd1f24 100644
--- a/drivers/net/virtio/virtio_user/virtio_user_dev.h
+++ b/drivers/net/virtio/virtio_user/virtio_user_dev.h
@@ -24,6 +24,7 @@  struct virtio_user_queue {
 };
 
 struct virtio_user_dev {
+	struct virtio_hw hw;
 	enum virtio_user_backend_type backend_type;
 	/* for vhost_user backend */
 	int		vhostfd;
diff --git a/drivers/net/virtio/virtio_user_ethdev.c b/drivers/net/virtio/virtio_user_ethdev.c
index 516d0ee577..1f1f63a1a5 100644
--- a/drivers/net/virtio/virtio_user_ethdev.c
+++ b/drivers/net/virtio/virtio_user_ethdev.c
@@ -26,13 +26,13 @@ 
 #include "virtio_user/virtio_user_dev.h"
 #include "virtio_user/vhost.h"
 
-#define virtio_user_get_dev(hw) \
-	((struct virtio_user_dev *)(hw)->virtio_user_dev)
+#define virtio_user_get_dev(hw) container_of(hw, struct virtio_user_dev, hw)
 
 static void
-virtio_user_reset_queues_packed(struct rte_eth_dev *dev)
+virtio_user_reset_queues_packed(struct rte_eth_dev *eth_dev)
 {
-	struct virtio_hw *hw = dev->data->dev_private;
+	struct virtio_user_dev *dev = eth_dev->data->dev_private;
+	struct virtio_hw *hw = &dev->hw;
 	struct virtnet_rx *rxvq;
 	struct virtnet_tx *txvq;
 	uint16_t i;
@@ -48,14 +48,14 @@  virtio_user_reset_queues_packed(struct rte_eth_dev *dev)
 	rte_delay_ms(1);
 
 	/* Vring reset for each Tx queue and Rx queue. */
-	for (i = 0; i < dev->data->nb_rx_queues; i++) {
-		rxvq = dev->data->rx_queues[i];
+	for (i = 0; i < eth_dev->data->nb_rx_queues; i++) {
+		rxvq = eth_dev->data->rx_queues[i];
 		virtqueue_rxvq_reset_packed(rxvq->vq);
-		virtio_dev_rx_queue_setup_finish(dev, i);
+		virtio_dev_rx_queue_setup_finish(eth_dev, i);
 	}
 
-	for (i = 0; i < dev->data->nb_tx_queues; i++) {
-		txvq = dev->data->tx_queues[i];
+	for (i = 0; i < eth_dev->data->nb_tx_queues; i++) {
+		txvq = eth_dev->data->tx_queues[i];
 		virtqueue_txvq_reset_packed(txvq->vq);
 	}
 
@@ -69,7 +69,7 @@  virtio_user_server_reconnect(struct virtio_user_dev *dev)
 {
 	int ret, connectfd, old_status;
 	struct rte_eth_dev *eth_dev = &rte_eth_devices[dev->port_id];
-	struct virtio_hw *hw = eth_dev->data->dev_private;
+	struct virtio_hw *hw = &dev->hw;
 	uint64_t protocol_features;
 
 	connectfd = accept(dev->listenfd, NULL, NULL);
@@ -605,21 +605,15 @@  virtio_user_eth_dev_alloc(struct rte_vdev_device *vdev)
 	struct virtio_hw *hw;
 	struct virtio_user_dev *dev;
 
-	eth_dev = rte_eth_vdev_allocate(vdev, sizeof(*hw));
+	eth_dev = rte_eth_vdev_allocate(vdev, sizeof(*dev));
 	if (!eth_dev) {
 		PMD_INIT_LOG(ERR, "cannot alloc rte_eth_dev");
 		return NULL;
 	}
 
 	data = eth_dev->data;
-	hw = eth_dev->data->dev_private;
-
-	dev = rte_zmalloc(NULL, sizeof(*dev), 0);
-	if (!dev) {
-		PMD_INIT_LOG(ERR, "malloc virtio_user_dev failed");
-		rte_eth_dev_release_port(eth_dev);
-		return NULL;
-	}
+	dev = eth_dev->data->dev_private;
+	hw = &dev->hw;
 
 	hw->port_id = data->port_id;
 	dev->port_id = data->port_id;
@@ -634,17 +628,13 @@  virtio_user_eth_dev_alloc(struct rte_vdev_device *vdev)
 	hw->use_vec_tx = 0;
 	hw->use_inorder_rx = 0;
 	hw->use_inorder_tx = 0;
-	hw->virtio_user_dev = dev;
+
 	return eth_dev;
 }
 
 static void
 virtio_user_eth_dev_free(struct rte_eth_dev *eth_dev)
 {
-	struct rte_eth_dev_data *data = eth_dev->data;
-	struct virtio_hw *hw = data->dev_private;
-
-	rte_free(hw->virtio_user_dev);
 	rte_eth_dev_release_port(eth_dev);
 }
 
@@ -653,11 +643,12 @@  virtio_user_eth_dev_free(struct rte_eth_dev *eth_dev)
  * Returns 0 on success.
  */
 static int
-virtio_user_pmd_probe(struct rte_vdev_device *dev)
+virtio_user_pmd_probe(struct rte_vdev_device *vdev)
 {
 	struct rte_kvargs *kvlist = NULL;
 	struct rte_eth_dev *eth_dev;
 	struct virtio_hw *hw;
+	struct virtio_user_dev *dev;
 	enum virtio_user_backend_type backend_type = VIRTIO_USER_BACKEND_UNKNOWN;
 	uint64_t queues = VIRTIO_USER_DEF_Q_NUM;
 	uint64_t cq = VIRTIO_USER_DEF_CQ_EN;
@@ -673,7 +664,7 @@  virtio_user_pmd_probe(struct rte_vdev_device *dev)
 	int ret = -1;
 
 	if (rte_eal_process_type() == RTE_PROC_SECONDARY) {
-		const char *name = rte_vdev_device_name(dev);
+		const char *name = rte_vdev_device_name(vdev);
 		eth_dev = rte_eth_dev_attach_secondary(name);
 		if (!eth_dev) {
 			PMD_INIT_LOG(ERR, "Failed to probe %s", name);
@@ -687,12 +678,12 @@  virtio_user_pmd_probe(struct rte_vdev_device *dev)
 		}
 
 		eth_dev->dev_ops = &virtio_user_secondary_eth_dev_ops;
-		eth_dev->device = &dev->device;
+		eth_dev->device = &vdev->device;
 		rte_eth_dev_probing_finish(eth_dev);
 		return 0;
 	}
 
-	kvlist = rte_kvargs_parse(rte_vdev_device_args(dev), valid_args);
+	kvlist = rte_kvargs_parse(rte_vdev_device_args(vdev), valid_args);
 	if (!kvlist) {
 		PMD_INIT_LOG(ERR, "error when parsing param");
 		goto end;
@@ -832,14 +823,15 @@  virtio_user_pmd_probe(struct rte_vdev_device *dev)
 		}
 	}
 
-	eth_dev = virtio_user_eth_dev_alloc(dev);
+	eth_dev = virtio_user_eth_dev_alloc(vdev);
 	if (!eth_dev) {
 		PMD_INIT_LOG(ERR, "virtio_user fails to alloc device");
 		goto end;
 	}
 
-	hw = eth_dev->data->dev_private;
-	if (virtio_user_dev_init(hw->virtio_user_dev, path, queues, cq,
+	dev = eth_dev->data->dev_private;
+	hw = &dev->hw;
+	if (virtio_user_dev_init(dev, path, queues, cq,
 			 queue_size, mac_addr, &ifname, server_mode,
 			 mrg_rxbuf, in_order, packed_vq, backend_type) < 0) {
 		PMD_INIT_LOG(ERR, "virtio_user_dev_init fails");
@@ -912,7 +904,6 @@  static int virtio_user_pmd_dma_map(struct rte_vdev_device *vdev, void *addr,
 	const char *name;
 	struct rte_eth_dev *eth_dev;
 	struct virtio_user_dev *dev;
-	struct virtio_hw *hw;
 
 	if (!vdev)
 		return -EINVAL;
@@ -923,8 +914,7 @@  static int virtio_user_pmd_dma_map(struct rte_vdev_device *vdev, void *addr,
 	if (!eth_dev)
 		return 0;
 
-	hw = (struct virtio_hw *)eth_dev->data->dev_private;
-	dev = hw->virtio_user_dev;
+	dev = eth_dev->data->dev_private;
 
 	if (dev->ops->dma_map)
 		return dev->ops->dma_map(dev, addr, iova, len);
@@ -938,7 +928,6 @@  static int virtio_user_pmd_dma_unmap(struct rte_vdev_device *vdev, void *addr,
 	const char *name;
 	struct rte_eth_dev *eth_dev;
 	struct virtio_user_dev *dev;
-	struct virtio_hw *hw;
 
 	if (!vdev)
 		return -EINVAL;
@@ -949,8 +938,7 @@  static int virtio_user_pmd_dma_unmap(struct rte_vdev_device *vdev, void *addr,
 	if (!eth_dev)
 		return 0;
 
-	hw = (struct virtio_hw *)eth_dev->data->dev_private;
-	dev = hw->virtio_user_dev;
+	dev = eth_dev->data->dev_private;
 
 	if (dev->ops->dma_unmap)
 		return dev->ops->dma_unmap(dev, addr, iova, len);