On 5/15/2020 9:04 AM, Jeff Guo wrote: > hi, renata > > On 5/13/2020 9:14 PM, Renata Saiakhova wrote: >> Free previously allocated memzone for HW rings >> >> Signed-off-by: Renata Saiakhova <renata.saiakh...@ekinops.com> >> --- >> lib/librte_ethdev/rte_ethdev.c | 28 ++++++++++++++++++++++-- >> lib/librte_ethdev/rte_ethdev_driver.h | 20 +++++++++++++++++ >> lib/librte_ethdev/rte_ethdev_version.map | 1 + >> 3 files changed, 47 insertions(+), 2 deletions(-) >> >> diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c >> index 72aed59a5..55f047e22 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,27 @@ 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); >> + >> + return rc; > > > If rc < RTE_MEMZONE_NAMESIZE && !mz, what value should be return base > on the parameter description in .h?
+1, When 'mz' not found return value will be wrong according API documentation. > > Although it would not affect the other patch set, but could you please > clarify it? > > >> +} >> + >> 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; >> };