diff options
Diffstat (limited to 'host/lib')
| -rw-r--r-- | host/lib/usrp/mpmd/mpmd_impl.hpp | 28 | ||||
| -rw-r--r-- | host/lib/usrp/mpmd/mpmd_mboard_impl.cpp | 40 | ||||
| -rw-r--r-- | host/lib/usrp/mpmd/mpmd_prop_tree.cpp | 13 | 
3 files changed, 67 insertions, 14 deletions
| diff --git a/host/lib/usrp/mpmd/mpmd_impl.hpp b/host/lib/usrp/mpmd/mpmd_impl.hpp index cf0dad484..f74627afa 100644 --- a/host/lib/usrp/mpmd/mpmd_impl.hpp +++ b/host/lib/usrp/mpmd/mpmd_impl.hpp @@ -130,6 +130,23 @@ public:      uhd::device_addr_t get_rx_hints() const;      uhd::device_addr_t get_tx_hints() const; +    /*! Setting this flag will enable a mode where a reclaim failure is +     *  acceptable. +     * +     * The only legitimate time to do this is when a procedure is called that +     * can cause communication with the RPC server to be interrupted +     * legitimately, but non-critically. For example, when updating the FPGA +     * image, the RPC server gets rebooted, but the claim loop is running in a +     * separate thread, and needs some kind of flag to be notified that +     * something is up. +     */ +    void allow_claim_failure(const bool allow) { +        if (allow) { +            _allow_claim_failure_latch = true; +        } +        _allow_claim_failure_flag = allow; +    } +  private:      /*! Reference to the RPC client that handles claiming       */ @@ -171,6 +188,17 @@ private:      uhd::mpmd::xport::mpmd_xport_mgr::uptr _xport_mgr;      uhd::device_addr_t send_args;      uhd::device_addr_t recv_args; + +    /*! This flag is only used within the claim() function. Go look there if you +     * really need to know what it does. +     */ +    std::atomic<bool> _allow_claim_failure_flag{false}; + +    /*! This flag is only used within the claim() function. Go look there if you +     * really need to know what it does. +     */ +    std::atomic<bool> _allow_claim_failure_latch{false}; +  }; diff --git a/host/lib/usrp/mpmd/mpmd_mboard_impl.cpp b/host/lib/usrp/mpmd/mpmd_mboard_impl.cpp index 11404ffaf..da4f99794 100644 --- a/host/lib/usrp/mpmd/mpmd_mboard_impl.cpp +++ b/host/lib/usrp/mpmd/mpmd_mboard_impl.cpp @@ -1,5 +1,6 @@  //  // Copyright 2017 Ettus Research, a National Instruments Company +// Copyright 2019 Ettus Research, a National Instruments Brand  //  // SPDX-License-Identifier: GPL-3.0-or-later  // @@ -301,12 +302,7 @@ mpmd_mboard_impl::mpmd_mboard_impl(  mpmd_mboard_impl::~mpmd_mboard_impl()  { -    try { -        dump_logs(); -    } catch (...) { -        UHD_LOG_WARNING("MPMD", "Could not flush log queue on exit!"); -    } -    UHD_SAFE_CALL(if (not rpc->request_with_token<bool>("unclaim")) { +    UHD_SAFE_CALL(dump_logs(); if (not rpc->request_with_token<bool>("unclaim")) {          UHD_LOG_WARNING("MPMD", "Failure to ack unclaim!");      });  } @@ -398,10 +394,25 @@ uhd::device_addr_t mpmd_mboard_impl::get_tx_hints() const  bool mpmd_mboard_impl::claim()  {      try { -        return _claim_rpc->request_with_token<bool>("reclaim"); -    } catch (...) { -        UHD_LOG_WARNING("MPMD", "Reclaim failed. Exiting claimer loop."); -        return false; +        auto result = _claim_rpc->request_with_token<bool>("reclaim"); +        // When _allow_claim_failure_flag goes from true to false, we still have +        // to wait for a successful reclaim before we can also set +        // _allow_claim_failure_latch to false, because we have no way of +        // synchronizing those events. +        // In other words, we might be setting allow_claim_failure back to false +        // too soon, but we have no way of knowing exactly when the right time +        // is. +        _allow_claim_failure_latch = _allow_claim_failure_flag.load(); +        return result; +    } catch (const uhd::runtime_error& ex) { +        // Note: Any RPC error will raise a uhd::runtime_error. Other errors are +        // not handled here. +        if (_allow_claim_failure_latch) { +            UHD_LOG_DEBUG("MPMD", ex.what()); +        } else { +            UHD_LOG_WARNING("MPMD", ex.what()); +        } +        return _allow_claim_failure_latch;      }  } @@ -420,8 +431,13 @@ uhd::task::sptr mpmd_mboard_impl::claim_device_and_make_task()          auto now = std::chrono::steady_clock::now();          if (not this->claim()) {              throw uhd::value_error("mpmd device reclaiming loop failed!"); -        }; -        this->dump_logs(); +        } else { +            try { +                this->dump_logs(); +            } catch(const uhd::runtime_error&) { +                UHD_LOG_WARNING("MPMD", "Could not read back log queue!"); +            } +        }          std::this_thread::sleep_until(              now + std::chrono::milliseconds(MPMD_RECLAIM_INTERVAL_MS));      }); diff --git a/host/lib/usrp/mpmd/mpmd_prop_tree.cpp b/host/lib/usrp/mpmd/mpmd_prop_tree.cpp index e1b5d43cb..f00008971 100644 --- a/host/lib/usrp/mpmd/mpmd_prop_tree.cpp +++ b/host/lib/usrp/mpmd/mpmd_prop_tree.cpp @@ -1,5 +1,6 @@  //  // Copyright 2018 Ettus Research, a National Instruments Company +// Copyright 2019 Ettus Research, a National Instruments Brand  //  // SPDX-License-Identifier: GPL-3.0-or-later  // @@ -178,8 +179,16 @@ void mpmd_impl::init_property_tree(      for (const auto& comp_name : updateable_components) {          UHD_LOG_TRACE("MPMD", "Adding motherboard component: " << comp_name);          tree->create<uhd::usrp::component_files_t>(mb_path / "components" / comp_name) -            .set_coercer([mb](const uhd::usrp::component_files_t& comp_files) { -                return _update_component(comp_files, mb); +            .set_coercer([mb, comp_name](const uhd::usrp::component_files_t& comp_files) { +                auto comp_info = _get_component_info(comp_name, mb)[0]; +                if (comp_info.metadata.get("reset", "") == "True") { +                    UHD_LOG_DEBUG( +                        "MPMD", "Bracing for potential loss of RPC server connection."); +                    mb->allow_claim_failure(true); +                } +                auto result = _update_component(comp_files, mb); +                mb->allow_claim_failure(false); +                return result;              })              .set_publisher([mb, comp_name]() {                  return _get_component_info(comp_name, mb); | 
