[ovs-dev] [PATCH v3 2/2] netdev-dpdk: Add debug appctl to get mempool information.
Kavanagh, Mark B
mark.b.kavanagh at intel.com
Fri Dec 8 16:36:12 UTC 2017
>From: Ilya Maximets [mailto:i.maximets at samsung.com]
>Sent: Friday, December 8, 2017 3:38 PM
>To: ovs-dev at openvswitch.org
>Cc: Heetae Ahn <heetae82.ahn at samsung.com>; Fischetti, Antonio
><antonio.fischetti at intel.com>; Loftus, Ciara <ciara.loftus at intel.com>;
>Kavanagh, Mark B <mark.b.kavanagh at intel.com>; Stokes, Ian
><ian.stokes at intel.com>; Wojciechowicz, RobertX
><robertx.wojciechowicz at intel.com>; Flavio Leitner <fbl at redhat.com>; Ilya
>Maximets <i.maximets at samsung.com>
>Subject: [PATCH v3 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 <i.maximets at samsung.com>
>Acked-by: Antonio Fischetti <antonio.fischetti at intel.com>
Hey Ilya,
This is a really useful patch. When testing, I found the most helpful metrics to be the stats that are enabled when DPDK is built with CONFIG_RTE_LIBRTE_MEMPOOL_DEBUG=y.
It might be a good idea to mention this somewhere in the documentation - thoughts?
Other than that, LGTM:
Tested-by: Mark Kavanagh <mark.b.kavanagh at intel.com>
Acked-by: Mark Kavanagh <mark.b.kavanagh at intel.com>
Cheers,
Mark
>---
> 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
More information about the dev
mailing list