Thread (43 messages) 43 messages, 7 authors, 2016-03-11

Re: [PATCH 1/2] ethdev: add buffered tx api

From: Ivan Boule <hidden>
Date: 2016-02-12 16:40:18

On 02/12/2016 12:44 PM, Ananyev, Konstantin wrote:
quoted
quoted
-----Original Message-----
...
quoted
In that case we don't need to make any changes at rte_ethdev.[h,c] to alloc/free/maintain tx_buffer inside each queue...
It all will be upper layer responsibility.
So no need to modify existing rte_ethdev structures/code.
Again, no need for error callback - caller would check return value and decide what to do with unsent packets in the tx_buffer.
Just to summarise why I think it is better to have tx buffering managed on the app level:

1. avoid any ABI change.
2. Avoid extra changes in rte_ethdev.c: tx_queue_setup/tx_queue_stop.
3. Provides much more flexibility to the user:
    a) where to allocate space for tx_buffer (stack, heap, hugepages, etc).
    b) user can mix and match plain tx_burst() and   tx_buffer/tx_buffer_flush()
         in any way he fills it appropriate.
    c) user can change the size of tx_buffer without stop/re-config/start queue:
         just allocate new larger(smaller) tx_buffer & copy contents to the new one.
    d) user can preserve buffered packets through device restart circle:
         i.e if let say TX hang happened, and user has to do dev_stop/dev_start -
         contents of tx_buffer will stay unchanged and its contents could be
         (re-)transmitted after device is up again, or  through different port/queue if needed.

As a drawbacks mentioned - tx error handling becomes less transparent...
But we can add error handling routine and it's user provided parameter
into struct rte_eth_dev_tx_buffer', something like that:

+struct rte_eth_dev_tx_buffer {
+	buffer_tx_error_fn cbfn;
+	void *userdata;
+	unsigned nb_pkts;
+	uint64_t errors;
+	/**< Total number of queue packets to sent that are dropped. */
+	struct rte_mbuf *pkts[];
+};

Konstantin
Just to enforce Konstantin's comments.
As a very basic - not to say fundamental - rule, one should avoid adding 
in the PMD RX/TX API any extra processing that can be handled at a 
higher level.
The only and self-sufficient reason is that we must avoid impacting 
performances on the critical path, in particular for those - usually the 
majority of - applications that do not need such extra operations, or 
better implement them at upper level.

Maybe in a not so far future will come a proposal for forking a new open 
source fast-dpdk project aiming at providing API simplicity, 
zero-overhead, modular design, and all those nice properties that every 
one claims to seek :-)

Ivan
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help