[dpdk-dev,v7,11/14] ethdev: Add one dev_type parameter to rte_eth_dev_allocate

Message ID 1423470639-15744-12-git-send-email-mukawa@igel.co.jp (mailing list archive)
State Superseded, archived
Headers

Commit Message

Tetsuya Mukawa Feb. 9, 2015, 8:30 a.m. UTC
  This new parameter is needed to keep device type like physical or virtual.
Port detaching processes are different between physical and virtual.
This parameter lets detaching function know a device type of the port.

v4:
- Fix comments of rte_eth_dev_type.

Signed-off-by: Tetsuya Mukawa <mukawa@igel.co.jp>
---
 app/test/virtual_pmd.c                       |  2 +-
 lib/librte_ether/rte_ethdev.c                | 14 ++++++++++++--
 lib/librte_ether/rte_ethdev.h                | 25 ++++++++++++++++++++++++-
 lib/librte_pmd_af_packet/rte_eth_af_packet.c |  2 +-
 lib/librte_pmd_bond/rte_eth_bond_api.c       |  2 +-
 lib/librte_pmd_pcap/rte_eth_pcap.c           |  2 +-
 lib/librte_pmd_ring/rte_eth_ring.c           |  2 +-
 lib/librte_pmd_xenvirt/rte_eth_xenvirt.c     |  2 +-
 8 files changed, 42 insertions(+), 9 deletions(-)
  

Comments

