Hey Pravin, Thx for the review, please see my comments below,
> + if (poller_id != f.poller_id) { > > + if (f.poller_id == NON_PMD_CORE_ID) { > > + ds_put_format(&ds, "flow-dump from non-dpdk > interfaces:\n"); > > + } else { > > + ds_put_format(&ds, "flow-dump from pmd on cpu core: > %d\n", > > + f.poller_id); > > + } > > + poller_id = f.poller_id; > > + } > > + > > You have introduced new 'poller' term. It is right term here but we > already have pmd used in same context. I would like to use same rather > than introducing another name for same. > > Sure, I'll just use the term 'pmd_id' everywhere. > + > > + numa_id = netdev_get_numa_id(in_port_netdev); > > + if (ovs_numa_numa_id_is_valid(numa_id)) { > > + unsigned long *bm; > > + int n_cores = ovs_numa_get_n_cores(); > > + int idx; > > + > > + bm = bitmap_allocate(n_cores); > > + ovs_numa_get_pinned_cores_on_numa(numa_id, bm); > > + > > + BITMAP_FOR_EACH_1 (idx, n_cores, bm) { > > Rather than exporting ovs_numa_get_pinned_cores_on_numa() API, we can > export > iterator API for_each_cpu_on_numa() that ierates cpu from given NUMA node. > This is a bit tricky, since 'struct numa' and 'struct core' are not visible from outside the module. I'm planning to add these two structs for exposing core_id, numa_id pairs: struct ovs_numa_dump { struct list dump; }; struct ovs_numa_info { struct list list_node; int numa_id; int core_id; }; And provide the corresponding dump functions. > > int error = 0; > > > > - netdev_flow = dp_netdev_find_flow(dp, get->ufid, get->key, > get->key_len); > > + /* Each call must provide valid poller_id. */ > > + if (!ovs_numa_core_id_is_valid(poller_id)) { > > + return EINVAL; > > + } > > + > do we really need to check ovs_numa_core_id_is_valid()? > dp_netdev_get_pmd() will fail if it is invalid core anyways. > Thanks for pointing it out, I'll remove the check, > > > > +static void > > +clear_stats(struct dp_netdev_flow *netdev_flow) > > +{ > > + memset(&netdev_flow->stats, 0, sizeof netdev_flow->stats); > > +} > > + > I guess this can be inlined. done > > dp_netdev_get_pmd(struct dp_netdev *dp, int core_id) > > { > > @@ -2454,10 +2499,12 @@ dp_netdev_get_pmd(struct dp_netdev *dp, int > core_id) > > const struct cmap_node *pnode; > > > > pnode = cmap_find(&dp->poll_threads, hash_int(core_id, 0)); > > - ovs_assert(pnode); > > + if (!pnode) { > > + return NULL; > > + } > > pmd = CONTAINER_OF(pnode, struct dp_netdev_pmd_thread, node); > > > > - return pmd; > > + return dp_netdev_pmd_try_ref(pmd) ? pmd : NULL; > > } > Since pnode is already checked for NULL, is it even possible to return > false there? > Yes, main thread could be removing the pmd thread while other threads are executing between these lines. Also after giving it a second thought, I think the dp_netdev_pmd_unref() can not directly destroy the 'pmd' when ref_count reaches zero, since the other threads may trying to count the 'pmd->ref_count' at same time. So, I'll use ovsrcu_postpone() to delay the destroy. > > > > > /* Sets the 'struct dp_netdev_pmd_thread' for non-pmd threads. */ > > @@ -2471,6 +2518,53 @@ dp_netdev_set_nonpmd(struct dp_netdev *dp) > > OVS_NUMA_UNSPEC); > > } > > > > +static bool > > +dp_netdev_pmd_try_ref(struct dp_netdev_pmd_thread *pmd) > > +{ > > + if (pmd) { > > + return ovs_refcount_try_ref_rcu(&pmd->ref_cnt); > > + } > > + > We can just drop this check since all callers make sure that they have > valid pmd pointer Yes, I'll drop it and add a comment. _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev