Message ID | 20200622095443.26136-2-Renata.Saiakhova@ekinops.com (mailing list archive) |
---|---|
State | Superseded, archived |
Delegated to: | Ferruh Yigit |
Headers | show |
Series | Memory corruption due to HW rings allocation | expand |
Context | Check | Description |
---|---|---|
ci/iol-testing | success | Testing PASS |
ci/iol-mellanox-Performance | success | Performance Testing PASS |
ci/iol-nxp-Performance | success | Performance Testing PASS |
ci/iol-intel-Performance | success | Performance Testing PASS |
ci/iol-broadcom-Performance | success | Performance Testing PASS |
ci/Intel-compilation | success | Compilation OK |
ci/checkpatch | success | coding style OK |
On 6/22/2020 10:54 AM, Renata Saiakhova wrote: > Free previously allocated memzone for HW rings > > Signed-off-by: Renata Saiakhova <Renata.Saiakhova@ekinops.com> > --- > lib/librte_ethdev/rte_ethdev.c | 30 ++++++++++++++++++++++-- > lib/librte_ethdev/rte_ethdev_driver.h | 20 ++++++++++++++++ > lib/librte_ethdev/rte_ethdev_version.map | 1 + > 3 files changed, 49 insertions(+), 2 deletions(-) > > diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c > index 72aed59a5..ec1da2006 100644 > --- a/lib/librte_ethdev/rte_ethdev.c > +++ b/lib/librte_ethdev/rte_ethdev.c > @@ -4181,6 +4181,10 @@ rte_eth_dev_rx_intr_ctl_q_get_fd(uint16_t port_id, uint16_t queue_id) > return fd; > } > > +#define ETH_DMA_MZONE_NAME(_name, _port_id, _queue_id, _ring_name) \ > + snprintf(_name, sizeof(_name), "eth_p%d_q%d_%s", \ > + _port_id, _queue_id, _ring_name) > + > const struct rte_memzone * > rte_eth_dma_zone_reserve(const struct rte_eth_dev *dev, const char *ring_name, > uint16_t queue_id, size_t size, unsigned align, > @@ -4190,8 +4194,7 @@ rte_eth_dma_zone_reserve(const struct rte_eth_dev *dev, const char *ring_name, > const struct rte_memzone *mz; > int rc; > > - rc = snprintf(z_name, sizeof(z_name), "eth_p%d_q%d_%s", > - dev->data->port_id, queue_id, ring_name); > + rc = ETH_DMA_MZONE_NAME(z_name, dev->data->port_id, queue_id, ring_name); > if (rc >= RTE_MEMZONE_NAMESIZE) { > RTE_ETHDEV_LOG(ERR, "ring name too long\n"); > rte_errno = ENAMETOOLONG; > @@ -4206,6 +4209,29 @@ rte_eth_dma_zone_reserve(const struct rte_eth_dev *dev, const char *ring_name, > RTE_MEMZONE_IOVA_CONTIG, align); > } > > +int > +rte_eth_dma_zone_free(const struct rte_eth_dev *dev, const char *ring_name, > + uint16_t queue_id) > +{ > + char z_name[RTE_MEMZONE_NAMESIZE]; > + const struct rte_memzone *mz; > + int rc = 0; > + > + rc = ETH_DMA_MZONE_NAME(z_name, dev->data->port_id, queue_id, ring_name); > + if (rc >= RTE_MEMZONE_NAMESIZE) { > + RTE_ETHDEV_LOG(ERR, "ring name too long\n"); > + return -ENAMETOOLONG; > + } > + > + mz = rte_memzone_lookup(z_name); > + if (mz) > + rc = rte_memzone_free(mz); > + else > + rc = -EINVAL; > + > + return rc; > +} > + > int > rte_eth_dev_create(struct rte_device *device, const char *name, > size_t priv_data_size, > diff --git a/lib/librte_ethdev/rte_ethdev_driver.h b/lib/librte_ethdev/rte_ethdev_driver.h > index 99d4cd6cd..462e765d1 100644 > --- a/lib/librte_ethdev/rte_ethdev_driver.h > +++ b/lib/librte_ethdev/rte_ethdev_driver.h > @@ -180,6 +180,26 @@ rte_eth_dma_zone_reserve(const struct rte_eth_dev *eth_dev, const char *name, > uint16_t queue_id, size_t size, > unsigned align, int socket_id); > > +/** > + * @warning > + * @b EXPERIMENTAL: this API may change without prior notice. > + * > + * Free previously allocated memzone for HW rings. > + * > + * @param eth_dev > + * The *eth_dev* pointer is the address of the *rte_eth_dev* structure > + * @param name > + * The name of the memory zone > + * @param queue_id > + * The index of the queue to add to name > + * @return > + * Negative errno value on error, 0 on success. > + */ > +__rte_experimental > +int > +rte_eth_dma_zone_free(const struct rte_eth_dev *dev, const char *ring_name, > + uint16_t queue_id); > + Hi Renata, This API is not for applications, only for drivers, right? We recently (last release ?) introduced 'internal' (__rte_internal) attribute, we can use '__rte_internal' instead of '__rte_experimental' if the API is not for applications. This requires adding 'INTERNAL' block in .map file (sample 'lib/librte_eal/rte_eal_version.map') Also there are a few contribution conventions related issues which can be fixed while merging but please check them if you will be doing new version: subsystem is only libname without prefix: 'ethdev' Commit title description starts with lowercase: 'introduce'. sample => "ethdev: add function to release HW rings" Thanks, ferruh
On 6/22/2020 10:54 AM, Renata Saiakhova wrote: > Free previously allocated memzone for HW rings > > Signed-off-by: Renata Saiakhova <Renata.Saiakhova@ekinops.com> <...> > +/** > + * @warning > + * @b EXPERIMENTAL: this API may change without prior notice. > + * > + * Free previously allocated memzone for HW rings. > + * > + * @param eth_dev > + * The *eth_dev* pointer is the address of the *rte_eth_dev* structure > + * @param name > + * The name of the memory zone > + * @param queue_id > + * The index of the queue to add to name The param names for doxygen and actual param names are not same, causing doxygen warning. "@param eth_dev" -> 'dev' "@param name" -> 'ring_name' > + * @return > + * Negative errno value on error, 0 on success. > + */ > +__rte_experimental > +int > +rte_eth_dma_zone_free(const struct rte_eth_dev *dev, const char *ring_name, > + uint16_t queue_id); > +
Hi Ferruh, I added an INTERNAL block in .map file, that gives me an error: Build targets in project: 806 Found ninja-1.8.2 at /usr/bin/ninja [7/627] Linking target lib/librte_ethdev.so.20.0.3. FAILED: lib/librte_ethdev.so.20.0.3 ccache cc -o lib/librte_ethdev.so.20.0.3 'lib/lib@@rte_ethdev@sta/librte_ethdev_ethdev_private.c.o' 'lib/lib@@rte_ethdev@sta/librte_ethdev_ethdev_profile.c.o' 'lib/lib@@rte_ethdev@sta/librte_ethdev_ethdev_trace_points.c.o' 'lib/lib@@rte_ethdev@sta/librte_ethdev_rte_class_eth.c.o' 'lib/lib@@rte_ethdev@sta/librte_ethdev_rte_ethdev.c.o' 'lib/lib@@rte_ethdev@sta/librte_ethdev_rte_flow.c.o' 'lib/lib@@rte_ethdev@sta/librte_ethdev_rte_mtr.c.o' 'lib/lib@@rte_ethdev@sta/librte_ethdev_rte_tm.c.o' -Wl,--no-undefined -Wl,--as-needed -Wl,-O1 -shared -fPIC -Wl,--start-group -Wl,-soname,librte_ethdev.so.20.0 -Wl,--no-as-needed -pthread -lm -ldl -lnuma lib/librte_eal.so.20.0.3 lib/librte_kvargs.so.20.0.3 lib/librte_telemetry.so.0.200.3 lib/librte_net.so.20.0.3 lib/librte_mbuf.so.20.0.3 lib/librte_mempool.so.20.0.3 lib/librte_ring.so.20.0.3 lib/librte_meter.so.20.0.3 -Wl,--end-group -Wl,--version-script=/home/renata/work/dpdk/lib/librte_ethdev/rte_ethdev_version.map '-Wl,-rpath,$ORIGIN/' -Wl,-rpath-link,/home/renata/work/dpdk/build/lib /usr/bin/ld:/home/renata/work/dpdk/lib/librte_ethdev/rte_ethdev_version.map:0: syntax error in VERSION script collect2: error: ld returned 1 exit status What could be an issue, is that I need to correct the version somewhere? KR, Renata
On 6/23/2020 10:11 AM, Renata Saiakhova wrote: > Hi Ferruh, > > I added an INTERNAL block in .map file, that gives me an error: > > Build targets in project: 806 > Found ninja-1.8.2 at /usr/bin/ninja > [7/627] Linking target lib/librte_ethdev.so.20.0.3. > FAILED: lib/librte_ethdev.so.20.0.3 > ccache cc -o lib/librte_ethdev.so.20.0.3 > 'lib/lib@@rte_ethdev@sta/librte_ethdev_ethdev_private.c.o' > 'lib/lib@@rte_ethdev@sta/librte_ethdev_ethdev_profile.c.o' > 'lib/lib@@rte_ethdev@sta/librte_ethdev_ethdev_trace_points.c.o' > 'lib/lib@@rte_ethdev@sta/librte_ethdev_rte_class_eth.c.o' > 'lib/lib@@rte_ethdev@sta/librte_ethdev_rte_ethdev.c.o' > 'lib/lib@@rte_ethdev@sta/librte_ethdev_rte_flow.c.o' > 'lib/lib@@rte_ethdev@sta/librte_ethdev_rte_mtr.c.o' > 'lib/lib@@rte_ethdev@sta/librte_ethdev_rte_tm.c.o' -Wl,--no-undefined > -Wl,--as-needed -Wl,-O1 -shared -fPIC -Wl,--start-group > -Wl,-soname,librte_ethdev.so.20.0 -Wl,--no-as-needed -pthread -lm -ldl -lnuma > lib/librte_eal.so.20.0.3 lib/librte_kvargs.so.20.0.3 > lib/librte_telemetry.so.0.200.3 lib/librte_net.so.20.0.3 > lib/librte_mbuf.so.20.0.3 lib/librte_mempool.so.20.0.3 lib/librte_ring.so.20.0.3 > lib/librte_meter.so.20.0.3 -Wl,--end-group > -Wl,--version-script=/home/renata/work/dpdk/lib/librte_ethdev/rte_ethdev_version.map > '-Wl,-rpath,$ORIGIN/' -Wl,-rpath-link,/home/renata/work/dpdk/build/lib > /usr/bin/ld:/home/renata/work/dpdk/lib/librte_ethdev/rte_ethdev_version.map:0: > syntax error in VERSION script > collect2: error: ld returned 1 exit status > > What could be an issue, is that I need to correct the version somewhere? Hi Renata, The log says "syntax error in VERSION script", can be related to it. I did following update on top of your patches and it seems worked for me: diff --git a/lib/librte_ethdev/rte_ethdev_driver.h b/lib/librte_ethdev /rte_ethdev_driver.h index 462e765d1..ca16f1bcc 100644 --- a/lib/librte_ethdev/rte_ethdev_driver.h +++ b/lib/librte_ethdev/rte_ethdev_driver.h @@ -181,9 +181,6 @@ rte_eth_dma_zone_reserve(const struct rte_eth_dev *eth_dev, const char *name, unsigned align, int socket_id); /** - * @warning - * @b EXPERIMENTAL: this API may change without prior notice. - * * Free previously allocated memzone for HW rings. * * @param eth_dev @@ -195,7 +192,7 @@ rte_eth_dma_zone_reserve(const struct rte_eth_dev *eth_dev, const char *name, * @return * Negative errno value on error, 0 on success. */ -__rte_experimental +__rte_internal int rte_eth_dma_zone_free(const struct rte_eth_dev *dev, const char *ring_name, uint16_t queue_id); diff --git a/lib/librte_ethdev/rte_ethdev_version.map b/lib/librte_ethdev /rte_ethdev_version.map index 139a81302..1212a17d3 100644 --- a/lib/librte_ethdev/rte_ethdev_version.map +++ b/lib/librte_ethdev/rte_ethdev_version.map @@ -241,5 +241,10 @@ EXPERIMENTAL { __rte_ethdev_trace_rx_burst; __rte_ethdev_trace_tx_burst; rte_flow_get_aged_flows; +}; + +INTERNAL { + global: + rte_eth_dma_zone_free; }; > > -------------------------------------------------------------------------------- > *From:* Ferruh Yigit <ferruh.yigit@intel.com> > *Sent:* Monday, June 22, 2020 7:09 PM > *To:* Renata Saiakhova <renata.saiakhova@ekinops.com>; dev@dpdk.org <dev@dpdk.org> > *Subject:* Re: [dpdk-dev] [PATCH v4 1/4] librte_ethdev: Introduce a function to > release HW rings > > On 6/22/2020 10:54 AM, Renata Saiakhova wrote: >> Free previously allocated memzone for HW rings >> >> Signed-off-by: Renata Saiakhova <Renata.Saiakhova@ekinops.com> >> --- >> lib/librte_ethdev/rte_ethdev.c | 30 ++++++++++++++++++++++-- >> lib/librte_ethdev/rte_ethdev_driver.h | 20 ++++++++++++++++ >> lib/librte_ethdev/rte_ethdev_version.map | 1 + >> 3 files changed, 49 insertions(+), 2 deletions(-) >> >> diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c >> index 72aed59a5..ec1da2006 100644 >> --- a/lib/librte_ethdev/rte_ethdev.c >> +++ b/lib/librte_ethdev/rte_ethdev.c >> @@ -4181,6 +4181,10 @@ rte_eth_dev_rx_intr_ctl_q_get_fd(uint16_t port_id, uint16_t queue_id) >> return fd; >> } >> >> +#define ETH_DMA_MZONE_NAME(_name, _port_id, _queue_id, _ring_name) \ >> + snprintf(_name, sizeof(_name), "eth_p%d_q%d_%s", \ >> + _port_id, _queue_id, _ring_name) >> + >> const struct rte_memzone * >> rte_eth_dma_zone_reserve(const struct rte_eth_dev *dev, const char *ring_name, >> uint16_t queue_id, size_t size, unsigned align, >> @@ -4190,8 +4194,7 @@ rte_eth_dma_zone_reserve(const struct rte_eth_dev *dev, const char *ring_name, >> const struct rte_memzone *mz; >> int rc; >> >> - rc = snprintf(z_name, sizeof(z_name), "eth_p%d_q%d_%s", >> - dev->data->port_id, queue_id, ring_name); >> + rc = ETH_DMA_MZONE_NAME(z_name, dev->data->port_id, queue_id, ring_name); >> if (rc >= RTE_MEMZONE_NAMESIZE) { >> RTE_ETHDEV_LOG(ERR, "ring name too long\n"); >> rte_errno = ENAMETOOLONG; >> @@ -4206,6 +4209,29 @@ rte_eth_dma_zone_reserve(const struct rte_eth_dev *dev, const char *ring_name, >> RTE_MEMZONE_IOVA_CONTIG, align); >> } >> >> +int >> +rte_eth_dma_zone_free(const struct rte_eth_dev *dev, const char *ring_name, >> + uint16_t queue_id) >> +{ >> + char z_name[RTE_MEMZONE_NAMESIZE]; >> + const struct rte_memzone *mz; >> + int rc = 0; >> + >> + rc = ETH_DMA_MZONE_NAME(z_name, dev->data->port_id, queue_id, ring_name); >> + if (rc >= RTE_MEMZONE_NAMESIZE) { >> + RTE_ETHDEV_LOG(ERR, "ring name too long\n"); >> + return -ENAMETOOLONG; >> + } >> + >> + mz = rte_memzone_lookup(z_name); >> + if (mz) >> + rc = rte_memzone_free(mz); >> + else >> + rc = -EINVAL; >> + >> + return rc; >> +} >> + >> int >> rte_eth_dev_create(struct rte_device *device, const char *name, >> size_t priv_data_size, >> diff --git a/lib/librte_ethdev/rte_ethdev_driver.h b/lib/librte_ethdev/rte_ethdev_driver.h >> index 99d4cd6cd..462e765d1 100644 >> --- a/lib/librte_ethdev/rte_ethdev_driver.h >> +++ b/lib/librte_ethdev/rte_ethdev_driver.h >> @@ -180,6 +180,26 @@ rte_eth_dma_zone_reserve(const struct rte_eth_dev *eth_dev, const char *name, >> uint16_t queue_id, size_t size, >> unsigned align, int socket_id); >> >> +/** >> + * @warning >> + * @b EXPERIMENTAL: this API may change without prior notice. >> + * >> + * Free previously allocated memzone for HW rings. >> + * >> + * @param eth_dev >> + * The *eth_dev* pointer is the address of the *rte_eth_dev* structure >> + * @param name >> + * The name of the memory zone >> + * @param queue_id >> + * The index of the queue to add to name >> + * @return >> + * Negative errno value on error, 0 on success. >> + */ >> +__rte_experimental >> +int >> +rte_eth_dma_zone_free(const struct rte_eth_dev *dev, const char *ring_name, >> + uint16_t queue_id); >> + > > Hi Renata, > > This API is not for applications, only for drivers, right? > We recently (last release ?) introduced 'internal' (__rte_internal) attribute, > we can use '__rte_internal' instead of '__rte_experimental' if the API is not > for applications. This requires adding 'INTERNAL' block in .map file (sample > 'lib/librte_eal/rte_eal_version.map') > > > Also there are a few contribution conventions related issues which can be fixed > while merging but please check them if you will be doing new version: > subsystem is only libname without prefix: 'ethdev' > Commit title description starts with lowercase: 'introduce'. > sample => "ethdev: add function to release HW rings" > > > Thanks, > ferruh
diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c index 72aed59a5..ec1da2006 100644 --- a/lib/librte_ethdev/rte_ethdev.c +++ b/lib/librte_ethdev/rte_ethdev.c @@ -4181,6 +4181,10 @@ rte_eth_dev_rx_intr_ctl_q_get_fd(uint16_t port_id, uint16_t queue_id) return fd; } +#define ETH_DMA_MZONE_NAME(_name, _port_id, _queue_id, _ring_name) \ + snprintf(_name, sizeof(_name), "eth_p%d_q%d_%s", \ + _port_id, _queue_id, _ring_name) + const struct rte_memzone * rte_eth_dma_zone_reserve(const struct rte_eth_dev *dev, const char *ring_name, uint16_t queue_id, size_t size, unsigned align, @@ -4190,8 +4194,7 @@ rte_eth_dma_zone_reserve(const struct rte_eth_dev *dev, const char *ring_name, const struct rte_memzone *mz; int rc; - rc = snprintf(z_name, sizeof(z_name), "eth_p%d_q%d_%s", - dev->data->port_id, queue_id, ring_name); + rc = ETH_DMA_MZONE_NAME(z_name, dev->data->port_id, queue_id, ring_name); if (rc >= RTE_MEMZONE_NAMESIZE) { RTE_ETHDEV_LOG(ERR, "ring name too long\n"); rte_errno = ENAMETOOLONG; @@ -4206,6 +4209,29 @@ rte_eth_dma_zone_reserve(const struct rte_eth_dev *dev, const char *ring_name, RTE_MEMZONE_IOVA_CONTIG, align); } +int +rte_eth_dma_zone_free(const struct rte_eth_dev *dev, const char *ring_name, + uint16_t queue_id) +{ + char z_name[RTE_MEMZONE_NAMESIZE]; + const struct rte_memzone *mz; + int rc = 0; + + rc = ETH_DMA_MZONE_NAME(z_name, dev->data->port_id, queue_id, ring_name); + if (rc >= RTE_MEMZONE_NAMESIZE) { + RTE_ETHDEV_LOG(ERR, "ring name too long\n"); + return -ENAMETOOLONG; + } + + mz = rte_memzone_lookup(z_name); + if (mz) + rc = rte_memzone_free(mz); + else + rc = -EINVAL; + + return rc; +} + int rte_eth_dev_create(struct rte_device *device, const char *name, size_t priv_data_size, diff --git a/lib/librte_ethdev/rte_ethdev_driver.h b/lib/librte_ethdev/rte_ethdev_driver.h index 99d4cd6cd..462e765d1 100644 --- a/lib/librte_ethdev/rte_ethdev_driver.h +++ b/lib/librte_ethdev/rte_ethdev_driver.h @@ -180,6 +180,26 @@ rte_eth_dma_zone_reserve(const struct rte_eth_dev *eth_dev, const char *name, uint16_t queue_id, size_t size, unsigned align, int socket_id); +/** + * @warning + * @b EXPERIMENTAL: this API may change without prior notice. + * + * Free previously allocated memzone for HW rings. + * + * @param eth_dev + * The *eth_dev* pointer is the address of the *rte_eth_dev* structure + * @param name + * The name of the memory zone + * @param queue_id + * The index of the queue to add to name + * @return + * Negative errno value on error, 0 on success. + */ +__rte_experimental +int +rte_eth_dma_zone_free(const struct rte_eth_dev *dev, const char *ring_name, + uint16_t queue_id); + /** * @internal * Atomically set the link status for the specific device. diff --git a/lib/librte_ethdev/rte_ethdev_version.map b/lib/librte_ethdev/rte_ethdev_version.map index 715505604..139a81302 100644 --- a/lib/librte_ethdev/rte_ethdev_version.map +++ b/lib/librte_ethdev/rte_ethdev_version.map @@ -241,4 +241,5 @@ EXPERIMENTAL { __rte_ethdev_trace_rx_burst; __rte_ethdev_trace_tx_burst; rte_flow_get_aged_flows; + rte_eth_dma_zone_free; };
Free previously allocated memzone for HW rings Signed-off-by: Renata Saiakhova <Renata.Saiakhova@ekinops.com> --- lib/librte_ethdev/rte_ethdev.c | 30 ++++++++++++++++++++++-- lib/librte_ethdev/rte_ethdev_driver.h | 20 ++++++++++++++++ lib/librte_ethdev/rte_ethdev_version.map | 1 + 3 files changed, 49 insertions(+), 2 deletions(-)