Iremonger, Bernard Feb. 9, 2015, 3:03 p.m. UTC | #1
> -----Original Message-----
> From: Tetsuya Mukawa [mailto:mukawa@igel.co.jp]
> Sent: Monday, February 9, 2015 8:31 AM
> To: dev@dpdk.org
> Cc: Iremonger, Bernard; Qiu, Michael; Tetsuya Mukawa
> Subject: [PATCH v7 11/14] ethdev: Add one dev_type parameter to rte_eth_dev_allocate
> 
> This new parameter is needed to keep device type like physical or virtual.
> Port detaching processes are different between physical and virtual.
> This parameter lets detaching function know a device type of the port.
> 
> v4:
> - Fix comments of rte_eth_dev_type.
> 
> Signed-off-by: Tetsuya Mukawa <mukawa@igel.co.jp>
> ---
>  app/test/virtual_pmd.c                       |  2 +-
>  lib/librte_ether/rte_ethdev.c                | 14 ++++++++++++--
>  lib/librte_ether/rte_ethdev.h                | 25 ++++++++++++++++++++++++-
>  lib/librte_pmd_af_packet/rte_eth_af_packet.c |  2 +-
>  lib/librte_pmd_bond/rte_eth_bond_api.c       |  2 +-
>  lib/librte_pmd_pcap/rte_eth_pcap.c           |  2 +-
>  lib/librte_pmd_ring/rte_eth_ring.c           |  2 +-
>  lib/librte_pmd_xenvirt/rte_eth_xenvirt.c     |  2 +-
>  8 files changed, 42 insertions(+), 9 deletions(-)
> 
> diff --git a/app/test/virtual_pmd.c b/app/test/virtual_pmd.c index 9fac95d..8d3a5ff 100644
> --- a/app/test/virtual_pmd.c
> +++ b/app/test/virtual_pmd.c
> @@ -556,7 +556,7 @@ virtual_ethdev_create(const char *name, struct ether_addr *mac_addr,
>  		goto err;
> 
>  	/* reserve an ethdev entry */
> -	eth_dev = rte_eth_dev_allocate(name);
> +	eth_dev = rte_eth_dev_allocate(name, RTE_ETH_DEV_PHYSICAL);
>  	if (eth_dev == NULL)
>  		goto err;
> 
> diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c index 14a040a..704185d
> 100644
> --- a/lib/librte_ether/rte_ethdev.c
> +++ b/lib/librte_ether/rte_ethdev.c
> @@ -232,7 +232,7 @@ rte_eth_dev_allocate_new_port(void)
>  }
> 
>  struct rte_eth_dev *
> -rte_eth_dev_allocate(const char *name)
> +rte_eth_dev_allocate(const char *name, enum rte_eth_dev_type type)
>  {
>  	uint8_t port_id;
>  	struct rte_eth_dev *eth_dev;
> @@ -256,6 +256,7 @@ rte_eth_dev_allocate(const char *name)
>  	snprintf(eth_dev->data->name, sizeof(eth_dev->data->name), "%s", name);
>  	eth_dev->data->port_id = port_id;
>  	eth_dev->attached = DEV_CONNECTED;
> +	eth_dev->dev_type = type;
>  	nb_ports++;
>  	return eth_dev;
>  }
> @@ -267,6 +268,7 @@ rte_eth_dev_free(struct rte_eth_dev *eth_dev)
>  		return -EINVAL;
> 
>  	eth_dev->attached = 0;
> +	eth_dev->dev_type = RTE_ETH_DEV_UNKNOWN;
>  	nb_ports--;
>  	return 0;
>  }
> @@ -287,7 +289,7 @@ rte_eth_dev_init(struct rte_pci_driver *pci_drv,
>  	snprintf(ethdev_name, RTE_ETH_NAME_MAX_LEN, "%d:%d.%d",
>  			pci_dev->addr.bus, pci_dev->addr.devid, pci_dev->addr.function);
> 
> -	eth_dev = rte_eth_dev_allocate(ethdev_name);
> +	eth_dev = rte_eth_dev_allocate(ethdev_name, RTE_ETH_DEV_PHYSICAL);
>  	if (eth_dev == NULL)
>  		return -ENOMEM;
> 
> @@ -426,6 +428,14 @@ rte_eth_dev_count(void)
>  	return (nb_ports);
>  }
> 
> +enum rte_eth_dev_type
> +rte_eth_dev_get_device_type(uint8_t port_id) {
> +	if (rte_eth_dev_validate_port(port_id, NONE_TRACE) == DEV_INVALID)

Hi Tetsuya,

NO_TRACE would be better than NON_TRACE.


> +		return -1;
> +	return rte_eth_devices[port_id].dev_type;
> +}
> +
>  void
>  rte_eth_dev_save(struct rte_eth_dev *devs)  { diff --git a/lib/librte_ether/rte_ethdev.h
> b/lib/librte_ether/rte_ethdev.h index 9919968..00a6218 100644
> --- a/lib/librte_ether/rte_ethdev.h
> +++ b/lib/librte_ether/rte_ethdev.h
> @@ -1522,6 +1522,17 @@ struct eth_dev_ops {  };
> 
>  /**
> + * The eth device type
> + */
> +enum rte_eth_dev_type {
> +	RTE_ETH_DEV_UNKNOWN,	/**< unknown device type */
> +	RTE_ETH_DEV_PHYSICAL,
> +		/**< Physical function and Virtual function devices of NIC */
> +	RTE_ETH_DEV_VIRTUAL,	/**< non hardware device */
> +	RTE_ETH_DEV_MAX		/**< max value of this enum */
> +};
> +
> +/**
>   * @internal
>   * The generic data structure associated with each ethernet device.
>   *
> @@ -1540,6 +1551,7 @@ struct rte_eth_dev {
>  	struct rte_pci_device *pci_dev; /**< PCI info. supplied by probing */
>  	struct rte_eth_dev_cb_list callbacks; /**< User application callbacks */
>  	uint8_t attached; /**< Flag indicating the port is attached */
> +	enum rte_eth_dev_type dev_type; /**< Flag indicating the device type
> +*/
>  };
> 
>  struct rte_eth_dev_sriov {
> @@ -1617,6 +1629,15 @@ extern uint8_t rte_eth_dev_count(void);
> 
>  /**
>   * Function for internal use by port hotplug functions.
> + * Get the device type to know whether the device is physical or virtual.
> + * @param	port_id	The pointer to the port id
> + * @return
> + *   - Device type.
> + */
> +extern enum rte_eth_dev_type rte_eth_dev_get_device_type(uint8_t
> +port_id);
> +
> +/**
> + * Function for internal use by port hotplug functions.
>   * Copies current ethdev structures to the specified pointer.
>   *
>   * @param	devs	The pointer to the ethdev structures
> @@ -1702,10 +1723,12 @@ extern struct rte_eth_dev *rte_eth_dev_allocated(const char *name);
>   * to that slot for the driver to use.
>   *
>   * @param	name	Unique identifier name for each Ethernet device
> + * @param	type	Device type of this Ethernet device
>   * @return
>   *   - Slot in the rte_dev_devices array for a new device;
>   */
> -struct rte_eth_dev *rte_eth_dev_allocate(const char *name);
> +struct rte_eth_dev *rte_eth_dev_allocate(const char *name,
> +		enum rte_eth_dev_type type);
> 
>  /**
>   * Function for internal use by dummy drivers primarily, e.g. ring-based diff --git
> a/lib/librte_pmd_af_packet/rte_eth_af_packet.c b/lib/librte_pmd_af_packet/rte_eth_af_packet.c
> index 1ffe1cd..80e9bdf 100644
> --- a/lib/librte_pmd_af_packet/rte_eth_af_packet.c
> +++ b/lib/librte_pmd_af_packet/rte_eth_af_packet.c
> @@ -649,7 +649,7 @@ rte_pmd_init_internals(const char *name,
>  	}
> 
>  	/* reserve an ethdev entry */
> -	*eth_dev = rte_eth_dev_allocate(name);
> +	*eth_dev = rte_eth_dev_allocate(name, RTE_ETH_DEV_VIRTUAL);
>  	if (*eth_dev == NULL)
>  		goto error;
> 
> diff --git a/lib/librte_pmd_bond/rte_eth_bond_api.c b/lib/librte_pmd_bond/rte_eth_bond_api.c
> index 4ab3267..7a6a5f7 100644
> --- a/lib/librte_pmd_bond/rte_eth_bond_api.c
> +++ b/lib/librte_pmd_bond/rte_eth_bond_api.c
> @@ -235,7 +235,7 @@ rte_eth_bond_create(const char *name, uint8_t mode, uint8_t socket_id)
>  	}
> 
>  	/* reserve an ethdev entry */
> -	eth_dev = rte_eth_dev_allocate(name);
> +	eth_dev = rte_eth_dev_allocate(name, RTE_ETH_DEV_VIRTUAL);
>  	if (eth_dev == NULL) {
>  		RTE_BOND_LOG(ERR, "Unable to allocate rte_eth_dev");
>  		goto err;
> diff --git a/lib/librte_pmd_pcap/rte_eth_pcap.c b/lib/librte_pmd_pcap/rte_eth_pcap.c
> index d299288..af7fae8 100644
> --- a/lib/librte_pmd_pcap/rte_eth_pcap.c
> +++ b/lib/librte_pmd_pcap/rte_eth_pcap.c
> @@ -709,7 +709,7 @@ rte_pmd_init_internals(const char *name, const unsigned nb_rx_queues,
>  		goto error;
> 
>  	/* reserve an ethdev entry */
> -	*eth_dev = rte_eth_dev_allocate(name);
> +	*eth_dev = rte_eth_dev_allocate(name, RTE_ETH_DEV_VIRTUAL);
>  	if (*eth_dev == NULL)
>  		goto error;
> 
> diff --git a/lib/librte_pmd_ring/rte_eth_ring.c b/lib/librte_pmd_ring/rte_eth_ring.c
> index d5b1686..c837fcd 100644
> --- a/lib/librte_pmd_ring/rte_eth_ring.c
> +++ b/lib/librte_pmd_ring/rte_eth_ring.c
> @@ -255,7 +255,7 @@ rte_eth_from_rings(const char *name, struct rte_ring *const rx_queues[],
>  		goto error;
> 
>  	/* reserve an ethdev entry */
> -	eth_dev = rte_eth_dev_allocate(name);
> +	eth_dev = rte_eth_dev_allocate(name, RTE_ETH_DEV_VIRTUAL);
>  	if (eth_dev == NULL)
>  		goto error;
> 
> diff --git a/lib/librte_pmd_xenvirt/rte_eth_xenvirt.c b/lib/librte_pmd_xenvirt/rte_eth_xenvirt.c
> index 04e30c9..bc403d6 100644
> --- a/lib/librte_pmd_xenvirt/rte_eth_xenvirt.c
> +++ b/lib/librte_pmd_xenvirt/rte_eth_xenvirt.c
> @@ -648,7 +648,7 @@ eth_dev_xenvirt_create(const char *name, const char *params,
>  		goto err;
> 
>  	/* reserve an ethdev entry */
> -	eth_dev = rte_eth_dev_allocate(name);
> +	eth_dev = rte_eth_dev_allocate(name, RTE_ETH_DEV_VIRTUAL);
>  	if (eth_dev == NULL)
>  		goto err;
> 
> --
> 1.9.1

Regards,

Bernard.
  

Patch

diff --git a/app/test/virtual_pmd.c b/app/test/virtual_pmd.c
index 9fac95d..8d3a5ff 100644
--- a/app/test/virtual_pmd.c
+++ b/app/test/virtual_pmd.c
@@ -556,7 +556,7 @@  virtual_ethdev_create(const char *name, struct ether_addr *mac_addr,
 		goto err;
 
 	/* reserve an ethdev entry */
-	eth_dev = rte_eth_dev_allocate(name);
+	eth_dev = rte_eth_dev_allocate(name, RTE_ETH_DEV_PHYSICAL);
 	if (eth_dev == NULL)
 		goto err;
 
diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
index 14a040a..704185d 100644
--- a/lib/librte_ether/rte_ethdev.c
+++ b/lib/librte_ether/rte_ethdev.c
@@ -232,7 +232,7 @@  rte_eth_dev_allocate_new_port(void)
 }
 
 struct rte_eth_dev *
-rte_eth_dev_allocate(const char *name)
+rte_eth_dev_allocate(const char *name, enum rte_eth_dev_type type)
 {
 	uint8_t port_id;
 	struct rte_eth_dev *eth_dev;
@@ -256,6 +256,7 @@  rte_eth_dev_allocate(const char *name)
 	snprintf(eth_dev->data->name, sizeof(eth_dev->data->name), "%s", name);
 	eth_dev->data->port_id = port_id;
 	eth_dev->attached = DEV_CONNECTED;
+	eth_dev->dev_type = type;
 	nb_ports++;
 	return eth_dev;
 }
@@ -267,6 +268,7 @@  rte_eth_dev_free(struct rte_eth_dev *eth_dev)
 		return -EINVAL;
 
 	eth_dev->attached = 0;
+	eth_dev->dev_type = RTE_ETH_DEV_UNKNOWN;
 	nb_ports--;
 	return 0;
 }
@@ -287,7 +289,7 @@  rte_eth_dev_init(struct rte_pci_driver *pci_drv,
 	snprintf(ethdev_name, RTE_ETH_NAME_MAX_LEN, "%d:%d.%d",
 			pci_dev->addr.bus, pci_dev->addr.devid, pci_dev->addr.function);
 
-	eth_dev = rte_eth_dev_allocate(ethdev_name);
+	eth_dev = rte_eth_dev_allocate(ethdev_name, RTE_ETH_DEV_PHYSICAL);
 	if (eth_dev == NULL)
 		return -ENOMEM;
 
@@ -426,6 +428,14 @@  rte_eth_dev_count(void)
 	return (nb_ports);
 }
 
+enum rte_eth_dev_type
+rte_eth_dev_get_device_type(uint8_t port_id)
+{
+	if (rte_eth_dev_validate_port(port_id, NONE_TRACE) == DEV_INVALID)
+		return -1;
+	return rte_eth_devices[port_id].dev_type;
+}
+
 void
 rte_eth_dev_save(struct rte_eth_dev *devs)
 {
diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h
index 9919968..00a6218 100644
--- a/lib/librte_ether/rte_ethdev.h
+++ b/lib/librte_ether/rte_ethdev.h
@@ -1522,6 +1522,17 @@  struct eth_dev_ops {
 };
 
 /**
+ * The eth device type
+ */
+enum rte_eth_dev_type {
+	RTE_ETH_DEV_UNKNOWN,	/**< unknown device type */
+	RTE_ETH_DEV_PHYSICAL,
+		/**< Physical function and Virtual function devices of NIC */
+	RTE_ETH_DEV_VIRTUAL,	/**< non hardware device */
+	RTE_ETH_DEV_MAX		/**< max value of this enum */
+};
+
+/**
  * @internal
  * The generic data structure associated with each ethernet device.
  *
@@ -1540,6 +1551,7 @@  struct rte_eth_dev {
 	struct rte_pci_device *pci_dev; /**< PCI info. supplied by probing */
 	struct rte_eth_dev_cb_list callbacks; /**< User application callbacks */
 	uint8_t attached; /**< Flag indicating the port is attached */
+	enum rte_eth_dev_type dev_type; /**< Flag indicating the device type */
 };
 
 struct rte_eth_dev_sriov {
@@ -1617,6 +1629,15 @@  extern uint8_t rte_eth_dev_count(void);
 
 /**
  * Function for internal use by port hotplug functions.
+ * Get the device type to know whether the device is physical or virtual.
+ * @param	port_id	The pointer to the port id
+ * @return
+ *   - Device type.
+ */
+extern enum rte_eth_dev_type rte_eth_dev_get_device_type(uint8_t port_id);
+
+/**
+ * Function for internal use by port hotplug functions.
  * Copies current ethdev structures to the specified pointer.
  *
  * @param	devs	The pointer to the ethdev structures
@@ -1702,10 +1723,12 @@  extern struct rte_eth_dev *rte_eth_dev_allocated(const char *name);
  * to that slot for the driver to use.
  *
  * @param	name	Unique identifier name for each Ethernet device
+ * @param	type	Device type of this Ethernet device
  * @return
  *   - Slot in the rte_dev_devices array for a new device;
  */
-struct rte_eth_dev *rte_eth_dev_allocate(const char *name);
+struct rte_eth_dev *rte_eth_dev_allocate(const char *name,
+		enum rte_eth_dev_type type);
 
 /**
  * Function for internal use by dummy drivers primarily, e.g. ring-based
diff --git a/lib/librte_pmd_af_packet/rte_eth_af_packet.c b/lib/librte_pmd_af_packet/rte_eth_af_packet.c
index 1ffe1cd..80e9bdf 100644
--- a/lib/librte_pmd_af_packet/rte_eth_af_packet.c
+++ b/lib/librte_pmd_af_packet/rte_eth_af_packet.c
@@ -649,7 +649,7 @@  rte_pmd_init_internals(const char *name,
 	}
 
 	/* reserve an ethdev entry */
-	*eth_dev = rte_eth_dev_allocate(name);
+	*eth_dev = rte_eth_dev_allocate(name, RTE_ETH_DEV_VIRTUAL);
 	if (*eth_dev == NULL)
 		goto error;
 
diff --git a/lib/librte_pmd_bond/rte_eth_bond_api.c b/lib/librte_pmd_bond/rte_eth_bond_api.c
index 4ab3267..7a6a5f7 100644
--- a/lib/librte_pmd_bond/rte_eth_bond_api.c
+++ b/lib/librte_pmd_bond/rte_eth_bond_api.c
@@ -235,7 +235,7 @@  rte_eth_bond_create(const char *name, uint8_t mode, uint8_t socket_id)
 	}
 
 	/* reserve an ethdev entry */
-	eth_dev = rte_eth_dev_allocate(name);
+	eth_dev = rte_eth_dev_allocate(name, RTE_ETH_DEV_VIRTUAL);
 	if (eth_dev == NULL) {
 		RTE_BOND_LOG(ERR, "Unable to allocate rte_eth_dev");
 		goto err;
diff --git a/lib/librte_pmd_pcap/rte_eth_pcap.c b/lib/librte_pmd_pcap/rte_eth_pcap.c
index d299288..af7fae8 100644
--- a/lib/librte_pmd_pcap/rte_eth_pcap.c
+++ b/lib/librte_pmd_pcap/rte_eth_pcap.c
@@ -709,7 +709,7 @@  rte_pmd_init_internals(const char *name, const unsigned nb_rx_queues,
 		goto error;
 
 	/* reserve an ethdev entry */
-	*eth_dev = rte_eth_dev_allocate(name);
+	*eth_dev = rte_eth_dev_allocate(name, RTE_ETH_DEV_VIRTUAL);
 	if (*eth_dev == NULL)
 		goto error;
 
diff --git a/lib/librte_pmd_ring/rte_eth_ring.c b/lib/librte_pmd_ring/rte_eth_ring.c
index d5b1686..c837fcd 100644
--- a/lib/librte_pmd_ring/rte_eth_ring.c
+++ b/lib/librte_pmd_ring/rte_eth_ring.c
@@ -255,7 +255,7 @@  rte_eth_from_rings(const char *name, struct rte_ring *const rx_queues[],
 		goto error;
 
 	/* reserve an ethdev entry */
-	eth_dev = rte_eth_dev_allocate(name);
+	eth_dev = rte_eth_dev_allocate(name, RTE_ETH_DEV_VIRTUAL);
 	if (eth_dev == NULL)
 		goto error;
 
diff --git a/lib/librte_pmd_xenvirt/rte_eth_xenvirt.c b/lib/librte_pmd_xenvirt/rte_eth_xenvirt.c
index 04e30c9..bc403d6 100644
--- a/lib/librte_pmd_xenvirt/rte_eth_xenvirt.c
+++ b/lib/librte_pmd_xenvirt/rte_eth_xenvirt.c
@@ -648,7 +648,7 @@  eth_dev_xenvirt_create(const char *name, const char *params,
 		goto err;
 
 	/* reserve an ethdev entry */
-	eth_dev = rte_eth_dev_allocate(name);
+	eth_dev = rte_eth_dev_allocate(name, RTE_ETH_DEV_VIRTUAL);
 	if (eth_dev == NULL)
 		goto err;