Thanks for the patch and the review! I applied this to master
On 18/02/2016 12:20, "Flavio Leitner" <f...@sysclose.org> wrote: >On Mon, 08 Feb 2016 18:30:30 +0300 >Ilya Maximets <i.maxim...@samsung.com> wrote: > >> Signed-off-by: Ilya Maximets <i.maxim...@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 <f...@sysclose.org> > >-- >fbl > _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev