Fix nr_phy_test TSAN warnings

This commit is contained in:
Xavier Arteaga 2021-07-16 17:08:02 +02:00 committed by Xavier Arteaga
parent 64f4767c4f
commit b264f8fa1e
6 changed files with 58 additions and 23 deletions

View File

@ -67,7 +67,6 @@ bool slot_worker::init(const args_t& args)
return false;
}
// Prepare UL arguments
srsran_gnb_ul_args_t ul_args = {};
ul_args.pusch.measure_time = true;

View File

@ -7,6 +7,9 @@
#
if (RF_FOUND AND ENABLE_SRSUE AND ENABLE_SRSENB)
set(NR_PHY_TEST_GNB_NOF_THREADS 3)
set(NR_PHY_TEST_UE_NOF_THREADS 3)
add_executable(nr_phy_test nr_phy_test.cc)
target_link_libraries(nr_phy_test
srsue_phy
@ -23,7 +26,10 @@ if (RF_FOUND AND ENABLE_SRSUE AND ENABLE_SRSENB)
add_nr_test(nr_phy_test_10MHz_dl_only nr_phy_test
--duration=100
--gnb.stack.pdsch.slots=\"0,1,2,3,4,5\"
--gnb.stack.pusch.slots=\"\")
--gnb.stack.pusch.slots=\"\"
--gnb.phy.nof_threads=${NR_PHY_TEST_GNB_NOF_THREADS}
--ue.phy.nof_threads=${NR_PHY_TEST_UE_NOF_THREADS}
)
add_nr_test(nr_phy_test_10MHz_ul_only nr_phy_test
--duration=100 # 100 slots
@ -32,6 +38,8 @@ if (RF_FOUND AND ENABLE_SRSUE AND ENABLE_SRSENB)
--gnb.stack.pusch.start=0 # Start at RB 0
--gnb.stack.pusch.length=52 # Full 10 MHz BW
--gnb.stack.pusch.mcs=28 # Maximum MCS
--gnb.phy.nof_threads=${NR_PHY_TEST_GNB_NOF_THREADS}
--ue.phy.nof_threads=${NR_PHY_TEST_UE_NOF_THREADS}
)
add_nr_test(nr_phy_test_10MHz_bidir nr_phy_test
@ -44,13 +52,17 @@ if (RF_FOUND AND ENABLE_SRSUE AND ENABLE_SRSENB)
--gnb.stack.pusch.start=0 # Start at RB 0
--gnb.stack.pusch.length=52 # Full 10 MHz BW
--gnb.stack.pusch.mcs=28 # Maximum MCS
--gnb.phy.nof_threads=${NR_PHY_TEST_GNB_NOF_THREADS}
--ue.phy.nof_threads=${NR_PHY_TEST_UE_NOF_THREADS}
)
add_nr_test(nr_phy_test_10MHz_prach nr_phy_test
--duration=1000 # 100 slots
--gnb.stack.pdsch.slots=6 # No PDSCH
--gnb.stack.pusch.slots=0 # No PUSCH
--gnb.phy.nof_threads=${NR_PHY_TEST_GNB_NOF_THREADS}
--ue.stack.prach.period=30 # Transmit PRACH every 30 radio frames
--ue.stack.prach.preamble=10 # Use preamble 10
--ue.phy.nof_threads=${NR_PHY_TEST_UE_NOF_THREADS}
)
endif ()

View File

@ -47,10 +47,9 @@ private:
std::set<uint32_t> slots;
} dl, ul;
srsran::circular_array<uint32_t, SRSRAN_NOF_SF_X_FRAME> dl_data_to_ul_ack;
uint32_t ss_id = 0;
srsran_random_t random_gen = nullptr;
srsran::phy_cfg_nr_t phy_cfg = {};
bool valid = false;
uint32_t ss_id = 0;
srsran::phy_cfg_nr_t phy_cfg = {};
bool valid = false;
std::mutex metrics_mutex;
metrics_t metrics = {};
@ -124,9 +123,8 @@ private:
};
std::array<pending_pusch_t, TTIMOD_SZ> pending_pusch = {};
srsran::circular_array<dummy_tx_harq_proc, SRSRAN_MAX_HARQ_PROC_DL_NR> tx_harq_proc;
srsran::circular_array<dummy_rx_harq_proc, SRSRAN_MAX_HARQ_PROC_DL_NR> rx_harq_proc;
dummy_tx_harq_entity tx_harq_proc;
dummy_rx_harq_entity rx_harq_proc;
bool schedule_pdsch(const srsran_slot_cfg_t& slot_cfg, dl_sched_t& dl_sched)
{
@ -180,9 +178,6 @@ private:
// Select grant and set data
pdsch.data[0] = tx_harq_proc[slot_cfg.idx].get_tb(pdsch.sch.grant.tb[0].tbs).data();
// Generate random data
srsran_random_byte_vector(random_gen, pdsch.data[0], pdsch.sch.grant.tb[0].tbs / 8);
// Set softbuffer
pdsch.sch.grant.tb[0].softbuffer.tx = &tx_harq_proc[slot_cfg.idx].get_softbuffer(dci.ndi);
@ -292,7 +287,6 @@ public:
gnb_dummy_stack(const args_t& args) : rnti(args.rnti), phy_cfg(args.phy_cfg), ss_id(args.ss_id)
{
random_gen = srsran_random_init(0x1234);
logger.set_level(srslog::str_to_basic_level(args.log_level));
dl.mcs = args.pdsch.mcs;
@ -347,7 +341,7 @@ public:
valid = true;
}
~gnb_dummy_stack() { srsran_random_free(random_gen); }
~gnb_dummy_stack() {}
bool is_valid() const { return valid; }
int rx_data_indication(rx_data_ind_t& grant) override { return 0; }
@ -411,7 +405,6 @@ public:
// Generate data
pusch.data[0] = rx_harq_proc[pusch.pid].get_tb(pusch.sch.grant.tb[0].tbs).data();
pusch.data[1] = nullptr;
srsran_random_byte_vector(random_gen, pusch.data[0], pusch.sch.grant.tb[0].tbs / 8);
// Put UCI configuration in PUSCH config
if (not phy_cfg.get_pusch_uci_cfg(slot_cfg, uci_cfg, pusch.sch)) {
@ -462,6 +455,8 @@ public:
return SRSRAN_ERROR;
}
// Handle UL-SCH metrics
std::unique_lock<std::mutex> lock(metrics_mutex);
if (not pusch_info.pusch_data.tb[0].crc) {
metrics.mac.rx_errors++;
}

View File

@ -61,4 +61,7 @@ public:
uint32_t get_tbs() const { return tbs; }
};
class dummy_rx_harq_entity : public srsran::circular_array<dummy_rx_harq_proc, SRSRAN_MAX_HARQ_PROC_DL_NR>
{};
#endif // SRSRAN_DUMMY_RX_HARQ_PROC_H

