mirror of
https://github.com/openvswitch/ovs
synced 2025-08-31 14:25:26 +00:00
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@samsung.com> Acked-by: Mark Kavanagh <mark.b.kavanagh@intel.com> Tested-by: Mark Kavanagh <mark.b.kavanagh@intel.com> Acked-by: Antonio Fischetti <antonio.fischetti@intel.com> Acked-by: Flavio Leitner <fbl@redhat.com> Signed-off-by: Ian Stokes <ian.stokes@intel.com>
This commit is contained in:
committed by
Ian Stokes
parent
40f185ac70
commit
be48173310
1
NEWS
1
NEWS
@@ -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
|
||||
|
@@ -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.
|
||||
|
@@ -2586,6 +2586,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.
|
||||
*/
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user