[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