Message ID | 1512998323-24924-3-git-send-email-i.maximets@samsung.com |
---|---|
State | Accepted |
Delegated to: | Ian Stokes |
Headers | show |
Series | netdev-dpdk: Mempool creation failure + Appctl | expand |
>From: Ilya Maximets [mailto:i.maximets@samsung.com] >Sent: Monday, December 11, 2017 1:19 PM >To: ovs-dev@openvswitch.org >Cc: Heetae Ahn <heetae82.ahn@samsung.com>; Fischetti, Antonio ><antonio.fischetti@intel.com>; Loftus, Ciara <ciara.loftus@intel.com>; >Kavanagh, Mark B <mark.b.kavanagh@intel.com>; Stokes, Ian ><ian.stokes@intel.com>; Wojciechowicz, RobertX ><robertx.wojciechowicz@intel.com>; Flavio Leitner <fbl@redhat.com>; Ilya >Maximets <i.maximets@samsung.com> >Subject: [PATCH v4 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@samsung.com> >--- > NEWS | 1 + > lib/netdev-dpdk-unixctl.man | 5 +++++ > lib/netdev-dpdk.c | 54 >+++++++++++++++++++++++++++++++++++++++++++++ > 3 files changed, 60 insertions(+) > >diff --git a/NEWS b/NEWS >index 69d5dab..e60514e 100644 >--- a/NEWS >+++ b/NEWS >@@ -18,6 +18,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 >diff --git a/lib/netdev-dpdk-unixctl.man b/lib/netdev-dpdk-unixctl.man >index 5af6eca..ac274cd 100644 >--- a/lib/netdev-dpdk-unixctl.man >+++ b/lib/netdev-dpdk-unixctl.man >@@ -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. Hi Ilya, I would still prefer if the pointer to documentation were more specific; however, I won't block on that basis alone. Acked-by: Mark Kavanagh <mark.b.kavanagh@intel.com> Tested-by: Mark Kavanagh <mark.b.kavanagh@intel.com> Thanks for the series, Mark >+.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. >diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c >index 8f22264..3bf461b 100644 >--- a/lib/netdev-dpdk.c >+++ b/lib/netdev-dpdk.c >@@ -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); > } > >-- >2.7.4
Still LGTM, please add Acked-by: Antonio Fischetti <antonio.fischetti@intel.com> > -----Original Message----- > From: Kavanagh, Mark B > Sent: Monday, December 11, 2017 4:37 PM > To: Ilya Maximets <i.maximets@samsung.com>; ovs-dev@openvswitch.org > Cc: Heetae Ahn <heetae82.ahn@samsung.com>; Fischetti, Antonio > <antonio.fischetti@intel.com>; Loftus, Ciara <ciara.loftus@intel.com>; > Stokes, Ian <ian.stokes@intel.com>; Wojciechowicz, RobertX > <robertx.wojciechowicz@intel.com>; Flavio Leitner <fbl@redhat.com> > Subject: RE: [PATCH v4 2/2] netdev-dpdk: Add debug appctl to get mempool > information. > > >From: Ilya Maximets [mailto:i.maximets@samsung.com] > >Sent: Monday, December 11, 2017 1:19 PM > >To: ovs-dev@openvswitch.org > >Cc: Heetae Ahn <heetae82.ahn@samsung.com>; Fischetti, Antonio > ><antonio.fischetti@intel.com>; Loftus, Ciara <ciara.loftus@intel.com>; > >Kavanagh, Mark B <mark.b.kavanagh@intel.com>; Stokes, Ian > ><ian.stokes@intel.com>; Wojciechowicz, RobertX > ><robertx.wojciechowicz@intel.com>; Flavio Leitner <fbl@redhat.com>; > Ilya > >Maximets <i.maximets@samsung.com> > >Subject: [PATCH v4 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@samsung.com> > >--- > > NEWS | 1 + > > lib/netdev-dpdk-unixctl.man | 5 +++++ > > lib/netdev-dpdk.c | 54 > >+++++++++++++++++++++++++++++++++++++++++++++ > > 3 files changed, 60 insertions(+) > > > >diff --git a/NEWS b/NEWS > >index 69d5dab..e60514e 100644 > >--- a/NEWS > >+++ b/NEWS > >@@ -18,6 +18,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 > >diff --git a/lib/netdev-dpdk-unixctl.man b/lib/netdev-dpdk-unixctl.man > >index 5af6eca..ac274cd 100644 > >--- a/lib/netdev-dpdk-unixctl.man > >+++ b/lib/netdev-dpdk-unixctl.man > >@@ -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. > > Hi Ilya, > > I would still prefer if the pointer to documentation were more specific; > however, I won't block on that basis alone. > > Acked-by: Mark Kavanagh <mark.b.kavanagh@intel.com> > Tested-by: Mark Kavanagh <mark.b.kavanagh@intel.com> > > Thanks for the series, > Mark > > >+.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. > >diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c > >index 8f22264..3bf461b 100644 > >--- a/lib/netdev-dpdk.c > >+++ b/lib/netdev-dpdk.c > >@@ -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); > > } > > > >-- > >2.7.4
On Mon, Dec 11, 2017 at 04:18:43PM +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@samsung.com> > --- Acked-by: Flavio Leitner <fbl@redhat.com>
diff --git a/NEWS b/NEWS index 69d5dab..e60514e 100644 --- a/NEWS +++ b/NEWS @@ -18,6 +18,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 diff --git a/lib/netdev-dpdk-unixctl.man b/lib/netdev-dpdk-unixctl.man index 5af6eca..ac274cd 100644 --- a/lib/netdev-dpdk-unixctl.man +++ b/lib/netdev-dpdk-unixctl.man @@ -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. diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c index 8f22264..3bf461b 100644 --- a/lib/netdev-dpdk.c +++ b/lib/netdev-dpdk.c @@ -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); }
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> --- NEWS | 1 + lib/netdev-dpdk-unixctl.man | 5 +++++ lib/netdev-dpdk.c | 54 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 60 insertions(+)