On Wed, 19 Sep 2018 17:01:27 +0200 Andrzej Ostruszka <a...@semihalf.com> wrote:
> +/** > + * Create private device structure. > + * > + * @param dev_name > + * Pointer to the port name passed in the initialization parameters. > + * > + * @return > + * Pointer to the newly allocated private device structure. > + */ > +static struct mvneta_priv * > +mvneta_priv_create(const char *dev_name) > +{ > + struct mvneta_priv *priv; > + > + priv = rte_zmalloc_socket(dev_name, sizeof(*priv), 0, rte_socket_id()); > + if (!priv) > + return NULL; > + > + return priv; > +} Why make this a function, it really doesn't add anything over just doing it inline. > +static int > +mvneta_eth_dev_create(struct rte_vdev_device *vdev, const char *name) > +{ > + int ret, fd = socket(AF_INET, SOCK_DGRAM, 0); > + struct rte_eth_dev *eth_dev; > + struct mvneta_priv *priv; > + struct ifreq req; > + > + eth_dev = rte_eth_dev_allocate(name); > + if (!eth_dev) > + return -ENOMEM; > + > + priv = mvneta_priv_create(name); > + > + if (!priv) { nit: no blank line needed. > + ret = -ENOMEM; > + goto out_free_dev; You have error goto's backwards. > + } > + > + eth_dev->data->mac_addrs = > + rte_zmalloc("mac_addrs", > + ETHER_ADDR_LEN * MVNETA_MAC_ADDRS_MAX, 0); > + if (!eth_dev->data->mac_addrs) { > + MVNETA_LOG(ERR, "Failed to allocate space for eth addrs"); > + ret = -ENOMEM; > + goto out_free_priv; > + } > + > + memset(&req, 0, sizeof(req)); > + strcpy(req.ifr_name, name); > +out_free_mac: > + rte_free(eth_dev->data->mac_addrs); > +out_free_dev: > + rte_eth_dev_release_port(eth_dev); > +out_free_priv: > + rte_free(priv); These are backwards: out_free_priv is called if ioctl fails and will leak eth_dev port. > + return ret; > +}