[dpdk-dev,/,RFC] ethdev: Allow rte_eth_dev_configure with zero RX/TX queues

Message ID 20160516113349.7d2a992f@miho (mailing list archive)
State Rejected, archived
Delegated to: Thomas Monjalon
Headers

Commit Message

Simon Kagstrom May 16, 2016, 9:33 a.m. UTC
  This allows releasing RX/TX queue memory.
---
We're using DPDK 16.04 and have a test suite which performs a sequence
of separate tests of the type

   allocate mempool
   rte_eth_dev_configure(port, n_rxq, n_txq, ...)
   setup rx/tx queues
   rte_eth_dev_start(port)

   <perform actual test>

   stop rx/tx queues
   rte_eth_dev_stop(port)

-> rte_eth_dev_configure(port, 0, 0, ...)
   
   check that there are no leaks from the mempool

The crucial point is the marked line above. This is done so that the
rx_queue_release/tx_queue_release callbacks in the PMD is called, so
that mbufs allocated by the driver is released.

Without this patch, this explicitly isn't allowed. Is there a particular
reason why it shouldn't? It was introduced in

  d505ba80a165a9735f3d9d3c6ab68a7bd85f271b

  "ethdev: support unidirectional configuration"

 lib/librte_ether/rte_ethdev.c | 5 -----
 1 file changed, 5 deletions(-)
  

Comments

