[ovs-dev] [PATCH 2/3] dpif-netdev: Move rxq management into functions.

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


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

> Signed-off-by: Ilya Maximets <i.maximets at samsung.com>
> ---
>  lib/dpif-netdev.c | 163 +++++++++++++++++++++++++++++++++++-------------------
>  1 file changed, 105 insertions(+), 58 deletions(-)
> 
> diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
> index c477f2b..e62f5f6 100644
> --- a/lib/dpif-netdev.c
> +++ b/lib/dpif-netdev.c
> @@ -497,6 +497,13 @@ dp_netdev_pmd_get_next(struct dp_netdev *dp, struct cmap_position *pos);
>  static void dp_netdev_destroy_all_pmds(struct dp_netdev *dp);
>  static void dp_netdev_del_pmds_on_numa(struct dp_netdev *dp, int numa_id);
>  static void dp_netdev_set_pmds_on_numa(struct dp_netdev *dp, int numa_id);
> +static void dp_netdev_pmd_clear_poll_list(struct dp_netdev_pmd_thread *pmd);
> +static void dp_netdev_del_port_from_pmd(struct dp_netdev_port *port,
> +                                        struct dp_netdev_pmd_thread *pmd);
> +static void dp_netdev_del_port_from_all_pmds(struct dp_netdev *dp,
> +                                             struct dp_netdev_port *port);
> +static void
> +dp_netdev_add_port_to_pmds(struct dp_netdev *dp, struct dp_netdev_port *port);
>  static void
>  dp_netdev_add_rxq_to_pmd(struct dp_netdev_pmd_thread *pmd,
>                           struct dp_netdev_port *port, struct netdev_rxq *rx);
> @@ -1138,35 +1145,7 @@ do_add_port(struct dp_netdev *dp, const char *devname, const char *type,
>      cmap_insert(&dp->ports, &port->node, hash_port_no(port_no));
>  
>      if (netdev_is_pmd(netdev)) {
> -        int numa_id = netdev_get_numa_id(netdev);
> -        struct dp_netdev_pmd_thread *pmd;
> -        struct hmapx to_reload;
> -        struct hmapx_node *node;
> -
> -        hmapx_init(&to_reload);
> -        /* Cannot create pmd threads for invalid numa node. */
> -        ovs_assert(ovs_numa_numa_id_is_valid(numa_id));
> -
> -        for (i = 0; i < netdev_n_rxq(netdev); i++) {
> -            pmd = dp_netdev_less_loaded_pmd_on_numa(dp, numa_id);
> -            if (!pmd) {
> -                /* There is no pmd threads on this numa node. */
> -                dp_netdev_set_pmds_on_numa(dp, numa_id);
> -                /* Assigning of rx queues done. */
> -                break;
> -            }
> -
> -            ovs_mutex_lock(&pmd->poll_mutex);
> -            dp_netdev_add_rxq_to_pmd(pmd, port, port->rxq[i]);
> -            ovs_mutex_unlock(&pmd->poll_mutex);
> -
> -            hmapx_add(&to_reload, pmd);
> -        }
> -        HMAPX_FOR_EACH (node, &to_reload) {
> -            pmd = (struct dp_netdev_pmd_thread *)node->data;
> -            dp_netdev_reload_pmd__(pmd);
> -        }
> -        hmapx_destroy(&to_reload);
> +        dp_netdev_add_port_to_pmds(dp, port);
>      }
>      seq_change(dp->port_seq);
>  
> @@ -1354,29 +1333,7 @@ do_del_port(struct dp_netdev *dp, struct dp_netdev_port *port)
>          if (!has_pmd_port_for_numa(dp, numa_id)) {
>              dp_netdev_del_pmds_on_numa(dp, numa_id);
>          } else {
> -            struct dp_netdev_pmd_thread *pmd;
> -            struct rxq_poll *poll, *next;
> -
> -            CMAP_FOR_EACH (pmd, node, &dp->poll_threads) {
> -                if (pmd->numa_id == numa_id) {
> -                    bool found = false;
> -
> -                    ovs_mutex_lock(&pmd->poll_mutex);
> -                    LIST_FOR_EACH_SAFE (poll, next, node, &pmd->poll_list) {
> -                        if (poll->port == port) {
> -                            found = true;
> -                            port_unref(poll->port);
> -                            list_remove(&poll->node);
> -                            pmd->poll_cnt--;
> -                            free(poll);
> -                        }
> -                    }
> -                    ovs_mutex_unlock(&pmd->poll_mutex);
> -                    if (found) {
> -                        dp_netdev_reload_pmd__(pmd);
> -                    }
> -                }
> -            }
> +            dp_netdev_del_port_from_all_pmds(dp, port);
>          }
>      }
>  
> @@ -2897,8 +2854,6 @@ dp_netdev_destroy_pmd(struct dp_netdev_pmd_thread *pmd)
>  static void
>  dp_netdev_del_pmd(struct dp_netdev *dp, struct dp_netdev_pmd_thread *pmd)
>  {
> -    struct rxq_poll *poll;
> -
>      /* Uninit the 'flow_cache' since there is
>       * no actual thread uninit it for NON_PMD_CORE_ID. */
>      if (pmd->core_id == NON_PMD_CORE_ID) {
> @@ -2911,10 +2866,7 @@ dp_netdev_del_pmd(struct dp_netdev *dp, struct dp_netdev_pmd_thread *pmd)
>      }
>  
>      /* Unref all ports and free poll_list. */
> -    LIST_FOR_EACH_POP (poll, node, &pmd->poll_list) {
> -        port_unref(poll->port);
> -        free(poll);
> -    }
> +    dp_netdev_pmd_clear_poll_list(pmd);
>  
>      /* Purges the 'pmd''s flows after stopping the thread, but before
>       * destroying the flows, so that the flow stats can be collected. */
> @@ -2997,6 +2949,62 @@ dp_netdev_del_pmds_on_numa(struct dp_netdev *dp, int numa_id)
>      free(free_idx);
>  }
>  
> +/* Deletes all rx queues from pmd->poll_list. */
> +static void
> +dp_netdev_pmd_clear_poll_list(struct dp_netdev_pmd_thread *pmd)
> +{
> +    struct rxq_poll *poll;
> +
> +    ovs_mutex_lock(&pmd->poll_mutex);
> +    LIST_FOR_EACH_POP (poll, node, &pmd->poll_list) {
> +        port_unref(poll->port);
> +        free(poll);
> +    }
> +    pmd->poll_cnt = 0;
> +    ovs_mutex_unlock(&pmd->poll_mutex);
> +}
> +
> +/* Deletes all rx queues of 'port' from poll_list of pmd thread and
> + * reloads it if poll_list was changed. */
> +static void
> +dp_netdev_del_port_from_pmd(struct dp_netdev_port *port,
> +                            struct dp_netdev_pmd_thread *pmd)
> +{
> +    struct rxq_poll *poll, *next;
> +    bool found = false;
> +
> +    ovs_mutex_lock(&pmd->poll_mutex);
> +    LIST_FOR_EACH_SAFE (poll, next, node, &pmd->poll_list) {
> +        if (poll->port == port) {
> +            found = true;
> +            port_unref(poll->port);
> +            list_remove(&poll->node);
> +            pmd->poll_cnt--;
> +            free(poll);
> +        }
> +    }
> +    ovs_mutex_unlock(&pmd->poll_mutex);
> +    if (found) {
> +        dp_netdev_reload_pmd__(pmd);
> +    }
> +}
> +
> +/* Deletes all rx queues of 'port' from all pmd threads of dp and
> + * reloads them if needed. */
> +static void
> +dp_netdev_del_port_from_all_pmds(struct dp_netdev *dp,
> +                                 struct dp_netdev_port *port)
> +{
> +    int numa_id = netdev_get_numa_id(port->netdev);
> +    struct dp_netdev_pmd_thread *pmd;
> +
> +    CMAP_FOR_EACH (pmd, node, &dp->poll_threads) {
> +        if (pmd->numa_id == numa_id) {
> +            dp_netdev_del_port_from_pmd(port, pmd);
> +       }
> +    }
> +}
> +
>  /* Returns PMD thread from this numa node with fewer rx queues to poll.
>   * Returns NULL if there is no PMD threads on this numa node.
>   * Can be called safely only by main thread. */
> @@ -3033,6 +3041,45 @@ dp_netdev_add_rxq_to_pmd(struct dp_netdev_pmd_thread *pmd,
>      pmd->poll_cnt++;
>  }
>  
> +/* Distribute all rx queues of port between all PMD threads and reloads
> + * them if needed. */
> +static void
> +dp_netdev_add_port_to_pmds(struct dp_netdev *dp, struct dp_netdev_port *port)
> +{
> +    int numa_id = netdev_get_numa_id(port->netdev);
> +    struct dp_netdev_pmd_thread *pmd;
> +    struct hmapx to_reload;
> +    struct hmapx_node *node;
> +    int i;
> +
> +    hmapx_init(&to_reload);
> +    /* Cannot create pmd threads for invalid numa node. */
> +    ovs_assert(ovs_numa_numa_id_is_valid(numa_id));
> +
> +    for (i = 0; i < netdev_n_rxq(port->netdev); i++) {
> +        pmd = dp_netdev_less_loaded_pmd_on_numa(dp, numa_id);
> +        if (!pmd) {
> +            /* There is no pmd threads on this numa node. */
> +            dp_netdev_set_pmds_on_numa(dp, numa_id);
> +            /* Assigning of rx queues done. */
> +            break;
> +        }
> +
> +        ovs_mutex_lock(&pmd->poll_mutex);
> +        dp_netdev_add_rxq_to_pmd(pmd, port, port->rxq[i]);
> +        ovs_mutex_unlock(&pmd->poll_mutex);
> +
> +        hmapx_add(&to_reload, pmd);
> +    }
> +
> +    HMAPX_FOR_EACH (node, &to_reload) {
> +        pmd = (struct dp_netdev_pmd_thread *)node->data;
> +        dp_netdev_reload_pmd__(pmd);
> +    }
> +
> +    hmapx_destroy(&to_reload);
> +}
> +
>  /* Checks the numa node id of 'netdev' and starts pmd threads for
>   * the numa node. */
>  static void

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

-- 
fbl




More information about the dev mailing list