[dpdk-dev,v4,4/4] eventdev: Add tests for event eth Rx adapter APIs

Message ID 1506028634-22998-5-git-send-email-nikhil.rao@intel.com (mailing list archive)
State Superseded, archived
Delegated to: Jerin Jacob
Headers

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation fail Compilation issues

Commit Message

Rao, Nikhil Sept. 21, 2017, 9:17 p.m. UTC
  Add unit tests for rte_event_eth_rx_adapter_xxx() APIs

Signed-off-by: Nikhil Rao <nikhil.rao@intel.com>
---
 test/test/test_event_eth_rx_adapter.c | 399 ++++++++++++++++++++++++++++++++++
 test/test/Makefile                    |   1 +
 2 files changed, 400 insertions(+)
 create mode 100644 test/test/test_event_eth_rx_adapter.c
  

Comments

Jerin Jacob Sept. 22, 2017, 12:12 p.m. UTC | #1
-----Original Message-----
> Date: Fri, 22 Sep 2017 02:47:14 +0530
> From: Nikhil Rao <nikhil.rao@intel.com>
> To: jerin.jacob@caviumnetworks.com, bruce.richardson@intel.com
> CC: gage.eads@intel.com, dev@dpdk.org, thomas@monjalon.net,
>  harry.van.haaren@intel.com, hemant.agrawal@nxp.com, nipun.gupta@nxp.com,
>  narender.vangati@intel.com, erik.g.carrillo@intel.com,
>  abhinandan.gujjar@intel.com, santosh.shukla@caviumnetworks.com
> Subject: [PATCH v4 4/4] eventdev: Add tests for event eth Rx adapter APIs
> X-Mailer: git-send-email 2.7.4
> 
> Add unit tests for rte_event_eth_rx_adapter_xxx() APIs
> 
> Signed-off-by: Nikhil Rao <nikhil.rao@intel.com>
> ---
>  test/test/test_event_eth_rx_adapter.c | 399 ++++++++++++++++++++++++++++++++++
>  test/test/Makefile                    |   1 +
>  2 files changed, 400 insertions(+)
>  create mode 100644 test/test/test_event_eth_rx_adapter.c
> 
> diff --git a/test/test/test_event_eth_rx_adapter.c b/test/test/test_event_eth_rx_adapter.c
> new file mode 100644
> index 000000000..5d448dc27
> --- /dev/null
> +++ b/test/test/test_event_eth_rx_adapter.c
> @@ -0,0 +1,399 @@
> +/*-
> + *   BSD LICENSE
> + *
> + *   Copyright(c) 2017 Intel Corporation. All rights reserved.
> + *
> + *   Redistribution and use in source and binary forms, with or without
> + *   modification, are permitted provided that the following conditions
> + *   are met:
> + *
> + *     * Redistributions of source code must retain the above copyright
> + *       notice, this list of conditions and the following disclaimer.
> + *     * Redistributions in binary form must reproduce the above copyright
> + *       notice, this list of conditions and the following disclaimer in
> + *       the documentation and/or other materials provided with the
> + *       distribution.
> + *     * Neither the name of Intel Corporation nor the names of its
> + *       contributors may be used to endorse or promote products derived
> + *       from this software without specific prior written permission.
> + *
> + *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
> + *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
> + *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
> + *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
> + *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
> + *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
> + *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
> + *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> + *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> + *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
> + *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + */
> +#include <string.h>
> +#include <rte_common.h>
> +#include <rte_mempool.h>
> +#include <rte_mbuf.h>
> +#include <rte_ethdev.h>
> +#include <rte_eventdev.h>
> +
> +#include <rte_event_eth_rx_adapter.h>
> +
> +#include "test.h"
> +
> +/* i40e limits max to 64 */

This comment could be removed.

> +#define MAX_NUM_RX_QUEUE	64
> +#define NB_MBUFS		(8192 * num_ports * MAX_NUM_RX_QUEUE)
> +#define MBUF_CACHE_SIZE		512
> +#define MBUF_PRIV_SIZE		0
> +
> +struct event_eth_rx_adapter_test_params {
> +	struct rte_mempool *mp;
> +	uint16_t rx_rings, tx_rings;
> +	uint32_t caps;
> +};
> +
> +static struct event_eth_rx_adapter_test_params default_params;
> +
> +static int
> +testsuite_setup(void)
> +{
> +	int err;
> +	err = init_ports(rte_eth_dev_count());
> +	TEST_ASSERT(err == 0, "Port initialization failed err %d\n", err);

I guess, We check rte_event_dev_count() >= 1 before proceeding.

> +
> +	struct rte_event_dev_config config = {
> +			.nb_event_queues = 1,
> +			.nb_event_ports = 1,
> +			.nb_events_limit  = 4096,
> +			.nb_event_queue_flows = 1024,
> +			.nb_event_port_dequeue_depth = 16,
> +			.nb_event_port_enqueue_depth = 16
> +	};
> +
> +	err = rte_event_dev_configure(0, &config);
> +	TEST_ASSERT(err == 0, "Event device initialization failed err %d\n",
> +			err);
> +
> +	err = rte_event_eth_rx_adapter_caps_get(0, 0, &default_params.caps);
> +	TEST_ASSERT(err == 0, "Failed to get adapter cap err %d\n",
> +			err);
> +
> +	return err;
> +}
> +
  
Rao, Nikhil Sept. 24, 2017, 6:24 p.m. UTC | #2
On 9/22/2017 5:42 PM, Jerin Jacob wrote:
> -----Original Message-----
>> Date: Fri, 22 Sep 2017 02:47:14 +0530
>> From: Nikhil Rao <nikhil.rao@intel.com>
>> To: jerin.jacob@caviumnetworks.com, bruce.richardson@intel.com
>> CC: gage.eads@intel.com, dev@dpdk.org, thomas@monjalon.net,
>>   harry.van.haaren@intel.com, hemant.agrawal@nxp.com, nipun.gupta@nxp.com,
>>   narender.vangati@intel.com, erik.g.carrillo@intel.com,
>>   abhinandan.gujjar@intel.com, santosh.shukla@caviumnetworks.com
>> Subject: [PATCH v4 4/4] eventdev: Add tests for event eth Rx adapter APIs
>> X-Mailer: git-send-email 2.7.4
>>
>> Add unit tests for rte_event_eth_rx_adapter_xxx() APIs
>
<snip>

