Skip to content

Commit

Permalink
netdev-dpdk: Add debug appctl to get mempool information.
Browse files Browse the repository at this point in the history
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]>
Acked-by: Mark Kavanagh <[email protected]>
Tested-by: Mark Kavanagh <[email protected]>
Acked-by: Antonio Fischetti <[email protected]>
Acked-by: Flavio Leitner <[email protected]>
Signed-off-by: Ian Stokes <[email protected]>
  • Loading branch information
igsilya authored and istokes committed Dec 20, 2017
1 parent 40f185a commit be48173
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 0 deletions.
1 change: 1 addition & 0 deletions NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ Post-v2.8.0
- DPDK:
* Add support for DPDK v17.11
* Add support for vHost IOMMU
* 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
Expand Down
5 changes: 5 additions & 0 deletions lib/netdev-dpdk-unixctl.man
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,8 @@ If \fIinterface\fR is not specified, then it applies to all DPDK ports.
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. For additional mempool statistics enable
\fBCONFIG_RTE_LIBRTE_MEMPOOL_DEBUG\fR while building DPDK.
54 changes: 54 additions & 0 deletions lib/netdev-dpdk.c
Original file line number Diff line number Diff line change
Expand Up @@ -2586,6 +2586,56 @@ netdev_dpdk_detach(struct unixctl_conn *conn, int argc OVS_UNUSED,
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.
*/
Expand Down Expand Up @@ -2842,6 +2892,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);
}

Expand Down

0 comments on commit be48173

Please sign in to comment.