Thanks Ilya, looks a useful debugging command, I gave it a try. Agree with Raymond, there should be some reference in the doc somewhere. Beside that LGTM.
Acked-by: Antonio Fischetti <[email protected]> > -----Original Message----- > From: Ilya Maximets [mailto:[email protected]] > Sent: Tuesday, October 31, 2017 11:35 AM > To: [email protected] > Cc: Heetae Ahn <[email protected]>; Fischetti, Antonio > <[email protected]>; Loftus, Ciara <[email protected]>; > Kavanagh, Mark B <[email protected]>; Stokes, Ian > <[email protected]>; Wojciechowicz, RobertX > <[email protected]>; Ilya Maximets <[email protected]> > Subject: [PATCH 2/2] netdev-dpdk: Add debug appctl to get mempool information. > > 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 <[email protected]> > --- > lib/netdev-dpdk.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 54 insertions(+) > > diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c > index 4ec536d..0e4a08c 100644 > --- a/lib/netdev-dpdk.c > +++ b/lib/netdev-dpdk.c > @@ -2550,6 +2550,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. > */ > @@ -2806,6 +2856,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 _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
