From 33ddbbb25702cab0fb271367e4ffd9563a6c75f5 Mon Sep 17 00:00:00 2001 From: Martin Braun Date: Fri, 5 Jan 2018 18:08:07 -0800 Subject: mpmd: Refactor device initialization for better parallelizability Note: This doesn't add any concurrency, rather, it changes the structure of the code to allow that. Notable changes: - All prop tree inits in one place - No access to containers in methods that might be run in parallel - Split initialization and claiming in mpmd_mboard_impl, calling ctor will no longer run the full initialization. - Added comments to identify parallelizable spots --- host/lib/usrp/mpmd/mpmd_mboard_impl.cpp | 34 +++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) (limited to 'host/lib/usrp/mpmd/mpmd_mboard_impl.cpp') diff --git a/host/lib/usrp/mpmd/mpmd_mboard_impl.cpp b/host/lib/usrp/mpmd/mpmd_mboard_impl.cpp index 0ca996d28..59983414a 100644 --- a/host/lib/usrp/mpmd/mpmd_mboard_impl.cpp +++ b/host/lib/usrp/mpmd/mpmd_mboard_impl.cpp @@ -111,12 +111,16 @@ mpmd_mboard_impl::mpmd_mboard_impl( mpmd_impl::MPM_RPC_PORT ), mpmd_impl::MPM_RPC_GET_LAST_ERROR_CMD)) + , num_xbars(rpc->request("get_num_xbars")) + // xbar_local_addrs is not yet valid after this! + , xbar_local_addrs(num_xbars, 0xFF) , _xport_mgr(xport::mpmd_xport_mgr::make(mb_args)) { UHD_LOGGER_TRACE("MPMD") << "Initializing mboard, connecting to RPC server address: " << rpc_server_addr << " mboard args: " << mb_args.to_string() + << " number of crossbars: " << num_xbars ; _claimer_task = claim_device_and_make_task(rpc, mb_args); @@ -124,22 +128,16 @@ mpmd_mboard_impl::mpmd_mboard_impl( measure_rpc_latency(rpc, MPMD_MEAS_LATENCY_DURATION); } - // No one else can now claim the device. - if (mb_args_.has_key("skip_init")) { - UHD_LOG_DEBUG("MPMD", "Claimed device, but skipped init."); - return; - } - - init_device(rpc, mb_args); - // RFNoC block clocks are now on. Noc-IDs can be read back. - - auto device_info_dict = rpc->request("get_device_info"); + /// Get device info + const auto device_info_dict = rpc->request("get_device_info"); for (const auto &info_pair : device_info_dict) { device_info[info_pair.first] = info_pair.second; } UHD_LOGGER_TRACE("MPMD") << "MPM reports device info: " << device_info.to_string(); - auto dboards_info = rpc->request>("get_dboard_info"); + /// Get dboard info + const auto dboards_info = + rpc->request>("get_dboard_info"); UHD_ASSERT_THROW(this->dboard_info.size() == 0); for (const auto &dboard_info_dict : dboards_info) { uhd::device_addr_t this_db_info; @@ -151,11 +149,6 @@ mpmd_mboard_impl::mpmd_mboard_impl( << ": " << this_db_info.to_string(); this->dboard_info.push_back(this_db_info); } - - // Initialize properties - this->num_xbars = rpc->request("get_num_xbars"); - // xbar_local_addrs is not yet valid after this! - this->xbar_local_addrs.resize(this->num_xbars, 0xFF); } mpmd_mboard_impl::~mpmd_mboard_impl() @@ -167,6 +160,15 @@ mpmd_mboard_impl::~mpmd_mboard_impl() ); } +/***************************************************************************** + * Init + ****************************************************************************/ +void mpmd_mboard_impl::init() +{ + init_device(rpc, mb_args); + // RFNoC block clocks are now on. Noc-IDs can be read back. +} + /***************************************************************************** * API ****************************************************************************/ -- cgit v1.2.3