> -----Original Message----- > From: Tetsuya Mukawa [mailto:mukawa at igel.co.jp] > Sent: Monday, February 9, 2015 8:31 AM > To: dev at 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 at 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.