Ping.

Bets regards, Ilya Maximets.

On 24.02.2016 15:47, Ilya Maximets 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.maxim...@samsung.com>
> Acked-by: Flavio Leitner <f...@sysclose.org>
> ---
> 
> version 2:
>       * Reduced indentation level in dpif_netdev_pmd_set().
> 
>  lib/dpif-netdev.c | 100 
> +++++++++++++++++++++++++++++++++---------------------
>  1 file changed, 62 insertions(+), 38 deletions(-)
> 
> diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
> index 500e7cc..8ffff90 100644
> --- a/lib/dpif-netdev.c
> +++ b/lib/dpif-netdev.c
> @@ -2411,27 +2411,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. */
> @@ -2439,44 +2443,58 @@ 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)) {
> +        return 0;
> +    }
>  
> +    if (cmask_changed) {
>          dp_netdev_destroy_all_pmds(dp);
> +    } else {
> +        struct dp_netdev_pmd_thread *pmd;
>  
> -        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(port->netdev)
> -                && port->latest_requested_n_rxq != requested_n_rxq) {
> -                int i, err;
> +        CMAP_FOR_EACH (pmd, node, &dp->poll_threads) {
> +            dp_netdev_pmd_clear_poll_list(pmd);
> +            dp_netdev_reload_pmd__(pmd);
> +        }
> +    }
>  
> -                /* Closes the existing 'rxq's. */
> -                for (i = 0; i < netdev_n_rxq(port->netdev); i++) {
> -                    netdev_rxq_close(port->rxq[i]);
> -                    port->rxq[i] = NULL;
> -                }
> +    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(port->netdev)
> +            && port->latest_requested_n_rxq != requested_n_rxq) {
> +            int i, err;
>  
> -                /* Sets the new rx queue config.  */
> -                err = netdev_set_multiq(port->netdev,
> -                                        ovs_numa_get_n_cores() + 1,
> -                                        requested_n_rxq);
> -                if (err && (err != EOPNOTSUPP)) {
> -                    VLOG_ERR("Failed to set dpdk interface %s rx_queue to:"
> -                             " %u", netdev_get_name(port->netdev),
> -                             requested_n_rxq);
> -                    return err;
> -                }
> -                port->latest_requested_n_rxq = requested_n_rxq;
> -                /* If the set_multiq() above succeeds, reopens the 'rxq's. */
> -                port->rxq = xrealloc(port->rxq, sizeof *port->rxq
> -                                     * netdev_n_rxq(port->netdev));
> -                for (i = 0; i < netdev_n_rxq(port->netdev); i++) {
> -                    netdev_rxq_open(port->netdev, &port->rxq[i], i);
> -                }
> +            /* Closes the existing 'rxq's. */
> +            for (i = 0; i < netdev_n_rxq(port->netdev); i++) {
> +                netdev_rxq_close(port->rxq[i]);
> +                port->rxq[i] = NULL;
> +            }
> +
> +            /* Sets the new rx queue config.  */
> +            err = netdev_set_multiq(port->netdev,
> +                                    ovs_numa_get_n_cores() + 1,
> +                                    requested_n_rxq);
> +            if (err && (err != EOPNOTSUPP)) {
> +                VLOG_ERR("Failed to set dpdk interface %s rx_queue to:"
> +                         " %u", netdev_get_name(port->netdev),
> +                         requested_n_rxq);
> +                return err;
> +            }
> +            port->latest_requested_n_rxq = requested_n_rxq;
> +            /* If the set_multiq() above succeeds, reopens the 'rxq's. */
> +            port->rxq = xrealloc(port->rxq, sizeof *port->rxq
> +                                 * netdev_n_rxq(port->netdev));
> +            for (i = 0; i < netdev_n_rxq(port->netdev); i++) {
> +                netdev_rxq_open(port->netdev, &port->rxq[i], i);
>              }
>          }
> +    }
> +
> +    if (cmask_changed) {
>          /* Reconfigures the cpu mask. */
>          ovs_numa_set_cpu_mask(cmask);
>          free(dp->pmd_cmask);
> @@ -2486,6 +2504,12 @@ dpif_netdev_pmd_set(struct dpif *dpif, const char 
> *cmask)
>          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;
> 
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to