View File

@ -23,9 +23,11 @@
class dummy_tx_harq_proc
{
private:
mutable std::mutex mutex;
srsran_random_t random_gen = nullptr;
srsran::byte_buffer_t data;
srsran_softbuffer_tx_t softbuffer = {};
std::atomic<uint32_t> tbs = {0};
uint32_t tbs = 0;
bool first = true;
uint32_t ndi = 0;
@ -39,16 +41,26 @@ public:
}
}
~dummy_tx_harq_proc() { srsran_softbuffer_tx_free(&softbuffer); }
void init(uint32_t pid) { random_gen = srsran_random_init(pid * 1234); }
~dummy_tx_harq_proc()
{
srsran_softbuffer_tx_free(&softbuffer);
srsran_random_free(random_gen);
}
srsran::byte_buffer_t& get_tb(uint32_t tbs_)
{
std::unique_lock<std::mutex> lock(mutex);
tbs = tbs_;
srsran_random_byte_vector(random_gen, data.msg, tbs / 8);
return data;
}
srsran_softbuffer_tx_t& get_softbuffer(uint32_t ndi_)
{
std::unique_lock<std::mutex> lock(mutex);
if (ndi_ != ndi || first) {
srsran_softbuffer_tx_reset(&softbuffer);
ndi = ndi_;
@ -58,7 +70,23 @@ public:
return softbuffer;
}
uint32_t get_tbs() const { return tbs; }
uint32_t get_tbs() const
{
std::unique_lock<std::mutex> lock(mutex);
return tbs;
}
};
class dummy_tx_harq_entity : public srsran::circular_array<dummy_tx_harq_proc, SRSRAN_MAX_HARQ_PROC_DL_NR>
{
public:
dummy_tx_harq_entity() : srsran::circular_array<dummy_tx_harq_proc, SRSRAN_MAX_HARQ_PROC_DL_NR>()
{
uint32_t pid = 0;
for (dummy_tx_harq_proc& proc : *this) {
proc.init(pid++);
}
}
};
#endif // SRSRAN_TX_DUMMY_HARQ_PROC_H

View File

@ -27,7 +27,6 @@ public:
};
private:
srsran_random_t random_gen = srsran_random_init(0x4567);
uint16_t rnti = 0;
bool valid = false;
uint32_t sr_period = 0;
@ -37,8 +36,8 @@ private:
metrics_t metrics = {};
srsue::phy_interface_stack_nr& phy;
srsran::circular_array<dummy_tx_harq_proc, SRSRAN_MAX_HARQ_PROC_DL_NR> tx_harq_proc;
srsran::circular_array<dummy_rx_harq_proc, SRSRAN_MAX_HARQ_PROC_DL_NR> rx_harq_proc;
dummy_tx_harq_entity tx_harq_proc;
dummy_rx_harq_entity rx_harq_proc;
public:
struct args_t {
@ -56,7 +55,7 @@ public:
{
valid = true;
}
~ue_dummy_stack() { srsran_random_free(random_gen); }
~ue_dummy_stack() = default;
void in_sync() override {}
void out_of_sync() override {}
void run_tti(const uint32_t tti) override
@ -88,7 +87,6 @@ public:
action->tb.enabled = true;
action->tb.payload = &tx_harq_proc[grant.pid].get_tb(grant.tbs);
action->tb.softbuffer = &tx_harq_proc[grant.pid].get_softbuffer(grant.ndi);
srsran_random_byte_vector(random_gen, action->tb.payload->msg, grant.tbs);
}
void prach_sent(uint32_t tti, uint32_t s_id, uint32_t t_id, uint32_t f_id, uint32_t ul_carrier_id) override {}
bool sr_opportunity(uint32_t tti, uint32_t sr_id, bool meas_gap, bool ul_sch_tx) override