>> +#include <string.h>
>> +#include <rte_common.h>
>> +#include <rte_mempool.h>
>> +#include <rte_mbuf.h>
>> +#include <rte_ethdev.h>
>> +#include <rte_eventdev.h>
>> +
>> +#include <rte_event_eth_rx_adapter.h>
>> +
>> +#include "test.h"
>> +
>> +/* i40e limits max to 64 */
> 
> This comment could be removed.
> 
OK, I am documenting why the code doesn't just use 
dev_info.max_rx_queues, won't the comment be useful to retain ?

>> +#define MAX_NUM_RX_QUEUE	64
>> +#define NB_MBUFS		(8192 * num_ports * MAX_NUM_RX_QUEUE)
>> +#define MBUF_CACHE_SIZE		512
>> +#define MBUF_PRIV_SIZE		0
>> +
>> +struct event_eth_rx_adapter_test_params {
>> +	struct rte_mempool *mp;
>> +	uint16_t rx_rings, tx_rings;
>> +	uint32_t caps;
>> +};
>> +
>> +static struct event_eth_rx_adapter_test_params default_params;
>> +
>> +static int
>> +testsuite_setup(void)
>> +{
>> +	int err;
>> +	err = init_ports(rte_eth_dev_count());
>> +	TEST_ASSERT(err == 0, "Port initialization failed err %d\n", err);
> 
> I guess, We check rte_event_dev_count() >= 1 before proceeding.

Yes, I can add the same logic as in test_evendev.
> 
>> +
>> +	struct rte_event_dev_config config = {
>> +			.nb_event_queues = 1,
>> +			.nb_event_ports = 1,
>> +			.nb_events_limit  = 4096,
>> +			.nb_event_queue_flows = 1024,
>> +			.nb_event_port_dequeue_depth = 16,
>> +			.nb_event_port_enqueue_depth = 16
>> +	};
>> +
>> +	err = rte_event_dev_configure(0, &config);
>> +	TEST_ASSERT(err == 0, "Event device initialization failed err %d\n",
>> +			err);
>> +
>> +	err = rte_event_eth_rx_adapter_caps_get(0, 0, &default_params.caps);
>> +	TEST_ASSERT(err == 0, "Failed to get adapter cap err %d\n",
>> +			err);
>> +
>> +	return err;
>> +}
>> +
> 
Thanks for the review,
Nikhil
  
Jerin Jacob Oct. 2, 2017, 10:31 a.m. UTC | #3
-----Original Message-----
> Date: Sun, 24 Sep 2017 23:54:38 +0530
> From: "Rao, Nikhil" <nikhil.rao@intel.com>
> To: Jerin Jacob <jerin.jacob@caviumnetworks.com>
> CC: bruce.richardson@intel.com, gage.eads@intel.com, dev@dpdk.org,
>  thomas@monjalon.net, harry.van.haaren@intel.com, hemant.agrawal@nxp.com,
>  nipun.gupta@nxp.com, narender.vangati@intel.com,
>  erik.g.carrillo@intel.com, abhinandan.gujjar@intel.com,
>  santosh.shukla@caviumnetworks.com
> Subject: Re: [PATCH v4 4/4] eventdev: Add tests for event eth Rx adapter
>  APIs
> User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101
>  Thunderbird/52.3.0
> 
> On 9/22/2017 5:42 PM, Jerin Jacob wrote:
> > -----Original Message-----
> > > Date: Fri, 22 Sep 2017 02:47:14 +0530
> > > From: Nikhil Rao <nikhil.rao@intel.com>
> > > To: jerin.jacob@caviumnetworks.com, bruce.richardson@intel.com
> > > CC: gage.eads@intel.com, dev@dpdk.org, thomas@monjalon.net,
> > >   harry.van.haaren@intel.com, hemant.agrawal@nxp.com, nipun.gupta@nxp.com,
> > >   narender.vangati@intel.com, erik.g.carrillo@intel.com,
> > >   abhinandan.gujjar@intel.com, santosh.shukla@caviumnetworks.com
> > > Subject: [PATCH v4 4/4] eventdev: Add tests for event eth Rx adapter APIs
> > > X-Mailer: git-send-email 2.7.4
> > > 
> > > Add unit tests for rte_event_eth_rx_adapter_xxx() APIs
> > 
> <snip>
> 
> > > +#include <string.h>
> > > +#include <rte_common.h>
> > > +#include <rte_mempool.h>
> > > +#include <rte_mbuf.h>
> > > +#include <rte_ethdev.h>
> > > +#include <rte_eventdev.h>
> > > +
> > > +#include <rte_event_eth_rx_adapter.h>
> > > +
> > > +#include "test.h"
> > > +
> > > +/* i40e limits max to 64 */
> > 
> > This comment could be removed.
> > 
> OK, I am documenting why the code doesn't just use dev_info.max_rx_queues,
> won't the comment be useful to retain ?

OK. If dev_info.max_rx_queues for i40e is not 64 as expected then we
could the fix the i40e driver as well.


>
  
Pavan Nikhilesh Oct. 3, 2017, 11:36 a.m. UTC | #4
On Fri, Sep 22, 2017 at 02:47:14AM +0530, Nikhil Rao wrote:

Hi Nikhil,


