[ovs-dev] [PATCH v3 2/2] netdev-dpdk: Add debug appctl to get mempool information.

Flavio Leitner fbl at redhat.com
Fri Dec 8 18:35:14 UTC 2017


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.maximets at samsung.com>
> Acked-by: Antonio Fischetti <antonio.fischetti at 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 <fbl at redhat.com>

-- 
Flavio


More information about the dev mailing list