ethdev: add size and align to compose dma zone name strings

Message ID 1556358462-9920-1-git-send-email-wangyunjian@huawei.com (mailing list archive)
State Rejected, archived
Delegated to: Ferruh Yigit
Headers
Series ethdev: add size and align to compose dma zone name strings |

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation success Compilation OK
ci/intel-Performance-Testing success Performance Testing PASS
ci/mellanox-Performance-Testing success Performance Testing PASS

Commit Message

Yunjian Wang April 27, 2019, 9:47 a.m. UTC
  From: Yunjian Wang <wangyunjian@huawei.com>

The current dma zone name consists of the port_id, queue_id and
ring_name. If a port_id is reused, a new nic maybe use same dma
zone name. At this time, the zone size of the new driver is
differnt. When the zone is reused, it may cause illegal access
to memory.

Signed-off-by: Yunjian Wang <wangyunjian@huawei.com>
---
 lib/librte_ethdev/rte_ethdev.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)
  

Comments

David Marchand April 29, 2019, 8:03 a.m. UTC | #1
On Sat, Apr 27, 2019 at 11:48 AM wangyunjian <wangyunjian@huawei.com> wrote:

> From: Yunjian Wang <wangyunjian@huawei.com>
>
> The current dma zone name consists of the port_id, queue_id and
> ring_name. If a port_id is reused, a new nic maybe use same dma
> zone name. At this time, the zone size of the new driver is
> differnt. When the zone is reused, it may cause illegal access
> to memory.
>
> Signed-off-by: Yunjian Wang <wangyunjian@huawei.com>
> ---
>  lib/librte_ethdev/rte_ethdev.c | 6 +++---
>  1 file changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/lib/librte_ethdev/rte_ethdev.c
> b/lib/librte_ethdev/rte_ethdev.c
> index d7cfa3d..0703cda 100644
> --- a/lib/librte_ethdev/rte_ethdev.c
> +++ b/lib/librte_ethdev/rte_ethdev.c
> @@ -3630,9 +3630,9 @@ int rte_eth_set_queue_rate_limit(uint16_t port_id,
> uint16_t queue_idx,
>         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);
> -       if (rc >= RTE_MEMZONE_NAMESIZE) {
> +       rc = snprintf(z_name, sizeof(z_name), "p%dq%d%s0x%zx_%d",
> +                     dev->data->port_id, queue_id, ring_name, size,
> align);
> +       if (rc >= RTE_MEMZONE_NAMESIZE || rc < 0) {
>                 RTE_ETHDEV_LOG(ERR, "ring name too long\n");
>                 rte_errno = ENAMETOOLONG;
>                 return NULL;
>

In such a case, we are leaving the previous memzone in place and just
creating a new one.
Should the driver free the previous memzone instead?

I can't see this in existing drivers.
Do we actually expect to reuse the existing memzones?
  
Andrew Rybchenko May 8, 2019, 1:52 p.m. UTC | #2
On 4/29/19 11:03 AM, David Marchand wrote:
> On Sat, Apr 27, 2019 at 11:48 AM wangyunjian <wangyunjian@huawei.com 
> <mailto:wangyunjian@huawei.com>> wrote:
>
>     From: Yunjian Wang <wangyunjian@huawei.com
>     <mailto:wangyunjian@huawei.com>>
>
>     The current dma zone name consists of the port_id, queue_id and
>     ring_name. If a port_id is reused, a new nic maybe use same dma
>     zone name. At this time, the zone size of the new driver is
>     differnt. When the zone is reused, it may cause illegal access
>     to memory.
>
>     Signed-off-by: Yunjian Wang <wangyunjian@huawei.com
>     <mailto:wangyunjian@huawei.com>>
>     ---
>      lib/librte_ethdev/rte_ethdev.c | 6 +++---
>      1 file changed, 3 insertions(+), 3 deletions(-)
>
>     diff --git a/lib/librte_ethdev/rte_ethdev.c
>     b/lib/librte_ethdev/rte_ethdev.c
>     index d7cfa3d..0703cda 100644
>     --- a/lib/librte_ethdev/rte_ethdev.c
>     +++ b/lib/librte_ethdev/rte_ethdev.c
>     @@ -3630,9 +3630,9 @@ int rte_eth_set_queue_rate_limit(uint16_t
>     port_id, uint16_t queue_idx,
>             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);
>     -       if (rc >= RTE_MEMZONE_NAMESIZE) {
>     +       rc = snprintf(z_name, sizeof(z_name), "p%dq%d%s0x%zx_%d",
>     +                     dev->data->port_id, queue_id, ring_name,
>     size, align);
>     +       if (rc >= RTE_MEMZONE_NAMESIZE || rc < 0) {
>                     RTE_ETHDEV_LOG(ERR, "ring name too long\n");
>                     rte_errno = ENAMETOOLONG;
>                     return NULL;
>
>
> In such a case, we are leaving the previous memzone in place and just 
> creating a new one.
> Should the driver free the previous memzone instead?
>
> I can't see this in existing drivers.
> Do we actually expect to reuse the existing memzones?
>

I don't think the patch is a right way to go.
It is related to [1] which has a long discussion.

Andrew.

[1] https://patches.dpdk.org/patch/51952/
  

Patch

diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c
index d7cfa3d..0703cda 100644
--- a/lib/librte_ethdev/rte_ethdev.c
+++ b/lib/librte_ethdev/rte_ethdev.c
@@ -3630,9 +3630,9 @@  int rte_eth_set_queue_rate_limit(uint16_t port_id, uint16_t queue_idx,
 	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);
-	if (rc >= RTE_MEMZONE_NAMESIZE) {
+	rc = snprintf(z_name, sizeof(z_name), "p%dq%d%s0x%zx_%d",
+		      dev->data->port_id, queue_id, ring_name, size, align);
+	if (rc >= RTE_MEMZONE_NAMESIZE || rc < 0) {
 		RTE_ETHDEV_LOG(ERR, "ring name too long\n");
 		rte_errno = ENAMETOOLONG;
 		return NULL;