> Add unit tests for rte_event_eth_rx_adapter_xxx() APIs
>
> Signed-off-by: Nikhil Rao <nikhil.rao@intel.com>
> ---
>  test/test/test_event_eth_rx_adapter.c | 399 ++++++++++++++++++++++++++++++++++
>  test/test/Makefile                    |   1 +
>  2 files changed, 400 insertions(+)
>  create mode 100644 test/test/test_event_eth_rx_adapter.c
>
> diff --git a/test/test/test_event_eth_rx_adapter.c b/test/test/test_event_eth_rx_adapter.c
> new file mode 100644
> index 000000000..5d448dc27
<snip>
> +
> +static int
> +testsuite_setup(void)
> +{
> +	int err;
> +	err = init_ports(rte_eth_dev_count());
> +	TEST_ASSERT(err == 0, "Port initialization failed err %d\n", err);
> +
> +	struct rte_event_dev_config config = {
> +			.nb_event_queues = 1,
> +			.nb_event_ports = 1,
> +			.nb_events_limit  = 4096,
> +			.nb_event_queue_flows = 1024,
> +			.nb_event_port_dequeue_depth = 16,
> +			.nb_event_port_enqueue_depth = 16
> +	};
> +

Some eth devices like octeontx[1] use event device to receive packets, So in
this special case it would require to stop the event device before configuring
the event device as it is already started in port_init.

Calling rte_event_dev_stop(0) here would satisfy such use case.

[1] http://dpdk.org/ml/archives/dev/2017-August/073982.html

> +	err = rte_event_dev_configure(0, &config);
> +	TEST_ASSERT(err == 0, "Event device initialization failed err %d\n",
> +			err);
> +
> +	err = rte_event_eth_rx_adapter_caps_get(0, 0, &default_params.caps);
> +	TEST_ASSERT(err == 0, "Failed to get adapter cap err %d\n",

<snip>

> +
> +static int
> +adapter_queue_add_del(void)
> +{
> +	int err;
> +	struct rte_event ev;
> +	uint32_t cap;
> +
> +	struct rte_event_eth_rx_adapter_queue_conf queue_config;
> +
> +	err = rte_event_eth_rx_adapter_caps_get(0, 0, &cap);
> +	TEST_ASSERT(err == 0, "Expected 0 got %d", err);
> +
> +	ev.queue_id = 0;
> +	ev.sched_type = RTE_SCHED_TYPE_ATOMIC;
> +	ev.priority = 0;
> +
> +	queue_config.rx_queue_flags = 0;
> +	if (!(cap & RTE_EVENT_ETH_RX_ADAPTER_CAP_FLOW_ID)) {
> +		ev.flow_id = 1;
> +		queue_config.rx_queue_flags =
> +			RTE_EVENT_ETH_RX_ADAPTER_QUEUE_FLOW_ID_VALID;
> +	}
> +	queue_config.ev = ev;
> +	queue_config.servicing_weight = 1;
> +

As mentioned above[1] in case of HW accelerated coprocessors the eth_port has
to be stopped before reconfiguring the eth queue to event queue remapping.
Calling rte_eth_dev_stop(0) is required before trying to map the eth queue.

> +	err = rte_event_eth_rx_adapter_queue_add(0, rte_eth_dev_count(),
> +					-1, &queue_config);
> +	TEST_ASSERT(err == -EINVAL, "Expected -EINVAL got %d", err);
> +
> +	if (!(cap & RTE_EVENT_ETH_RX_ADAPTER_CAP_SINGLE_EVENTQ)) {
> +		err = rte_event_eth_rx_adapter_queue_add(0, 0, 0,
> +							&queue_config);
> +		TEST_ASSERT(err == 0, "Expected 0 got %d", err);
> +
> +		err = rte_event_eth_rx_adapter_queue_del(0, 0, 0);
> +		TEST_ASSERT(err == 0, "Expected 0 got %d", err);
> +
> +		err = rte_event_eth_rx_adapter_queue_add(0, 0, -1,
> +							&queue_config);
> +		TEST_ASSERT(err == 0, "Expected 0 got %d", err);
> +
> +		err = rte_event_eth_rx_adapter_queue_del(0, 0, -1);
> +		TEST_ASSERT(err == 0, "Expected 0 got %d", err);
> +	} else {
> +		err = rte_event_eth_rx_adapter_queue_add(0, 0, 0,
> +							&queue_config);
> +		TEST_ASSERT(err == -EINVAL, "Expected EINVAL got %d", err);
> +
>
<snip>

Thanks,
Pavan
  
Rao, Nikhil Oct. 4, 2017, 11:28 a.m. UTC | #5
On 10/2/2017 4:01 PM, Jerin Jacob wrote:
> -----Original Message-----
>> Date: Sun, 24 Sep 2017 23:54:38 +0530
>> From: "Rao, Nikhil" <nikhil.rao@intel.com>
>> To: Jerin Jacob <jerin.jacob@caviumnetworks.com>
>> CC: bruce.richardson@intel.com, gage.eads@intel.com, dev@dpdk.org,
>>   thomas@monjalon.net, harry.van.haaren@intel.com, hemant.agrawal@nxp.com,
>>   nipun.gupta@nxp.com, narender.vangati@intel.com,
>>   erik.g.carrillo@intel.com, abhinandan.gujjar@intel.com,
>>   santosh.shukla@caviumnetworks.com
>> Subject: Re: [PATCH v4 4/4] eventdev: Add tests for event eth Rx adapter
>>   APIs
>> User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101
>>   Thunderbird/52.3.0
>>
>> On 9/22/2017 5:42 PM, Jerin Jacob wrote:
>>> -----Original Message-----
>>>> Date: Fri, 22 Sep 2017 02:47:14 +0530
>>>> From: Nikhil Rao <nikhil.rao@intel.com>
>>>> To: jerin.jacob@caviumnetworks.com, bruce.richardson@intel.com
>>>> CC: gage.eads@intel.com, dev@dpdk.org, thomas@monjalon.net,
>>>>    harry.van.haaren@intel.com, hemant.agrawal@nxp.com, nipun.gupta@nxp.com,
>>>>    narender.vangati@intel.com, erik.g.carrillo@intel.com,
>>>>    abhinandan.gujjar@intel.com, santosh.shukla@caviumnetworks.com
>>>> Subject: [PATCH v4 4/4] eventdev: Add tests for event eth Rx adapter APIs
>>>> X-Mailer: git-send-email 2.7.4
>>>>
>>>> Add unit tests for rte_event_eth_rx_adapter_xxx() APIs
>>>
>> <snip>
>>
>>>> +#include <string.h>
>>>> +#include <rte_common.h>
>>>> +#include <rte_mempool.h>
>>>> +#include <rte_mbuf.h>
>>>> +#include <rte_ethdev.h>
>>>> +#include <rte_eventdev.h>
>>>> +
>>>> +#include <rte_event_eth_rx_adapter.h>
>>>> +
>>>> +#include "test.h"
>>>> +
>>>> +/* i40e limits max to 64 */
>>>
>>> This comment could be removed.
>>>
>> OK, I am documenting why the code doesn't just use dev_info.max_rx_queues,
>> won't the comment be useful to retain ?
> 
> OK. If dev_info.max_rx_queues for i40e is not 64 as expected then we
> could the fix the i40e driver as well.

This change was added in c9eb97fb9212a38, will check with i40e PMD 
maintainer (this is a holiday week in PRC though), a quick check showed 
that it is possible to allocate dev_info.max_rx_queues - 
dev_info.vmdq_queue_num Rx queues

I will re post with the comment removed for now and post a patch later.

Nikhil
  
Rao, Nikhil Oct. 5, 2017, 5:57 a.m. UTC | #6
On 10/3/2017 5:06 PM, Pavan Nikhilesh Bhagavatula wrote:
> On Fri, Sep 22, 2017 at 02:47:14AM +0530, Nikhil Rao wrote:
> 
> Hi Nikhil,
> 
> 
>> Add unit tests for rte_event_eth_rx_adapter_xxx() APIs
>>
>> Signed-off-by: Nikhil Rao <nikhil.rao@intel.com>
>> ---
>>   test/test/test_event_eth_rx_adapter.c | 399 ++++++++++++++++++++++++++++++++++
>>   test/test/Makefile                    |   1 +
>>   2 files changed, 400 insertions(+)
>>   create mode 100644 test/test/test_event_eth_rx_adapter.c
>>
>> diff --git a/test/test/test_event_eth_rx_adapter.c b/test/test/test_event_eth_rx_adapter.c
>> new file mode 100644
>> index 000000000..5d448dc27
> <snip>
>> +
>> +static int
>> +testsuite_setup(void)
>> +{
>> +	int err;
>> +	err = init_ports(rte_eth_dev_count());
>> +	TEST_ASSERT(err == 0, "Port initialization failed err %d\n", err);
>> +
>> +	struct rte_event_dev_config config = {
>> +			.nb_event_queues = 1,
>> +			.nb_event_ports = 1,
>> +			.nb_events_limit  = 4096,
>> +			.nb_event_queue_flows = 1024,
>> +			.nb_event_port_dequeue_depth = 16,
>> +			.nb_event_port_enqueue_depth = 16
>> +	};
>> +
> 
> Some eth devices like octeontx[1] use event device to receive packets, So in
> this special case it would require to stop the event device before configuring
> the event device as it is already started in port_init.
> 
> Calling rte_event_dev_stop(0) here would satisfy such use case.

Hi Pavan,

port_init is starting the eth device not the event device.

Moving init_ports to after rte_event_dev_configure should also work ?

> 
> [1] http://dpdk.org/ml/archives/dev/2017-August/073982.html
> 
>> +	err = rte_event_dev_configure(0, &config);
>> +	TEST_ASSERT(err == 0, "Event device initialization failed err %d\n",
>> +			err);
>> +
>> +	err = rte_event_eth_rx_adapter_caps_get(0, 0, &default_params.caps);
>> +	TEST_ASSERT(err == 0, "Failed to get adapter cap err %d\n",
> 
> <snip>
> 
>> +
>> +static int
>> +adapter_queue_add_del(void)
>> +{
>> +	int err;
>> +	struct rte_event ev;
>> +	uint32_t cap;
>> +
>> +	struct rte_event_eth_rx_adapter_queue_conf queue_config;
>> +
>> +	err = rte_event_eth_rx_adapter_caps_get(0, 0, &cap);
>> +	TEST_ASSERT(err == 0, "Expected 0 got %d", err);
>> +
>> +	ev.queue_id = 0;
>> +	ev.sched_type = RTE_SCHED_TYPE_ATOMIC;
>> +	ev.priority = 0;
>> +
>> +	queue_config.rx_queue_flags = 0;
>> +	if (!(cap & RTE_EVENT_ETH_RX_ADAPTER_CAP_FLOW_ID)) {
>> +		ev.flow_id = 1;
>> +		queue_config.rx_queue_flags =
>> +			RTE_EVENT_ETH_RX_ADAPTER_QUEUE_FLOW_ID_VALID;
>> +	}
>> +	queue_config.ev = ev;
>> +	queue_config.servicing_weight = 1;
>> +
> 
> As mentioned above[1] in case of HW accelerated coprocessors the eth_port has
> to be stopped before reconfiguring the eth queue to event queue remapping.
> Calling rte_eth_dev_stop(0) is required before trying to map the eth queue.
> 

Is it possible to do this internally within the queue_add call ?

If not, the application would call rte_eth_dev_stop() if 
RTE_EVENT_ETH_RX_ADAPTER_CAP_INTERNAL_PORT is set or do we need a 
separate capability for this ?

>> +	err = rte_event_eth_rx_adapter_queue_add(0, rte_eth_dev_count(),
>> +					-1, &queue_config);
>> +	TEST_ASSERT(err == -EINVAL, "Expected -EINVAL got %d", err);
>> +
>> +	if (!(cap & RTE_EVENT_ETH_RX_ADAPTER_CAP_SINGLE_EVENTQ)) {
>> +		err = rte_event_eth_rx_adapter_queue_add(0, 0, 0,
>> +							&queue_config);
>> +		TEST_ASSERT(err == 0, "Expected 0 got %d", err);
>> +
>> +		err = rte_event_eth_rx_adapter_queue_del(0, 0, 0);
>> +		TEST_ASSERT(err == 0, "Expected 0 got %d", err);
>> +
>> +		err = rte_event_eth_rx_adapter_queue_add(0, 0, -1,
>> +							&queue_config);
>> +		TEST_ASSERT(err == 0, "Expected 0 got %d", err);
>> +
>> +		err = rte_event_eth_rx_adapter_queue_del(0, 0, -1);
>> +		TEST_ASSERT(err == 0, "Expected 0 got %d", err);
>> +	} else {
>> +		err = rte_event_eth_rx_adapter_queue_add(0, 0, 0,
>> +							&queue_config);
>> +		TEST_ASSERT(err == -EINVAL, "Expected EINVAL got %d", err);
>> +
>>
> <snip>
> 
> Thanks,
> Pavan
>
  
Pavan Nikhilesh Oct. 5, 2017, 8:08 a.m. UTC | #7
On Thu, Oct 05, 2017 at 11:27:53AM +0530, Rao, Nikhil wrote:
> On 10/3/2017 5:06 PM, Pavan Nikhilesh Bhagavatula wrote:
> >On Fri, Sep 22, 2017 at 02:47:14AM +0530, Nikhil Rao wrote:
> >
> >Hi Nikhil,
> >
> >
> >>Add unit tests for rte_event_eth_rx_adapter_xxx() APIs
> >>
> >>Signed-off-by: Nikhil Rao <nikhil.rao@intel.com>
> >>---
> >>  test/test/test_event_eth_rx_adapter.c | 399 ++++++++++++++++++++++++++++++++++
> >>  test/test/Makefile                    |   1 +
> >>  2 files changed, 400 insertions(+)
> >>  create mode 100644 test/test/test_event_eth_rx_adapter.c
> >>
> >>diff --git a/test/test/test_event_eth_rx_adapter.c b/test/test/test_event_eth_rx_adapter.c
> >>new file mode 100644
> >>index 000000000..5d448dc27
> ><snip>
> >>+
> >>+static int
> >>+testsuite_setup(void)
> >>+{
> >>+	int err;
> >>+	err = init_ports(rte_eth_dev_count());
> >>+	TEST_ASSERT(err == 0, "Port initialization failed err %d\n", err);
> >>+
> >>+	struct rte_event_dev_config config = {
> >>+			.nb_event_queues = 1,
> >>+			.nb_event_ports = 1,
> >>+			.nb_events_limit  = 4096,
> >>+			.nb_event_queue_flows = 1024,
> >>+			.nb_event_port_dequeue_depth = 16,
> >>+			.nb_event_port_enqueue_depth = 16
> >>+	};
> >>+
> >
> >Some eth devices like octeontx[1] use event device to receive packets, So in
> >this special case it would require to stop the event device before configuring
> >the event device as it is already started in port_init.
> >
> >Calling rte_event_dev_stop(0) here would satisfy such use case.
>
> Hi Pavan,
>
> port_init is starting the eth device not the event device.

If eth_octeontx is the eth device It uses event_octeontx to work. So, when
rte_eth_dev_start is called in port_init it invokes rte_event_dev_start
internally.

>
> Moving init_ports to after rte_event_dev_configure should also work ?

Yep, this works too.

>
> >
> >[1] http://dpdk.org/ml/archives/dev/2017-August/073982.html
> >
> >>+	err = rte_event_dev_configure(0, &config);
> >>+	TEST_ASSERT(err == 0, "Event device initialization failed err %d\n",
> >>+			err);
> >>+
> >>+	err = rte_event_eth_rx_adapter_caps_get(0, 0, &default_params.caps);
> >>+	TEST_ASSERT(err == 0, "Failed to get adapter cap err %d\n",
> >
> ><snip>
> >
> >>+
> >>+static int
> >>+adapter_queue_add_del(void)
> >>+{
> >>+	int err;
> >>+	struct rte_event ev;
> >>+	uint32_t cap;
> >>+
> >>+	struct rte_event_eth_rx_adapter_queue_conf queue_config;
> >>+
> >>+	err = rte_event_eth_rx_adapter_caps_get(0, 0, &cap);
> >>+	TEST_ASSERT(err == 0, "Expected 0 got %d", err);
> >>+
> >>+	ev.queue_id = 0;
> >>+	ev.sched_type = RTE_SCHED_TYPE_ATOMIC;
> >>+	ev.priority = 0;
> >>+
> >>+	queue_config.rx_queue_flags = 0;
> >>+	if (!(cap & RTE_EVENT_ETH_RX_ADAPTER_CAP_FLOW_ID)) {
> >>+		ev.flow_id = 1;
> >>+		queue_config.rx_queue_flags =
> >>+			RTE_EVENT_ETH_RX_ADAPTER_QUEUE_FLOW_ID_VALID;
> >>+	}
> >>+	queue_config.ev = ev;
> >>+	queue_config.servicing_weight = 1;
> >>+
> >
> >As mentioned above[1] in case of HW accelerated coprocessors the eth_port has
> >to be stopped before reconfiguring the eth queue to event queue remapping.
> >Calling rte_eth_dev_stop(0) is required before trying to map the eth queue.
> >
>
> Is it possible to do this internally within the queue_add call ?

It is possible to handle this internally.
AFAIK it is a very specific case that exists when we are using eth_octeontx and
event_octeontx. So, I think this changes is not required.

>
> If not, the application would call rte_eth_dev_stop() if
> RTE_EVENT_ETH_RX_ADAPTER_CAP_INTERNAL_PORT is set or do we need a separate
> capability for this ?
>
> >>+	err = rte_event_eth_rx_adapter_queue_add(0, rte_eth_dev_count(),
> >>+					-1, &queue_config);
> >>+	TEST_ASSERT(err == -EINVAL, "Expected -EINVAL got %d", err);
> >>+
> >>+	if (!(cap & RTE_EVENT_ETH_RX_ADAPTER_CAP_SINGLE_EVENTQ)) {
> >>+		err = rte_event_eth_rx_adapter_queue_add(0, 0, 0,
> >>+							&queue_config);
> >>+		TEST_ASSERT(err == 0, "Expected 0 got %d", err);
> >>+
> >>+		err = rte_event_eth_rx_adapter_queue_del(0, 0, 0);
> >>+		TEST_ASSERT(err == 0, "Expected 0 got %d", err);
> >>+
> >>+		err = rte_event_eth_rx_adapter_queue_add(0, 0, -1,
> >>+							&queue_config);
> >>+		TEST_ASSERT(err == 0, "Expected 0 got %d", err);
> >>+
> >>+		err = rte_event_eth_rx_adapter_queue_del(0, 0, -1);
> >>+		TEST_ASSERT(err == 0, "Expected 0 got %d", err);
> >>+	} else {
> >>+		err = rte_event_eth_rx_adapter_queue_add(0, 0, 0,
> >>+							&queue_config);
> >>+		TEST_ASSERT(err == -EINVAL, "Expected EINVAL got %d", err);
> >>+
> >>
> ><snip>
> >
> >Thanks,
> >Pavan
> >
>
  

Patch

diff --git a/test/test/test_event_eth_rx_adapter.c b/test/test/test_event_eth_rx_adapter.c
new file mode 100644
index 000000000..5d448dc27
--- /dev/null
+++ b/test/test/test_event_eth_rx_adapter.c
@@ -0,0 +1,399 @@ 
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright(c) 2017 Intel Corporation. All rights reserved.
+ *
+ *   Redistribution and use in source and binary forms, with or without
+ *   modification, are permitted provided that the following conditions
+ *   are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided with the
+ *       distribution.
+ *     * Neither the name of Intel Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+#include <string.h>
+#include <rte_common.h>
+#include <rte_mempool.h>
+#include <rte_mbuf.h>
+#include <rte_ethdev.h>
+#include <rte_eventdev.h>
+
+#include <rte_event_eth_rx_adapter.h>
+
+#include "test.h"
+
+/* i40e limits max to 64 */
+#define MAX_NUM_RX_QUEUE	64
+#define NB_MBUFS		(8192 * num_ports * MAX_NUM_RX_QUEUE)
+#define MBUF_CACHE_SIZE		512
+#define MBUF_PRIV_SIZE		0
+
+struct event_eth_rx_adapter_test_params {
+	struct rte_mempool *mp;
+	uint16_t rx_rings, tx_rings;
+	uint32_t caps;
+};
+
+static struct event_eth_rx_adapter_test_params default_params;
+
+static inline int
+port_init(uint8_t port, struct rte_mempool *mp)
+{
+	static const struct rte_eth_conf port_conf_default = {
+		.rxmode = {
+			.mq_mode = ETH_MQ_RX_RSS,
+			.max_rx_pkt_len = ETHER_MAX_LEN
+		},
+		.rx_adv_conf = {
+			.rss_conf = {
+				.rss_hf = ETH_RSS_IP |
+					  ETH_RSS_TCP |
+					  ETH_RSS_UDP,
+			}
+		}
+	};
+	const uint16_t rx_ring_size = 512, tx_ring_size = 512;
+	struct rte_eth_conf port_conf = port_conf_default;
+	int retval;
+	uint16_t q;
+	struct rte_eth_dev_info dev_info;
+
+	if (port >= rte_eth_dev_count())
+		return -1;
+
+	rte_eth_dev_info_get(port, &dev_info);
+	default_params.rx_rings = RTE_MIN(MAX_NUM_RX_QUEUE,
+					dev_info.max_rx_queues);
+	default_params.tx_rings = 1;
+
+	/* Configure the Ethernet device. */
+	retval = rte_eth_dev_configure(port, default_params.rx_rings,
+				default_params.tx_rings, &port_conf);
+	if (retval != 0)
+		return retval;
+
+	for (q = 0; q < default_params.rx_rings; q++) {
+		retval = rte_eth_rx_queue_setup(port, q, rx_ring_size,
+				rte_eth_dev_socket_id(port), NULL, mp);
+		if (retval < 0)
+			return retval;
+	}
+
+	/* Allocate and set up 1 TX queue per Ethernet port. */
+	for (q = 0; q < default_params.tx_rings; q++) {
+		retval = rte_eth_tx_queue_setup(port, q, tx_ring_size,
+				rte_eth_dev_socket_id(port), NULL);
+		if (retval < 0)
+			return retval;
+	}
+
+	/* Start the Ethernet port. */
+	retval = rte_eth_dev_start(port);
+	if (retval < 0)
+		return retval;
+
+	/* Display the port MAC address. */
+	struct ether_addr addr;
+	rte_eth_macaddr_get(port, &addr);
+	printf("Port %u MAC: %02" PRIx8 " %02" PRIx8 " %02" PRIx8
+			   " %02" PRIx8 " %02" PRIx8 " %02" PRIx8 "\n",
+			(unsigned int)port,
+			addr.addr_bytes[0], addr.addr_bytes[1],
+			addr.addr_bytes[2], addr.addr_bytes[3],
+			addr.addr_bytes[4], addr.addr_bytes[5]);
+
+	/* Enable RX in promiscuous mode for the Ethernet device. */
+	rte_eth_promiscuous_enable(port);
+
+	return 0;
+}
+
+static int
+init_ports(int num_ports)
+{
+	uint8_t portid;
+	int retval;
+
+	default_params.mp = rte_pktmbuf_pool_create("packet_pool",
+						NB_MBUFS,
+						MBUF_CACHE_SIZE,
+						MBUF_PRIV_SIZE,
+						RTE_MBUF_DEFAULT_BUF_SIZE,
+						rte_socket_id());
+	if (!default_params.mp)
+		return -ENOMEM;
+
+	for (portid = 0; portid < num_ports; portid++) {
+		retval = port_init(portid, default_params.mp);
+		if (retval)
+			return retval;
+	}
+
+	return 0;
+}
+
+static int
+testsuite_setup(void)
+{
+	int err;
+	err = init_ports(rte_eth_dev_count());
+	TEST_ASSERT(err == 0, "Port initialization failed err %d\n", err);
+
+	struct rte_event_dev_config config = {
+			.nb_event_queues = 1,
+			.nb_event_ports = 1,
+			.nb_events_limit  = 4096,
+			.nb_event_queue_flows = 1024,
+			.nb_event_port_dequeue_depth = 16,
+			.nb_event_port_enqueue_depth = 16
+	};
+
+	err = rte_event_dev_configure(0, &config);
+	TEST_ASSERT(err == 0, "Event device initialization failed err %d\n",
+			err);
+
+	err = rte_event_eth_rx_adapter_caps_get(0, 0, &default_params.caps);
+	TEST_ASSERT(err == 0, "Failed to get adapter cap err %d\n",
+			err);
+
+	return err;
+}
+
+static void
+testsuite_teardown(void)
+{
+	uint32_t i;
+	rte_mempool_free(default_params.mp);
+	for (i = 0; i < rte_eth_dev_count(); i++)
+		rte_eth_dev_stop(i);
+}
+
+static int adapter_create(void)
+{
+	struct rte_event_port_conf rx_p_conf = {
+			.dequeue_depth = 8,
+			.enqueue_depth = 8,
+			.new_event_threshold = 1200,
+	};
+
+	int err = rte_event_eth_rx_adapter_create(0, 0, &rx_p_conf);
+	TEST_ASSERT(err == 0, "Expected 0 got %d", err);
+
+	return err;
+}
+
+static void adapter_free(void)
+{
+	rte_event_eth_rx_adapter_free(0);
+}
+
+static int
+adapter_create_free(void)
+{
+	int err;
+
+	struct rte_event_port_conf rx_p_conf = {
+			.dequeue_depth = 8,
+			.enqueue_depth = 8,
+			.new_event_threshold = 1200,
+	};
+
+	err = rte_event_eth_rx_adapter_create(0, 0, NULL);
+	TEST_ASSERT(err == -EINVAL, "Expected -EINVAL got %d", err);
+
+	err = rte_event_eth_rx_adapter_create(0, 0, &rx_p_conf);
+	TEST_ASSERT(err == 0, "Expected 0 got %d", err);
+
+	err = rte_event_eth_rx_adapter_create(0, 0, &rx_p_conf);
+	TEST_ASSERT(err == -EEXIST, "Expected -EEXIST %d got %d", -EEXIST, err);
+
+	err = rte_event_eth_rx_adapter_free(0);
+	TEST_ASSERT(err == 0, "Expected 0 got %d", err);
+
+	err = rte_event_eth_rx_adapter_free(0);
+	TEST_ASSERT(err == -EINVAL, "Expected -EINVAL %d got %d", -EINVAL, err);
+
+	err = rte_event_eth_rx_adapter_free(1);
+	TEST_ASSERT(err == -EINVAL, "Expected -EINVAL %d got %d", -EINVAL, err);
+
+	return TEST_SUCCESS;
+}
+
+static int
+adapter_queue_add_del(void)
+{
+	int err;
+	struct rte_event ev;
+	uint32_t cap;
+
+	struct rte_event_eth_rx_adapter_queue_conf queue_config;
+
+	err = rte_event_eth_rx_adapter_caps_get(0, 0, &cap);
+	TEST_ASSERT(err == 0, "Expected 0 got %d", err);
+
+	ev.queue_id = 0;
+	ev.sched_type = RTE_SCHED_TYPE_ATOMIC;
+	ev.priority = 0;
+
+	queue_config.rx_queue_flags = 0;
+	if (!(cap & RTE_EVENT_ETH_RX_ADAPTER_CAP_FLOW_ID)) {
+		ev.flow_id = 1;
+		queue_config.rx_queue_flags =
+			RTE_EVENT_ETH_RX_ADAPTER_QUEUE_FLOW_ID_VALID;
+	}
+	queue_config.ev = ev;
+	queue_config.servicing_weight = 1;
+
+	err = rte_event_eth_rx_adapter_queue_add(0, rte_eth_dev_count(),
+					-1, &queue_config);
+	TEST_ASSERT(err == -EINVAL, "Expected -EINVAL got %d", err);
+
+	if (!(cap & RTE_EVENT_ETH_RX_ADAPTER_CAP_SINGLE_EVENTQ)) {
+		err = rte_event_eth_rx_adapter_queue_add(0, 0, 0,
+							&queue_config);
+		TEST_ASSERT(err == 0, "Expected 0 got %d", err);
+
+		err = rte_event_eth_rx_adapter_queue_del(0, 0, 0);
+		TEST_ASSERT(err == 0, "Expected 0 got %d", err);
+
+		err = rte_event_eth_rx_adapter_queue_add(0, 0, -1,
+							&queue_config);
+		TEST_ASSERT(err == 0, "Expected 0 got %d", err);
+
+		err = rte_event_eth_rx_adapter_queue_del(0, 0, -1);
+		TEST_ASSERT(err == 0, "Expected 0 got %d", err);
+	} else {
+		err = rte_event_eth_rx_adapter_queue_add(0, 0, 0,
+							&queue_config);
+		TEST_ASSERT(err == -EINVAL, "Expected EINVAL got %d", err);
+
+		err = rte_event_eth_rx_adapter_queue_add(0, 0, -1,
+							&queue_config);
+		TEST_ASSERT(err == 0, "Expected 0 got %d", err);
+
+		err = rte_event_eth_rx_adapter_queue_del(0, 0, 0);
+		TEST_ASSERT(err == 0, "Expected 0 got %d", err);
+
+		err = rte_event_eth_rx_adapter_queue_del(0, 0, -1);
+		TEST_ASSERT(err == 0, "Expected 0 got %d", err);
+
+		err = rte_event_eth_rx_adapter_queue_del(0, 0, -1);
+		TEST_ASSERT(err == 0, "Expected 0 got %d", err);
+	}
+
+	err = rte_event_eth_rx_adapter_queue_add(1, 0, -1, &queue_config);
+	TEST_ASSERT(err == -EINVAL, "Expected -EINVAL got %d", err);
+
+	err = rte_event_eth_rx_adapter_queue_del(1, 0, -1);
+	TEST_ASSERT(err == -EINVAL, "Expected -EINVAL got %d", err);
+
+	return TEST_SUCCESS;
+}
+
+static int
+adapter_start_stop(void)
+{
+	int err;
+	struct rte_event ev;
+
+	ev.queue_id = 0;
+	ev.sched_type = RTE_SCHED_TYPE_ATOMIC;
+	ev.priority = 0;
+
+	struct rte_event_eth_rx_adapter_queue_conf queue_config;
+
+	queue_config.rx_queue_flags = 0;
+	if (!(default_params.caps & RTE_EVENT_ETH_RX_ADAPTER_CAP_FLOW_ID)) {
+		ev.flow_id = 1;
+		queue_config.rx_queue_flags =
+			RTE_EVENT_ETH_RX_ADAPTER_QUEUE_FLOW_ID_VALID;
+	}
+
+	queue_config.ev = ev;
+	queue_config.servicing_weight = 1;
+
+	err = rte_event_eth_rx_adapter_queue_add(0, 0, -1, &queue_config);
+	TEST_ASSERT(err == 0, "Expected 0 got %d", err);
+
+	err = rte_event_eth_rx_adapter_start(0);
+	TEST_ASSERT(err == 0, "Expected 0 got %d", err);
+
+	err = rte_event_eth_rx_adapter_stop(0);
+	TEST_ASSERT(err == 0, "Expected 0 got %d", err);
+
+	err = rte_event_eth_rx_adapter_queue_del(0, 0, -1);
+	TEST_ASSERT(err == 0, "Expected 0 got %d", err);
+
+	err = rte_event_eth_rx_adapter_start(0);
+	TEST_ASSERT(err == 0, "Expected 0 got %d", err);
+
+	err = rte_event_eth_rx_adapter_stop(0);
+	TEST_ASSERT(err == 0, "Expected 0 got %d", err);
+
+	err = rte_event_eth_rx_adapter_start(1);
+	TEST_ASSERT(err == -EINVAL, "Expected -EINVAL got %d", err);
+
+	err = rte_event_eth_rx_adapter_stop(1);
+	TEST_ASSERT(err == -EINVAL, "Expected -EINVAL got %d", err);
+
+	return TEST_SUCCESS;
+}
+
+static int
+adapter_stats(void)
+{
+	int err;
+	struct rte_event_eth_rx_adapter_stats stats;
+
+	err = rte_event_eth_rx_adapter_stats_get(0, NULL);
+	TEST_ASSERT(err == -EINVAL, "Expected -EINVAL got %d", err);
+
+	err = rte_event_eth_rx_adapter_stats_get(0, &stats);
+	TEST_ASSERT(err == 0, "Expected 0 got %d", err);
+
+	err = rte_event_eth_rx_adapter_stats_get(1, &stats);
+	TEST_ASSERT(err == -EINVAL, "Expected -EINVAL got %d", err);
+
+	return TEST_SUCCESS;
+}
+
+static struct unit_test_suite service_tests  = {
+	.suite_name = "rx event eth adapter test suite",
+	.setup = testsuite_setup,
+	.teardown = testsuite_teardown,
+	.unit_test_cases = {
+		TEST_CASE_ST(NULL, NULL, adapter_create_free),
+		TEST_CASE_ST(adapter_create, adapter_free,
+					adapter_queue_add_del),
+		TEST_CASE_ST(adapter_create, adapter_free, adapter_start_stop),
+		TEST_CASE_ST(adapter_create, adapter_free, adapter_stats),
+		TEST_CASES_END() /**< NULL terminate unit test array */
+	}
+};
+
+static int
+test_event_eth_rx_adapter_common(void)
+{
+	return unit_test_suite_runner(&service_tests);
+}
+
+REGISTER_TEST_COMMAND(event_eth_rx_adapter_autotest,
+		test_event_eth_rx_adapter_common);
diff --git a/test/test/Makefile b/test/test/Makefile
index 42d9a49e2..011288219 100644
--- a/test/test/Makefile
+++ b/test/test/Makefile
@@ -204,6 +204,7 @@  SRCS-$(CONFIG_RTE_LIBRTE_CRYPTODEV) += test_cryptodev.c
 ifeq ($(CONFIG_RTE_LIBRTE_EVENTDEV),y)
 SRCS-y += test_eventdev.c
 SRCS-y += test_event_ring.c
+SRCS-y += test_event_eth_rx_adapter.c
 SRCS-$(CONFIG_RTE_LIBRTE_PMD_SW_EVENTDEV) += test_eventdev_sw.c
 SRCS-$(CONFIG_RTE_LIBRTE_PMD_OCTEONTX_SSOVF) += test_eventdev_octeontx.c
 endif