On Fri, Dec 08, 2017 at 06:38:11PM +0300, Ilya Maximets wrote: > New appctl 'netdev-dpdk/get-mempool-info' implemented to get result > of 'rte_mempool_list_dump()' function if no arguments passed and > 'rte_mempool_dump()' if DPDK netdev passed as argument. > > Could be used for debugging mbuf leaks and other mempool related > issues. Most useful in pair with `grep -v "cache_count.*=0"`. > > Signed-off-by: Ilya Maximets <i.maxim...@samsung.com> > Acked-by: Antonio Fischetti <antonio.fische...@intel.com> > --- > NEWS | 1 + > lib/netdev-dpdk-unixctl.man | 4 ++++ > lib/netdev-dpdk.c | 54 > +++++++++++++++++++++++++++++++++++++++++++++ > 3 files changed, 59 insertions(+) > > diff --git a/NEWS b/NEWS > index e9fb279..5e13038 100644 > --- a/NEWS > +++ b/NEWS > @@ -16,6 +16,7 @@ Post-v2.8.0 > - "flush-conntrack" in ovs-dpctl and ovs-appctl now accept a 5-tuple to > delete a specific connection tracking entry. > - DPDK: > + * New debug appctl command 'netdev-dpdk/get-mempool-info'. > * All the netdev-dpdk appctl commands described in ovs-vswitchd man > page. > > v2.8.0 - 31 Aug 2017 > diff --git a/lib/netdev-dpdk-unixctl.man b/lib/netdev-dpdk-unixctl.man > index a4b7f60..73b2e10 100644 > --- a/lib/netdev-dpdk-unixctl.man > +++ b/lib/netdev-dpdk-unixctl.man > @@ -7,3 +7,7 @@ to \fIstate\fR. \fIstate\fR can be "up" or "down". > Detaches device with corresponding \fIpci-address\fR from DPDK. This command > can be used to detach device if it wasn't detached automatically after port > deletion. Refer to the documentation for details and instructions. > +.IP "\fBnetdev-dpdk/get-mempool-info\fR [\fIinterface\fR]" > +Prints the debug information about memory pool used by DPDK \fIinterface\fR. > +If called without arguments, information of all the available mempools will > +be printed. > diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c > index faff842..26c8e94 100644 > --- a/lib/netdev-dpdk.c > +++ b/lib/netdev-dpdk.c > @@ -2560,6 +2560,56 @@ error: > free(response); > } > > +static void > +netdev_dpdk_get_mempool_info(struct unixctl_conn *conn, > + int argc, const char *argv[], > + void *aux OVS_UNUSED) > +{ > + size_t size; > + FILE *stream; > + char *response = NULL; > + struct netdev *netdev = NULL; > + > + if (argc == 2) { > + netdev = netdev_from_name(argv[1]); > + if (!netdev || !is_dpdk_class(netdev->netdev_class)) { > + unixctl_command_reply_error(conn, "Not a DPDK Interface"); > + goto out; > + } > + } > + > + stream = open_memstream(&response, &size); > + if (!stream) { > + response = xasprintf("Unable to open memstream: %s.", > + ovs_strerror(errno)); > + unixctl_command_reply_error(conn, response); > + goto out; > + } > + > + if (netdev) { > + struct netdev_dpdk *dev = netdev_dpdk_cast(netdev); > + > + ovs_mutex_lock(&dev->mutex); > + ovs_mutex_lock(&dpdk_mp_mutex); > + > + rte_mempool_dump(stream, dev->mp); > + > + ovs_mutex_unlock(&dpdk_mp_mutex); > + ovs_mutex_unlock(&dev->mutex); > + } else { > + ovs_mutex_lock(&dpdk_mp_mutex); > + rte_mempool_list_dump(stream); > + ovs_mutex_unlock(&dpdk_mp_mutex); > + } > + > + fclose(stream); > + > + unixctl_command_reply(conn, response); > +out: > + free(response); > + netdev_close(netdev); > +} > + > /* > * Set virtqueue flags so that we do not receive interrupts. > */ > @@ -2816,6 +2866,10 @@ netdev_dpdk_class_init(void) > "pci address of device", 1, 1, > netdev_dpdk_detach, NULL); > > + unixctl_command_register("netdev-dpdk/get-mempool-info", > + "[netdev]", 0, 1, > + netdev_dpdk_get_mempool_info, NULL); > + > ovsthread_once_done(&once); > } > > -- > 2.7.4 > LGTM Acked-by: Flavio Leitner <f...@redhat.com>
-- Flavio _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev