On Thu,  2 Feb 2017 16:33:27 -0600
Keith Wiles <keith.wi...@intel.com> wrote:

> Signed-off-by: Keith Wiles <keith.wi...@intel.com>
> ---
>  drivers/net/tap/rte_eth_tap.c | 93
> ++++++++++++++++++++++--------------------- 1 file changed, 48 insertions(+),
> 45 deletions(-)
> 
> diff --git a/drivers/net/tap/rte_eth_tap.c b/drivers/net/tap/rte_eth_tap.c
> index 3f179c3..9ed7a87 100644
> --- a/drivers/net/tap/rte_eth_tap.c
> +++ b/drivers/net/tap/rte_eth_tap.c
> @@ -115,10 +115,9 @@ struct pmd_internals {
>   * supplied name.
>   */
>  static int
> -tun_alloc(char *name)
> +tun_alloc(char *name, uint16_t qid)
>  {
>       struct ifreq ifr;
> -     unsigned int features;
>       int fd;
>  
>       memset(&ifr, 0, sizeof(struct ifreq));
> @@ -133,55 +132,57 @@ tun_alloc(char *name)
>               goto error;
>       }
>  
> -     /* Grab the TUN features to verify we can work */
> -     if (ioctl(fd, TUNGETFEATURES, &features) < 0) {
> -             RTE_LOG(ERR, PMD, "Unable to get TUN/TAP features\n");
> -             goto error;
> -     }
> -     RTE_LOG(DEBUG, PMD, "TUN/TAP Features %08x\n", features);
> +     /* This can only be done once per interface */
> +     if (qid == 0) {
> +             unsigned int features;
> +
> +             /* Grab the TUN features to verify we can work */
> +             if (ioctl(fd, TUNGETFEATURES, &features) < 0) {
> +                     RTE_LOG(ERR, PMD, "Unable to get TUN/TAP
> features\n");
> +                     goto error;
> +             }
> +             RTE_LOG(DEBUG, PMD, "TUN/TAP Features %08x\n", features);
>  
>  #ifdef IFF_MULTI_QUEUE
> -     if (!(features & IFF_MULTI_QUEUE) && (RTE_PMD_TAP_MAX_QUEUES > 1)) {
> -             RTE_LOG(DEBUG, PMD, "TUN/TAP device only one queue\n");
> -             goto error;
> -     } else if ((features & IFF_ONE_QUEUE) &&
> -                     (RTE_PMD_TAP_MAX_QUEUES == 1)) {
> -             ifr.ifr_flags |= IFF_ONE_QUEUE;
> -             RTE_LOG(DEBUG, PMD, "Single queue only support\n");
> -     } else {
> -             ifr.ifr_flags |= IFF_MULTI_QUEUE;
> -             RTE_LOG(DEBUG, PMD, "Multi-queue support for %d queues\n",
> -                     RTE_PMD_TAP_MAX_QUEUES);
> -     }
> +             if (!(features & IFF_MULTI_QUEUE) && (RTE_PMD_TAP_MAX_QUEUES
> > 1)) {
> +                     RTE_LOG(DEBUG, PMD, "TUN/TAP device only one
> queue\n");
> +                     goto error;
> +             } else if ((features & IFF_ONE_QUEUE) &&
> +                             (RTE_PMD_TAP_MAX_QUEUES == 1)) {
> +                     ifr.ifr_flags |= IFF_ONE_QUEUE;
> +                     RTE_LOG(DEBUG, PMD, "Single queue only support\n");
> +             } else {
> +                     ifr.ifr_flags |= IFF_MULTI_QUEUE;
> +                     RTE_LOG(DEBUG, PMD, "Multi-queue support for %d
> queues\n",
> +                             RTE_PMD_TAP_MAX_QUEUES);
> +             }
>  #else
> -     if (RTE_PMD_TAP_MAX_QUEUES > 1) {
> -             RTE_LOG(DEBUG, PMD, "TUN/TAP device only one queue\n");
> -             goto error;
> -     } else {
> -             ifr.ifr_flags |= IFF_ONE_QUEUE;
> -             RTE_LOG(DEBUG, PMD, "Single queue only support\n");
> -     }
> +             if (RTE_PMD_TAP_MAX_QUEUES > 1) {
> +                     RTE_LOG(DEBUG, PMD, "TUN/TAP device only one
> queue\n");
> +                     goto error;
> +             } else {
> +                     ifr.ifr_flags |= IFF_ONE_QUEUE;
> +                     RTE_LOG(DEBUG, PMD, "Single queue only support\n");
> +             }
>  #endif
>  
> -     /* Set the TUN/TAP configuration and get the name if needed */
> -     if (ioctl(fd, TUNSETIFF, (void *)&ifr) < 0) {
> -             RTE_LOG(ERR, PMD, "Unable to set TUNSETIFF for %s\n",
> -                     ifr.ifr_name);
> -             perror("TUNSETIFF");
> -             goto error;
> -     }
> +             /* Set the TUN/TAP configuration and get the name if needed
> */
> +             if (ioctl(fd, TUNSETIFF, (void *)&ifr) < 0) {
> +                     RTE_LOG(ERR, PMD, "Unable to set TUNSETIFF for %s\n",
> +                             ifr.ifr_name);
> +                     perror("TUNSETIFF");
> +                     goto error;
> +             }
>  
> -     /* Always set the file descriptor to non-blocking */
> -     if (fcntl(fd, F_SETFL, O_NONBLOCK) < 0) {
> -             RTE_LOG(ERR, PMD, "Unable to set to nonblocking\n");
> -             perror("F_SETFL, NONBLOCK");
> -             goto error;
> +             /* Always set the file descriptor to non-blocking */
> +             if (fcntl(fd, F_SETFL, O_NONBLOCK) < 0) {
> +                     RTE_LOG(WARNING, PMD, "Unable to set %s to
> nonblocking\n",
> +                             ifr.ifr_name);
> +                     perror("F_SETFL, NONBLOCK");
> +                     goto error;
> +             }
>       }
>  
> -     /* If the name is different that new name as default */
> -     if (name && strcmp(name, ifr.ifr_name))
> -             snprintf(name, RTE_ETH_NAME_MAX_LEN - 1, "%s", ifr.ifr_name);
> -
>       return fd;
>  
>  error:
> @@ -512,7 +513,7 @@ tap_setup_queue(struct rte_eth_dev *dev,
>               if (fd < 0) {
>                       RTE_LOG(INFO, PMD, "Add queue to TAP %s for qid
> %d\n", pmd->name, qid);
> -                     fd = tun_alloc(pmd->name);
> +                     fd = tun_alloc(pmd->name, qid);
>                       if (fd < 0) {
>                               RTE_LOG(ERR, PMD, "tun_alloc(%s) failed\n",
> pmd->name); return -1;
> @@ -711,7 +712,7 @@ eth_dev_tap_create(const char *name, char *tap_name)
>       snprintf(dev->data->name, sizeof(dev->data->name), "%s", name);
>  
>       /* Create the first Tap device */
> -     fd = tun_alloc(tap_name);
> +     fd = tun_alloc(tap_name, 0);
>       if (fd < 0) {
>               RTE_LOG(ERR, PMD, "tun_alloc() failed\n");
>               goto error_exit;
> @@ -739,6 +740,8 @@ eth_dev_tap_create(const char *name, char *tap_name)
>  error_exit:
>       RTE_PMD_DEBUG_TRACE("Unable to initialize %s\n", name);
>  
> +     if (fd > 0)
> +             close(fd);
>       rte_free(data);
>       rte_free(pmd);
>  

The patch looks good to me.

Can you maybe detail in the commit log that now queue 0 is created while
probing, while other queues are handled through tap_setup_queue() only?

Pascal

Reply via email to