From fd3f5d011fb99304402cbf3c1e8c596478316119 Mon Sep 17 00:00:00 2001 From: Ciro Nishiguchi Date: Sat, 27 Oct 2018 11:10:26 -0500 Subject: tests: Add benchmark of streaming code paths Add a benchmark of packet handlers and device3 flow control. Benchmarks use mock transport objects. --- host/tests/common/mock_zero_copy.hpp | 82 ++++++++++++++++++++++++++++++++---- 1 file changed, 74 insertions(+), 8 deletions(-) (limited to 'host/tests/common/mock_zero_copy.hpp') diff --git a/host/tests/common/mock_zero_copy.hpp b/host/tests/common/mock_zero_copy.hpp index 867300ac5..8d27c9b46 100644 --- a/host/tests/common/mock_zero_copy.hpp +++ b/host/tests/common/mock_zero_copy.hpp @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -29,8 +30,8 @@ * Tx and Rx are separate. We can access the other end of the FIFOs from * this class. */ -static constexpr size_t SEND_BUFF_SIZE = 1024; -static constexpr size_t RECV_BUFF_SIZE = 1024; +static constexpr size_t DEFAULT_SEND_FRAME_SIZE = 1024; +static constexpr size_t DEFAULT_RECV_FRAME_SIZE = 1024; /*********************************************************************** * Dummy managed buffers for testing @@ -68,15 +69,28 @@ class mock_zero_copy : public uhd::transport::zero_copy_if { public: typedef boost::shared_ptr sptr; - mock_zero_copy(uhd::transport::vrt::if_packet_info_t::link_type_t type); + mock_zero_copy( + uhd::transport::vrt::if_packet_info_t::link_type_t type, + size_t recv_frame_size = DEFAULT_RECV_FRAME_SIZE, + size_t send_frame_size = DEFAULT_SEND_FRAME_SIZE + ); uhd::transport::managed_recv_buffer::sptr get_recv_buff(double); uhd::transport::managed_send_buffer::sptr get_send_buff(double); size_t get_num_recv_frames(void) const { return 1; } size_t get_num_send_frames(void) const { return 1; } - size_t get_recv_frame_size(void) const { return RECV_BUFF_SIZE; } - size_t get_send_frame_size(void) const { return SEND_BUFF_SIZE; } + size_t get_recv_frame_size(void) const { return _recv_frame_size; } + size_t get_send_frame_size(void) const { return _send_frame_size; } + + template + void push_back_packet( + uhd::transport::vrt::if_packet_info_t& ifpi, + const std::vector& otw_data = std::vector(), + uhd::endianness_t endianness = uhd::ENDIANNESS_BIG); + + void set_reuse_recv_memory(bool reuse_recv); + void set_reuse_send_memory(bool reuse_send); void set_simulate_io_error(bool status) { _simulate_io_error = status; } @@ -92,6 +106,13 @@ class mock_zero_copy : public uhd::transport::zero_copy_if { const uint32_t message ); + template + void push_back_flow_ctrl_packet( + uhd::transport::vrt::if_packet_info_t::packet_type_t type, + uint32_t packet_count, + uint32_t byte_count + ); + template void pop_send_packet( uhd::transport::vrt::if_packet_info_t &ifpi @@ -104,11 +125,18 @@ class mock_zero_copy : public uhd::transport::zero_copy_if { std::list> _rx_mems; std::list _rx_lens; - std::vector> _msbs; - std::vector> _mrbs; + mock_msb _msb; + mock_mrb _mrb; uhd::transport::vrt::if_packet_info_t::link_type_t _link_type; + size_t _recv_frame_size = DEFAULT_RECV_FRAME_SIZE; + size_t _send_frame_size = DEFAULT_RECV_FRAME_SIZE; + bool _simulate_io_error = false; + + bool _reuse_recv_memory = false; + bool _reuse_send_memory = false; + }; template @@ -130,7 +158,7 @@ void mock_zero_copy::push_back_recv_packet( const size_t max_pkt_len = ifpi.num_payload_words32*sizeof(uint32_t)+max_hdr_len; - UHD_ASSERT_THROW(max_pkt_len <= RECV_BUFF_SIZE); + UHD_ASSERT_THROW(max_pkt_len <= _recv_frame_size); // Create recv buffer _rx_mems.push_back(boost::shared_array(new uint8_t[max_pkt_len])); @@ -199,4 +227,42 @@ void mock_zero_copy::pop_send_packet( _tx_lens.pop_front(); } +template +void mock_zero_copy::push_back_flow_ctrl_packet( + uhd::transport::vrt::if_packet_info_t::packet_type_t type, + uint32_t packet_count, + uint32_t byte_count +) +{ + using namespace uhd::transport; + + UHD_ASSERT_THROW( + type == vrt::if_packet_info_t::PACKET_TYPE_FC or + type == vrt::if_packet_info_t::PACKET_TYPE_ACK); + + // Only implemented for chdr packets currently + UHD_ASSERT_THROW(_link_type == vrt::if_packet_info_t::LINK_TYPE_CHDR); + + const size_t packet_len_in_words32 = 2; + + vrt::if_packet_info_t ifpi; + ifpi.packet_type = type; + ifpi.num_payload_words32 = packet_len_in_words32; + ifpi.num_payload_bytes = ifpi.num_payload_words32*sizeof(uint32_t); + ifpi.has_tsf = false; + + std::vector data(packet_len_in_words32, 0); + + if (endianness == uhd::ENDIANNESS_BIG) { + data[0] = uhd::ntohx(packet_count); + data[1] = uhd::ntohx(byte_count); + } + else { + data[0] = uhd::wtohx(packet_count); + data[1] = uhd::wtohx(byte_count); + } + + push_back_recv_packet(ifpi, data); +} + #endif /*INCLUDED_MOCK_XPORT_HPP*/ -- cgit v1.2.3