From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail.droids-corp.org (zoll.droids-corp.org [94.23.50.67]) by dpdk.org (Postfix) with ESMTP id AA8EDB5EC for ; Mon, 16 Feb 2015 15:33:58 +0100 (CET) Received: from was59-1-82-226-113-214.fbx.proxad.net ([82.226.113.214] helo=[192.168.0.10]) by mail.droids-corp.org with esmtpsa (TLS1.2:DHE_RSA_AES_128_CBC_SHA1:128) (Exim 4.80) (envelope-from ) id 1YNMnp-00077v-Ck; Mon, 16 Feb 2015 15:37:48 +0100 Message-ID: <54E1FFC4.1060605@6wind.com> Date: Mon, 16 Feb 2015 15:33:40 +0100 From: Olivier MATZ User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Icedove/31.3.0 MIME-Version: 1.0 To: John McNamara , dev@dpdk.org References: <1419266844-4848-1-git-send-email-bruce.richardson@intel.com> <1423841989-9090-1-git-send-email-john.mcnamara@intel.com> <1423841989-9090-4-git-send-email-john.mcnamara@intel.com> In-Reply-To: <1423841989-9090-4-git-send-email-john.mcnamara@intel.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit Subject: Re: [dpdk-dev] [PATCH v2 3/4] examples: example showing use of callbacks. X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 16 Feb 2015 14:33:58 -0000 Hi John, On 02/13/2015 04:39 PM, John McNamara wrote: > From: Richardson, Bruce > > Example showing how callbacks can be used to insert a timestamp > into each packet on RX. On TX the timestamp is used to calculate > the packet latency through the app, in cycles. > > Signed-off-by: Bruce Richardson I'm looking at the example and I don't understand what is the advantage of having callbacks in ethdev layer, knowing that the application can do the same job by a standard function call. What is the advantage of having callbacks compared to: for (port = 0; port < nb_ports; port++) { struct rte_mbuf *bufs[BURST_SIZE]; const uint16_t nb_rx = rte_eth_rx_burst(port, 0, bufs, BURST_SIZE); if (unlikely(nb_rx == 0)) continue; add_timestamp(bufs, nb_rx); const uint16_t nb_tx = rte_eth_tx_burst(port ^ 1, 0, bufs, nb_rx); calc_latency(bufs, nb_tx); if (unlikely(nb_tx < nb_rx)) { uint16_t buf; for (buf = nb_tx; buf < nb_rx; buf++) rte_pktmbuf_free(bufs[buf]); } } To me, doing like the code above has several advantages: - code is more readable: the callback is explicitly invoked, so there is no risk to forget it - code is faster: the functions calls can be inlined by the compiler - easier to handle error cases in the callback function as the error code is accessible to the application - there is no need to add code in ethdev api to do this - if the application does not want to use callbacks (I suppose most applications), it won't have any performance impact Regards, Olivier