Pattan, Reshma May 16, 2016, 10:24 a.m. UTC | #1
> -----Original Message-----
> From: Simon Kagstrom [mailto:simon.kagstrom@netinsight.net]
> Sent: Monday, May 16, 2016 10:34 AM
> To: dev@dpdk.org; thomas.monjalon@6wind.com; Pattan, Reshma
> <reshma.pattan@intel.com>
> Subject: [PATCH / RFC ] ethdev: Allow rte_eth_dev_configure with zero RX/TX
> queues
> 
> This allows releasing RX/TX queue memory.
> ---
> 
> Without this patch, this explicitly isn't allowed. Is there a particular reason why it
> shouldn't? It was introduced in
> 
>   d505ba80a165a9735f3d9d3c6ab68a7bd85f271b
> 
>   "ethdev: support unidirectional configuration"
> 
>  lib/librte_ether/rte_ethdev.c | 5 -----
>  1 file changed, 5 deletions(-)
> 
> diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c index
> a31018e..5481d45 100644
> --- a/lib/librte_ether/rte_ethdev.c
> +++ b/lib/librte_ether/rte_ethdev.c
> @@ -944,11 +944,6 @@ rte_eth_dev_configure(uint8_t port_id, uint16_t
> nb_rx_q, uint16_t nb_tx_q,
>  	 */
>  	(*dev->dev_ops->dev_infos_get)(dev, &dev_info);
> 
> -	if (nb_rx_q == 0 && nb_tx_q == 0) {
> -		RTE_PMD_DEBUG_TRACE("ethdev port_id=%d both rx and tx
> queue cannot be 0\n", port_id);
> -		return -EINVAL;
> -	}
> -

This was added to allow devices,  at least with one direction (RX/TX)  supported. As, devices with both directions disabled doesn't make  sense right?

Thanks,
Reshma
  
Simon Kagstrom May 16, 2016, 10:32 a.m. UTC | #2
On 2016-05-16 12:24, Pattan, Reshma wrote:
>> diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c index
>> a31018e..5481d45 100644
>> --- a/lib/librte_ether/rte_ethdev.c
>> +++ b/lib/librte_ether/rte_ethdev.c
>> @@ -944,11 +944,6 @@ rte_eth_dev_configure(uint8_t port_id, uint16_t
>> nb_rx_q, uint16_t nb_tx_q,
>>  	 */
>>  	(*dev->dev_ops->dev_infos_get)(dev, &dev_info);
>>
>> -	if (nb_rx_q == 0 && nb_tx_q == 0) {
>> -		RTE_PMD_DEBUG_TRACE("ethdev port_id=%d both rx and tx
>> queue cannot be 0\n", port_id);
>> -		return -EINVAL;
>> -	}
> 
> This was added to allow devices,  at least with one direction (RX/TX)  supported. As, devices with both directions disabled doesn't make  sense right?

Well, not for running them, no. But this is a part of the shutdown
procedure between tests (I should have been more clear I guess).

As far as I can see in the code, rte_eth_dev_configure() is the only
point which actually calls {rx,tx}_queue_release(), so without this
call, we can't get the memory pool full again.


So basically, our test suite looks like

  rte_eth_dev_configure(port, 32, 32); // For example
  <run a test>
  rte_eth_dev_configure(port, 0, 0);
  Check that the mempool is full again

  rte_eth_dev_configure(port, 32, 32);
  <run another test>
  rte_eth_dev_configure(port, 0, 0);
  Check that the mempool is full again
  ...

And without this fix, the mempool check fails since a few of the buffers
are tied up in the RX descriptor ring of the PMD.

// Simon
  
Pattan, Reshma May 16, 2016, 12:43 p.m. UTC | #3
> -----Original Message-----
> From: Simon Kågström [mailto:simon.kagstrom@netinsight.net]
> Sent: Monday, May 16, 2016 11:33 AM
> To: Pattan, Reshma <reshma.pattan@intel.com>; dev@dpdk.org;
> thomas.monjalon@6wind.com
> Subject: Re: [PATCH / RFC ] ethdev: Allow rte_eth_dev_configure with zero
> RX/TX queues
> 
> On 2016-05-16 12:24, Pattan, Reshma wrote:
> >> diff --git a/lib/librte_ether/rte_ethdev.c
> >> b/lib/librte_ether/rte_ethdev.c index
> >> a31018e..5481d45 100644
> >> --- a/lib/librte_ether/rte_ethdev.c
> >> +++ b/lib/librte_ether/rte_ethdev.c
> >> @@ -944,11 +944,6 @@ rte_eth_dev_configure(uint8_t port_id, uint16_t
> >> nb_rx_q, uint16_t nb_tx_q,
> >>  	 */
> >>  	(*dev->dev_ops->dev_infos_get)(dev, &dev_info);
> >>
> >> -	if (nb_rx_q == 0 && nb_tx_q == 0) {
> >> -		RTE_PMD_DEBUG_TRACE("ethdev port_id=%d both rx and tx
> >> queue cannot be 0\n", port_id);
> >> -		return -EINVAL;
> >> -	}
> >
> > This was added to allow devices,  at least with one direction (RX/TX)
> supported. As, devices with both directions disabled doesn't make  sense right?
> 
> Well, not for running them, no. But this is a part of the shutdown procedure
> between tests (I should have been more clear I guess).
> 

Yes I understood this. But I am not sure if you can use rte_eth_dev_configure(port, 0, 0) to free the resources.
Can you check if you can use rte_eth_dev_rx_queue_stop/ rte_eth_dev_tx_queue_stop to achieve the same, because they do take care of
releasing mbufs, but doesn't free the queue's sw-ring and queue.

Thanks,
Reshma
  
Simon Kagstrom May 16, 2016, 1:16 p.m. UTC | #4
On 2016-05-16 14:43, Pattan, Reshma wrote:
>>> This was added to allow devices,  at least with one direction (RX/TX)
>> supported. As, devices with both directions disabled doesn't make  sense right?
>>
>> Well, not for running them, no. But this is a part of the shutdown procedure
>> between tests (I should have been more clear I guess).
> 
> Yes I understood this. But I am not sure if you can use rte_eth_dev_configure(port, 0, 0) to free the resources.
> Can you check if you can use rte_eth_dev_rx_queue_stop/ rte_eth_dev_tx_queue_stop to achieve the same, because they do take care of
> releasing mbufs, but doesn't free the queue's sw-ring and queue.

But isn't that very strange behavior. Aren't the descriptor rings
allocated in rx_queue_setup()? If so, the sequence

  rx_queue_stop(); // Release buffers
  rx_queue_start();

would leave the descriptor ring empty after start, i.e., not able to
receive data.

// Simon
  
Simon Kagstrom May 20, 2016, 6:29 a.m. UTC | #5
Ping? Any more comments on this?

// Simon

On 2016-05-16 15:16, Simon Kågström wrote:
> On 2016-05-16 14:43, Pattan, Reshma wrote:
>>>> This was added to allow devices,  at least with one direction (RX/TX)
>>> supported. As, devices with both directions disabled doesn't make  sense right?
>>>
>>> Well, not for running them, no. But this is a part of the shutdown procedure
>>> between tests (I should have been more clear I guess).
>>
>> Yes I understood this. But I am not sure if you can use rte_eth_dev_configure(port, 0, 0) to free the resources.
>> Can you check if you can use rte_eth_dev_rx_queue_stop/ rte_eth_dev_tx_queue_stop to achieve the same, because they do take care of
>> releasing mbufs, but doesn't free the queue's sw-ring and queue.
> 
> But isn't that very strange behavior. Aren't the descriptor rings
> allocated in rx_queue_setup()? If so, the sequence
> 
>   rx_queue_stop(); // Release buffers
>   rx_queue_start();
> 
> would leave the descriptor ring empty after start, i.e., not able to
> receive data.
> 
> // Simon
>
  
Pattan, Reshma May 20, 2016, 8:26 a.m. UTC | #6
> -----Original Message-----
> From: Simon Kågström [mailto:simon.kagstrom@netinsight.net]
> Sent: Friday, May 20, 2016 7:30 AM
> To: Pattan, Reshma <reshma.pattan@intel.com>; dev@dpdk.org;
> thomas.monjalon@6wind.com
> Subject: Re: [dpdk-dev] [PATCH / RFC ] ethdev: Allow rte_eth_dev_configure
> with zero RX/TX queues
> 
> Ping? Any more comments on this?
> 

Hi, I don't have any objections, just let's wait if any other comments from committee. 

Thanks,
Reshma

> // Simon
> 
> On 2016-05-16 15:16, Simon Kågström wrote:
> > On 2016-05-16 14:43, Pattan, Reshma wrote:
> >>>> This was added to allow devices,  at least with one direction
> >>>> (RX/TX)
> >>> supported. As, devices with both directions disabled doesn't make  sense
> right?
> >>>
> >>> Well, not for running them, no. But this is a part of the shutdown
> >>> procedure between tests (I should have been more clear I guess).
> >>
> >> Yes I understood this. But I am not sure if you can use
> rte_eth_dev_configure(port, 0, 0) to free the resources.
> >> Can you check if you can use rte_eth_dev_rx_queue_stop/
> >> rte_eth_dev_tx_queue_stop to achieve the same, because they do take care
> of releasing mbufs, but doesn't free the queue's sw-ring and queue.
> >
> > But isn't that very strange behavior. Aren't the descriptor rings
> > allocated in rx_queue_setup()? If so, the sequence
> >
> >   rx_queue_stop(); // Release buffers
> >   rx_queue_start();
> >
> > would leave the descriptor ring empty after start, i.e., not able to
> > receive data.
> >
> > // Simon
> >
  
Thomas Monjalon June 23, 2016, 3:53 p.m. UTC | #7
2016-05-16 11:33, Simon Kagstrom:
> This allows releasing RX/TX queue memory.
> ---
> We're using DPDK 16.04 and have a test suite which performs a sequence
> of separate tests of the type
> 
>    allocate mempool
>    rte_eth_dev_configure(port, n_rxq, n_txq, ...)
>    setup rx/tx queues
>    rte_eth_dev_start(port)
> 
>    <perform actual test>
> 
>    stop rx/tx queues
>    rte_eth_dev_stop(port)
> 
> -> rte_eth_dev_configure(port, 0, 0, ...)
>    
>    check that there are no leaks from the mempool
> 
> The crucial point is the marked line above. This is done so that the
> rx_queue_release/tx_queue_release callbacks in the PMD is called, so
> that mbufs allocated by the driver is released.

I think you are trying to use a side effect of rte_eth_dev_configure().
After calling rte_eth_dev_stop(), I would say the clean-up should be done
by rte_eth_dev_close().
Why not using close?
  
Ferruh Yigit Dec. 20, 2018, 11:34 p.m. UTC | #8
On 6/23/2016 4:53 PM, thomas.monjalon at 6wind.com (Thomas Monjalon) wrote:
> 2016-05-16 11:33, Simon Kagstrom:
>> This allows releasing RX/TX queue memory.
>> ---
>> We're using DPDK 16.04 and have a test suite which performs a sequence
>> of separate tests of the type
>>
>>    allocate mempool
>>    rte_eth_dev_configure(port, n_rxq, n_txq, ...)
>>    setup rx/tx queues
>>    rte_eth_dev_start(port)
>>
>>    <perform actual test>
>>
>>    stop rx/tx queues
>>    rte_eth_dev_stop(port)
>>
>> -> rte_eth_dev_configure(port, 0, 0, ...)
>>    
>>    check that there are no leaks from the mempool
>>
>> The crucial point is the marked line above. This is done so that the
>> rx_queue_release/tx_queue_release callbacks in the PMD is called, so
>> that mbufs allocated by the driver is released.
> 
> I think you are trying to use a side effect of rte_eth_dev_configure().
> After calling rte_eth_dev_stop(), I would say the clean-up should be done
> by rte_eth_dev_close().
> Why not using close?
> 

Hi Simon,

This patch is in patchwork for a long time without response, updating its status
as rejected, if it is still relevant please let us know.
  

Patch

diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
index a31018e..5481d45 100644
--- a/lib/librte_ether/rte_ethdev.c
+++ b/lib/librte_ether/rte_ethdev.c
@@ -944,11 +944,6 @@  rte_eth_dev_configure(uint8_t port_id, uint16_t nb_rx_q, uint16_t nb_tx_q,
 	 */
 	(*dev->dev_ops->dev_infos_get)(dev, &dev_info);
 
-	if (nb_rx_q == 0 && nb_tx_q == 0) {
-		RTE_PMD_DEBUG_TRACE("ethdev port_id=%d both rx and tx queue cannot be 0\n", port_id);
-		return -EINVAL;
-	}
-
 	if (nb_rx_q > dev_info.max_rx_queues) {
 		RTE_PMD_DEBUG_TRACE("ethdev port_id=%d nb_rx_queues=%d > %d\n",
 				port_id, nb_rx_q, dev_info.max_rx_queues);