[dpdk-dev,v7,11/14] ethdev: Add one dev_type parameter to rte_eth_dev_allocate
Commit Message
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
> -----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.
@@ -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;
@@ -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)
{
@@ -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
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;