From e2195ac505bd423d3d2f973bbe94da1c78296aa6 Mon Sep 17 00:00:00 2001 From: Alex Williams Date: Fri, 31 Aug 2018 11:35:07 -0700 Subject: transport: Add blocking recv calls to uhd-dpdk This adds an internal wait queue API to uhd-dpdk. Socket configuration requests had their blocking calls re-implemented on top of this API, and it is also used to service requests to wait on RX packets (w/ timeout). The wait API involves a multi-producer, single-consumer queue per I/O thread (waiter_ring), with a condition variable used for sleeping. The data structure is shared between user thread and I/O thread, and because timeouts make resource release time non-deterministic, we use reference counting on the shared resource. One reference is generated by the user thread and passed to the I/O thread to consume. A user thread that still needs the data after waking must get() another reference, to postpone the destruction of the resource until it is done. Timeouts are based on CLOCK_MONOTONIC. For recv, a timeout of 0 indicates blocking indefinitely, and a negative timeout indicates no timeout is desired. Also drop timeout for closing sockets in uhd-dpdk. The timeout would allow a user thread to pre-empt the I/O thread's cleanup process. The user thread would free data structures the I/O thread still needed to function. Since this timeout is superfluous anyway, let's just get rid of it. Also add some more input checking and error reporting. --- host/lib/include/uhd/transport/uhd-dpdk.h | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) (limited to 'host/lib/include') diff --git a/host/lib/include/uhd/transport/uhd-dpdk.h b/host/lib/include/uhd/transport/uhd-dpdk.h index 68438fe40..8d46912bd 100644 --- a/host/lib/include/uhd/transport/uhd-dpdk.h +++ b/host/lib/include/uhd/transport/uhd-dpdk.h @@ -148,10 +148,11 @@ int uhd_dpdk_destroy(void); * @param sock pointer to socket * @param bufs pointer to array of buffers (to store buffer locations) * @param num_bufs number of buffers requested + * @param timeout Time (in us) to wait for a buffer * * @return Returns number of buffers retrieved or negative error code */ -int uhd_dpdk_request_tx_bufs(struct uhd_dpdk_socket *sock, struct rte_mbuf **bufs, unsigned int num_bufs); +int uhd_dpdk_request_tx_bufs(struct uhd_dpdk_socket *sock, struct rte_mbuf **bufs, unsigned int num_bufs, int timeout); /** * Enqueues num_bufs buffers in sock TX buffer. Uses pointers to buffers in bufs table. @@ -241,7 +242,18 @@ int uhd_dpdk_udp_get_info(struct uhd_dpdk_socket *sock, struct uhd_dpdk_sockarg_ * * @return Return 0 for success, else failed */ -int uhd_dpdk_get_drop_count(struct uhd_dpdk_socket *sock, uint32_t *count); +int uhd_dpdk_get_drop_count(struct uhd_dpdk_socket *sock, size_t *count); + +/** + * Get transferred packet count of provided socket + * Currently only tracks received packets (i.e. for RX) + * + * @param sock Socket to get information from + * @param count Pointer to location where information will be stored + * + * @return Return 0 for success, else failed + */ +int uhd_dpdk_get_xfer_count(struct uhd_dpdk_socket *sock, size_t *count); #ifdef __cplusplus } -- cgit v1.2.3