On Fri, Nov 08, 2019 at 03:23:44PM +0000, Emma Finn wrote: > Add an ovs-appctl command to iterate through the dpcls > and for each subtable output the miniflow bits for any > existing table. > > $ ovs-appctl dpif-netdev/subatable-show > pmd thread numa_id 0 > dpcls port 2: > subtable: > unit_0: 4 (0x4) > unit_1: 2 (0x2) > pmd thread numa_id 1 > dpcls port 3: > subtable: > unit_0: 4 (0x3) > unit_1: 2 (0x5) > > Signed-off-by: Emma Finn <emma.f...@intel.com> > --- > NEWS | 2 ++ > lib/dpif-netdev-unixctl.man | 4 ++++ > lib/dpif-netdev.c | 54 > ++++++++++++++++++++++++++++++++++++++++++++- > 3 files changed, 59 insertions(+), 1 deletion(-) > > diff --git a/NEWS b/NEWS > index 88b8189..c01c100 100644 > --- a/NEWS > +++ b/NEWS > @@ -10,6 +10,8 @@ Post-v2.12.0 > if supported by libbpf. > * Add option to enable, disable and query TCP sequence checking in > conntrack. > + * New "ovs-appctl dpif-netdev/subtable-show" command for userspace > + datapath to show subtable miniflow bits. > > v2.12.0 - 03 Sep 2019 > --------------------- > diff --git a/lib/dpif-netdev-unixctl.man b/lib/dpif-netdev-unixctl.man > index 6c54f6f..c443465 100644 > --- a/lib/dpif-netdev-unixctl.man > +++ b/lib/dpif-netdev-unixctl.man > @@ -217,3 +217,7 @@ with port names, which this thread polls. > . > .IP "\fBdpif-netdev/pmd-rxq-rebalance\fR [\fIdp\fR]" > Reassigns rxqs to pmds in the datapath \fIdp\fR based on their current usage. > +. > +.IP "\fBdpif-netdev/subtable-show\fR [\fB-pmd\fR \fIcore\fR] [\fIdp\fR]" > +For one or all pmd threads of the datapath \fIdp\fR show the list of miniflow > +bits for each subtable in the datapath classifier. > \ No newline at end of file > diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c > index 4720ba1..7ae422e 100644 > --- a/lib/dpif-netdev.c > +++ b/lib/dpif-netdev.c > @@ -857,6 +857,8 @@ static inline bool > pmd_perf_metrics_enabled(const struct dp_netdev_pmd_thread *pmd); > static void queue_netdev_flow_del(struct dp_netdev_pmd_thread *pmd, > struct dp_netdev_flow *flow); > +static void pmd_info_show_subtable(struct ds *reply, > + struct dp_netdev_pmd_thread *pmd); > > static void > emc_cache_init(struct emc_cache *flow_cache) > @@ -979,6 +981,7 @@ enum pmd_info_type { > PMD_INFO_CLEAR_STATS, /* Set the cycles count to 0. */ > PMD_INFO_SHOW_RXQ, /* Show poll lists of pmd threads. */ > PMD_INFO_PERF_SHOW, /* Show pmd performance details. */ > + PMD_INFO_SHOW_SUBTABLE, /* Show subtable miniflow bits. */ > }; > > static void > @@ -1334,6 +1337,8 @@ dpif_netdev_pmd_info(struct unixctl_conn *conn, int > argc, const char *argv[], > pmd_info_show_stats(&reply, pmd); > } else if (type == PMD_INFO_PERF_SHOW) { > pmd_info_show_perf(&reply, pmd, (struct pmd_perf_params *)aux); > + } else if (type == PMD_INFO_SHOW_SUBTABLE) { > + pmd_info_show_subtable(&reply, pmd); > } > } > free(pmd_list); > @@ -1391,7 +1396,8 @@ dpif_netdev_init(void) > { > static enum pmd_info_type show_aux = PMD_INFO_SHOW_STATS, > clear_aux = PMD_INFO_CLEAR_STATS, > - poll_aux = PMD_INFO_SHOW_RXQ; > + poll_aux = PMD_INFO_SHOW_RXQ, > + subtable_aux = PMD_INFO_SHOW_SUBTABLE; > > unixctl_command_register("dpif-netdev/pmd-stats-show", "[-pmd core] > [dp]", > 0, 3, dpif_netdev_pmd_info, > @@ -1416,6 +1422,9 @@ dpif_netdev_init(void) > "[-us usec] [-q qlen]", > 0, 10, pmd_perf_log_set_cmd, > NULL); > + unixctl_command_register("dpif-netdev/subtable-show", "[-pmd core] [dp]", > + 0, 3, dpif_netdev_pmd_info, > + (void *)&subtable_aux); > return 0; > } > > @@ -8036,3 +8045,46 @@ dpcls_lookup(struct dpcls *cls, const struct > netdev_flow_key *keys[], > } > return false; > } > + > +/* Iterate through all dpcls instances and dump out all subtable > + * miniflow bits. */ > +static void > +pmd_info_show_subtable(struct ds *reply, struct dp_netdev_pmd_thread *pmd) > +{ > + if (pmd->core_id != NON_PMD_CORE_ID) { > + struct rxq_poll *list; > + size_t n_rxq; > + struct dpcls *cls; > + struct dpcls_subtable *subtable; > + > + ovs_mutex_lock(&pmd->port_mutex); > + sorted_poll_list(pmd, &list, &n_rxq); > + for (int i = 0; i < n_rxq; i++) { > + struct dp_netdev_rxq *rxq = list[i].rxq; > + odp_port_t in_port = rxq->port->port_no; > + cls = dp_netdev_pmd_lookup_dpcls(pmd, in_port); > + if (!cls) { > + continue; > + } else { > + struct pvector *pvec = &cls->subtables; > + > + PVECTOR_FOR_EACH (subtable, pvec) { > + ds_put_format(reply, "pmd thread numa_id %d " > + "core_id %u: \n", > + pmd->numa_id, pmd->core_id); > + ds_put_format(reply, " dpcls port %d: \n",cls->in_port);
I think the above 2 lines should be placed before the PVECTOR_FOR_EACH (Subtable, pvect) loop? So in the case of multiple subtables, it will print pmd thread numa_id 0 dpcls port 2: subtable: unit_0: 4 (0x4) unit_1: 2 (0x2) subtable: unit_0: 4 (0x4) unit_1: 2 (0x2) subtable: ... I guess you're debugging the performance of packets looked up in multiple subtables? So is it better if you print s.t like this dpcls port 2: subtable: fields: nw_src, nw_dst subtable: fields: pkt_mark, dp_hash subtable: .... So translate the miniflow bitmap to field name. --William > + ds_put_format(reply, " subtable: \n "); > + ds_put_format(reply, > + " unit_0: %d (0x%x)\n" > + " unit_1: %d (0x%x)\n", > + subtable->mf_bits_set_unit0, > + subtable->mf_bits_set_unit0, > + subtable->mf_bits_set_unit1, > + subtable->mf_bits_set_unit1); > + } > + } > + } > + ovs_mutex_unlock(&pmd->port_mutex); > + free(list); > + } > +} > \ No newline at end of file > -- > 2.7.4 > > -------------------------------------------------------------- > Intel Research and Development Ireland Limited > Registered in Ireland > Registered Office: Collinstown Industrial Park, Leixlip, County Kildare > Registered Number: 308263 > > > This e-mail and any attachments may contain confidential material for the sole > use of the intended recipient(s). Any review or distribution by others is > strictly prohibited. If you are not the intended recipient, please contact the > sender and delete all copies. > _______________________________________________ > dev mailing list > d...@openvswitch.org > https://mail.openvswitch.org/mailman/listinfo/ovs-dev _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev