diff mbox

[2/2] validation: queue: use malloc to avoid artificial limits on max_queues

Message ID 1466993343-28996-2-git-send-email-bill.fischofer@linaro.org
State New
Headers show

Commit Message

Bill Fischofer June 27, 2016, 2:09 a.m. UTC
odp_queue_capability() returns max_queues which may be more than 64K.
Use malloc to allocate an array of queue handles to test the ability to
create max_queues to avoid limiting the test to 64K queues.

Signed-off-by: Bill Fischofer <bill.fischofer@linaro.org>
---
 test/validation/queue/queue.c | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

Comments

Bill Fischofer June 27, 2016, 2:19 p.m. UTC | #1
On Mon, Jun 27, 2016 at 2:39 AM, Savolainen, Petri (Nokia - FI/Espoo) <
petri.savolainen@nokia-bell-labs.com> wrote:

>
>
> > -----Original Message-----
> > From: lng-odp [mailto:lng-odp-bounces@lists.linaro.org] On Behalf Of
> Bill
> > Fischofer
> > Sent: Monday, June 27, 2016 5:09 AM
> > To: lng-odp@lists.linaro.org
> > Subject: [lng-odp] [PATCH 2/2] validation: queue: use malloc to avoid
> > artificial limits on max_queues
> >
> > odp_queue_capability() returns max_queues which may be more than 64K.
> > Use malloc to allocate an array of queue handles to test the ability to
> > create max_queues to avoid limiting the test to 64K queues.
> >
> > Signed-off-by: Bill Fischofer <bill.fischofer@linaro.org>
> > ---
> >  test/validation/queue/queue.c | 12 ++++++------
> >  1 file changed, 6 insertions(+), 6 deletions(-)
> >
> > diff --git a/test/validation/queue/queue.c
> b/test/validation/queue/queue.c
> > index c21897b..9af8c9c 100644
> > --- a/test/validation/queue/queue.c
> > +++ b/test/validation/queue/queue.c
> > @@ -11,7 +11,6 @@
> >  #define MAX_BUFFER_QUEUE        (8)
> >  #define MSG_POOL_SIZE           (4 * 1024 * 1024)
> >  #define CONFIG_MAX_ITERATION    (100)
> > -#define MAX_QUEUES              (64 * 1024)
> >
> >  static int queue_context = 0xff;
> >  static odp_pool_t pool;
> > @@ -55,7 +54,7 @@ void queue_test_capa(void)
> >       odp_queue_capability_t capa;
> >       odp_queue_param_t qparams;
> >       char name[ODP_QUEUE_NAME_LEN];
> > -     odp_queue_t queue[MAX_QUEUES];
> > +     odp_queue_t *queue;
> >       int num_queues, i;
> >
> >       memset(&capa, 0, sizeof(odp_queue_capability_t));
> > @@ -71,10 +70,9 @@ void queue_test_capa(void)
> >
> >       name[ODP_QUEUE_NAME_LEN - 1] = 0;
> >
> > -     if (capa.max_queues > MAX_QUEUES)
> > -             num_queues = MAX_QUEUES;
> > -     else
> > -             num_queues = capa.max_queues;
> > +     num_queues = capa.max_queues;
> > +     queue = malloc(num_queues * sizeof(odp_queue_t));
>
> Num_queues may be large. E.g. a malloc of 100M * 8 bytes may jam a system
> which is light on DRAM but has a hard disk, etc. I think it's better to
> limit the test to some number which will run sanely on any system.
>

If the purpose of the test is to verify that an application can allocate
the max_queues number of queues, then this is the way to do that. You're
suggesting that a platform would support a number of queues that cannot
actually be allocated because is would have insufficient memory to support
the maximum?  That doesn't sound like a reasonable design. If there is to
be a "cap" it should be in the implementation of odp_queue_capability().


>
> Isn't there a less intrusive workaround for the coverity issue.
>

The Coverity issue is legitimate and changing from uint32_t to int is the
simplest (and most correct) solution. In what way is that intrusive?


>
> -Petri
>
>
Bill Fischofer June 29, 2016, 1:43 a.m. UTC | #2
I've sent a v2 to address these concerns

On Tue, Jun 28, 2016 at 2:15 AM, Savolainen, Petri (Nokia - FI/Espoo) <
petri.savolainen@nokia-bell-labs.com> wrote:

>
>
> From: Bill Fischofer [mailto:bill.fischofer@linaro.org]
> Sent: Monday, June 27, 2016 5:20 PM
> To: Savolainen, Petri (Nokia - FI/Espoo) <
> petri.savolainen@nokia-bell-labs.com>
> Cc: lng-odp@lists.linaro.org
> Subject: Re: [lng-odp] [PATCH 2/2] validation: queue: use malloc to avoid
> artificial limits on max_queues
>
>
>
> On Mon, Jun 27, 2016 at 2:39 AM, Savolainen, Petri (Nokia - FI/Espoo) <
> petri.savolainen@nokia-bell-labs.com> wrote:
>
>
> > -----Original Message-----
> > From: lng-odp [mailto:lng-odp-bounces@lists.linaro.org] On Behalf Of
> Bill
> > Fischofer
> > Sent: Monday, June 27, 2016 5:09 AM
> > To: lng-odp@lists.linaro.org
> > Subject: [lng-odp] [PATCH 2/2] validation: queue: use malloc to avoid
> > artificial limits on max_queues
> >
> > odp_queue_capability() returns max_queues which may be more than 64K.
> > Use malloc to allocate an array of queue handles to test the ability to
> > create max_queues to avoid limiting the test to 64K queues.
> >
> > Signed-off-by: Bill Fischofer <bill.fischofer@linaro.org>
> > ---
> >  test/validation/queue/queue.c | 12 ++++++------
> >  1 file changed, 6 insertions(+), 6 deletions(-)
> >
> > diff --git a/test/validation/queue/queue.c
> b/test/validation/queue/queue.c
> > index c21897b..9af8c9c 100644
> > --- a/test/validation/queue/queue.c
> > +++ b/test/validation/queue/queue.c
> > @@ -11,7 +11,6 @@
> >  #define MAX_BUFFER_QUEUE        (8)
> >  #define MSG_POOL_SIZE           (4 * 1024 * 1024)
> >  #define CONFIG_MAX_ITERATION    (100)
> > -#define MAX_QUEUES              (64 * 1024)
> >
> >  static int queue_context = 0xff;
> >  static odp_pool_t pool;
> > @@ -55,7 +54,7 @@ void queue_test_capa(void)
> >       odp_queue_capability_t capa;
> >       odp_queue_param_t qparams;
> >       char name[ODP_QUEUE_NAME_LEN];
> > -     odp_queue_t queue[MAX_QUEUES];
> > +     odp_queue_t *queue;
> >       int num_queues, i;
> >
> >       memset(&capa, 0, sizeof(odp_queue_capability_t));
> > @@ -71,10 +70,9 @@ void queue_test_capa(void)
> >
> >       name[ODP_QUEUE_NAME_LEN - 1] = 0;
> >
> > -     if (capa.max_queues > MAX_QUEUES)
> > -             num_queues = MAX_QUEUES;
> > -     else
> > -             num_queues = capa.max_queues;
> > +     num_queues = capa.max_queues;
> > +     queue = malloc(num_queues * sizeof(odp_queue_t));
> Num_queues may be large. E.g. a malloc of 100M * 8 bytes may jam a system
> which is light on DRAM but has a hard disk, etc. I think it's better to
> limit the test to some number which will run sanely on any system.
>
> If the purpose of the test is to verify that an application can allocate
> the max_queues number of queues, then this is the way to do that. You're
> suggesting that a platform would support a number of queues that cannot
> actually be allocated because is would have insufficient memory to support
> the maximum?  That doesn't sound like a reasonable design. If there is to
> be a "cap" it should be in the implementation of odp_queue_capability().
>
> <<< Reply to a HTML mail ... >>>
> Purpose of the test is to first of all check that .max_queues field is
> defined and filled. Malloc may not be usable always for storing maximum
> number of resource handles. May be the platform under test provides 16 GB
> shm memory, but only 1GB general system memory backed up by a hard disk. A
> malloc of 800MB could stuck the system totally (generally fast path
> applications avoid using malloc), but a 800MB shm allocation would work
> just fine.
>
> I think it would be better idea to add another test case which really
> tries to create and use the max number of queues, groups, priorities, etc.
> So that it's easier contain failure cases between the capability call not
> supported vs. failure to use maximum (very large) number of resource X.
>

v2 falls back to a 64K test if the malloc() fails.


> <<< ... reply ends >>>
>
> Isn't there a less intrusive workaround for the coverity issue.
>
> The Coverity issue is legitimate and changing from uint32_t to int is the
> simplest (and most correct) solution. In what way is that intrusive?
>
>
> <<< Reply to a HTML mail >>>
> Did realize later on that patch 1/2 was fixing that already. But also
> there int32_t, or uint32_t with check against i == 0, would be more
> appropriate fix than using int. C spec guarantees that int is at least 16
> bits (not 32 bits) which in theory could cause problems when int is
> actually 16 bits and number of queues is >32k. That's why the
> capa.max_queues is uint32_t and not int.
>

v2 uses int32_t instead of int to ensure that we're dealing with 32-bit
values (even though ODP doesn't support 16-bit systems so int is going to
be 32 bits in all relevant cases).


>
>
> -Petri
>
>
diff mbox

Patch

diff --git a/test/validation/queue/queue.c b/test/validation/queue/queue.c
index c21897b..9af8c9c 100644
--- a/test/validation/queue/queue.c
+++ b/test/validation/queue/queue.c
@@ -11,7 +11,6 @@ 
 #define MAX_BUFFER_QUEUE        (8)
 #define MSG_POOL_SIZE           (4 * 1024 * 1024)
 #define CONFIG_MAX_ITERATION    (100)
-#define MAX_QUEUES              (64 * 1024)
 
 static int queue_context = 0xff;
 static odp_pool_t pool;
@@ -55,7 +54,7 @@  void queue_test_capa(void)
 	odp_queue_capability_t capa;
 	odp_queue_param_t qparams;
 	char name[ODP_QUEUE_NAME_LEN];
-	odp_queue_t queue[MAX_QUEUES];
+	odp_queue_t *queue;
 	int num_queues, i;
 
 	memset(&capa, 0, sizeof(odp_queue_capability_t));
@@ -71,10 +70,9 @@  void queue_test_capa(void)
 
 	name[ODP_QUEUE_NAME_LEN - 1] = 0;
 
-	if (capa.max_queues > MAX_QUEUES)
-		num_queues = MAX_QUEUES;
-	else
-		num_queues = capa.max_queues;
+	num_queues = capa.max_queues;
+	queue = malloc(num_queues * sizeof(odp_queue_t));
+	CU_ASSERT_FATAL(queue != NULL);
 
 	odp_queue_param_init(&qparams);
 
@@ -93,6 +91,8 @@  void queue_test_capa(void)
 
 	for (i = 0; i < num_queues; i++)
 		CU_ASSERT(odp_queue_destroy(queue[i]) == 0);
+
+	free(queue);
 }
 
 void queue_test_mode(void)