[ovs-dev] [PATCH 3/3] dpif-netdev: Destroy pmd threads only if pmd-cpu-mask changed.

Flavio Leitner fbl at sysclose.org
Thu Feb 18 20:20:06 UTC 2016


On Mon, 08 Feb 2016 18:30:31 +0300
Ilya Maximets <i.maximets at samsung.com> wrote:

> Since 5f2ccb1c0d3b ("dpif: Allow adding ukeys for same flow by
> different pmds.") there is the possibility to reassign queues among
> pmd threads without restarting them and deleting the megaflow cache.
> 
> So, reconfiguration can be performed without destroying of PMD threads
> if pmd-cpu-mask not changed.
> 
> Reassignment of all rx queues done to achieve fair distribution.
> 
> Signed-off-by: Ilya Maximets <i.maximets at samsung.com>
> ---
>  lib/dpif-netdev.c | 62 +++++++++++++++++++++++++++++++++++++------------------
>  1 file changed, 42 insertions(+), 20 deletions(-)
> 
> diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
> index e62f5f6..8069163 100644
> --- a/lib/dpif-netdev.c
> +++ b/lib/dpif-netdev.c
> @@ -2373,27 +2373,31 @@ dpif_netdev_operate(struct dpif *dpif, struct dpif_op **ops, size_t n_ops)
>      }
>  }
>  
> -/* Returns true if the configuration for rx queues or cpu mask
> - * is changed. */
> +/* Returns true if the configuration of rx queues changed. */
>  static bool
> -pmd_config_changed(const struct dp_netdev *dp, const char *cmask)
> +pmd_n_rxq_changed(const struct dp_netdev *dp)
>  {
>      struct dp_netdev_port *port;
>  
>      CMAP_FOR_EACH (port, node, &dp->ports) {
> -        struct netdev *netdev = port->netdev;
> -        int requested_n_rxq = netdev_requested_n_rxq(netdev);
> -        if (netdev_is_pmd(netdev)
> +        int requested_n_rxq = netdev_requested_n_rxq(port->netdev);
> +        if (netdev_is_pmd(port->netdev)
>              && port->latest_requested_n_rxq != requested_n_rxq) {
>              return true;
>          }
>      }
> +    return false;
> +}
>  
> +/* Returns true if cpu mask changed. */
> +static bool
> +pmd_cpu_mask_changed(const struct dp_netdev *dp, const char *cmask)
> +{
>      if (dp->pmd_cmask != NULL && cmask != NULL) {
>          return strcmp(dp->pmd_cmask, cmask);
> -    } else {
> -        return (dp->pmd_cmask != NULL || cmask != NULL);
>      }
> +
> +    return (dp->pmd_cmask != NULL || cmask != NULL);
>  }
>  
>  /* Resets pmd threads if the configuration for 'rxq's or cpu mask changes. */
> @@ -2401,11 +2405,20 @@ static int
>  dpif_netdev_pmd_set(struct dpif *dpif, const char *cmask)
>  {
>      struct dp_netdev *dp = get_dp_netdev(dpif);
> +    bool cmask_changed = pmd_cpu_mask_changed(dp, cmask);
> +    struct dp_netdev_port *port;
>  
> -    if (pmd_config_changed(dp, cmask)) {
> -        struct dp_netdev_port *port;
> +    if (cmask_changed || pmd_n_rxq_changed(dp)) {
> +        if (cmask_changed) {
> +            dp_netdev_destroy_all_pmds(dp);
> +        } else {
> +            struct dp_netdev_pmd_thread *pmd;
>  
> -        dp_netdev_destroy_all_pmds(dp);
> +            CMAP_FOR_EACH (pmd, node, &dp->poll_threads) {
> +                dp_netdev_pmd_clear_poll_list(pmd);
> +                dp_netdev_reload_pmd__(pmd);
> +            }
> +        }
>  
>          CMAP_FOR_EACH (port, node, &dp->ports) {
>              struct netdev *netdev = port->netdev;
> @@ -2439,15 +2452,24 @@ dpif_netdev_pmd_set(struct dpif *dpif, const char *cmask)
>                  }
>              }
>          }
> -        /* Reconfigures the cpu mask. */
> -        ovs_numa_set_cpu_mask(cmask);
> -        free(dp->pmd_cmask);
> -        dp->pmd_cmask = cmask ? xstrdup(cmask) : NULL;
> -
> -        /* Restores the non-pmd. */
> -        dp_netdev_set_nonpmd(dp);
> -        /* Restores all pmd threads. */
> -        dp_netdev_reset_pmd_threads(dp);
> +
> +        if (cmask_changed) {
> +            /* Reconfigures the cpu mask. */
> +            ovs_numa_set_cpu_mask(cmask);
> +            free(dp->pmd_cmask);
> +            dp->pmd_cmask = cmask ? xstrdup(cmask) : NULL;
> +
> +            /* Restores the non-pmd. */
> +            dp_netdev_set_nonpmd(dp);
> +            /* Restores all pmd threads. */
> +            dp_netdev_reset_pmd_threads(dp);
> +        } else {
> +            CMAP_FOR_EACH (port, node, &dp->ports) {
> +                if (netdev_is_pmd(port->netdev)) {
> +                    dp_netdev_add_port_to_pmds(dp, port);
> +                }
> +            }
> +        }
>      }
>  
>      return 0;

Acked-by: Flavio Leitner <fbl at sysclose.org>

-- 
fbl




More information about the dev mailing list