From 084bbb0363da9e1db6435c1fd33a834f6faf0875 Mon Sep 17 00:00:00 2001 From: Thomas Schlichter Date: Fri, 2 May 2025 07:48:50 +0000 Subject: [PATCH 01/24] nrLDPC_coding_t2: also support newer DPDK versions --- .../PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/CMakeLists.txt b/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/CMakeLists.txt index 5b89d36f38..f64384568a 100644 --- a/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/CMakeLists.txt +++ b/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/CMakeLists.txt @@ -7,7 +7,7 @@ add_boolean_option(ENABLE_LDPC_T2 OFF "Build support for LDPC Offload to T2 libr if (ENABLE_LDPC_T2) - pkg_check_modules(LIBDPDK_T2 REQUIRED libdpdk=20.11.9) + pkg_check_modules(LIBDPDK_T2 REQUIRED libdpdk>=20.11.9) find_library(PMD_T2 NAMES rte_baseband_accl_ldpc HINTS ${LIBDPDK_T2_LIBRARY_DIRS}) if (NOT PMD_T2) From d8b3bfd17b57a70abd68c21eaa970157be9dd83f Mon Sep 17 00:00:00 2001 From: Thomas Schlichter Date: Fri, 2 May 2025 08:11:32 +0000 Subject: [PATCH 02/24] nrLDPC_coding_t2: use nb_segments_decoding() and nb_segments_encoding() to calculate num_segments --- .../nrLDPC_coding_t2/nrLDPC_coding_t2.c | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c b/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c index 6eb8f0dacc..2e9756ead4 100644 --- a/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c +++ b/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c @@ -1036,16 +1036,14 @@ int32_t nrLDPC_coding_decoder(nrLDPC_slot_decoding_parameters_t *nrLDPC_slot_dec pthread_mutex_lock(&decode_mutex); - uint16_t num_blocks = 0; - for(uint16_t h = 0; h < nrLDPC_slot_decoding_parameters->nb_TBs; ++h){ - num_blocks += nrLDPC_slot_decoding_parameters->TBs[h].C; - } + const uint16_t num_segments = nb_segments_decoding(nrLDPC_slot_decoding_parameters); + uint16_t z_ol[LDPC_MAX_CB_SIZE] __attribute__((aligned(16))); /* It is not unlikely that l_ol becomes big enough to overflow the stack * If you observe this behavior then move it to the heap * Then you would better do a persistent allocation to limit the overhead */ - uint8_t l_ol[num_blocks * LDPC_MAX_CB_SIZE] __attribute__((aligned(16))); + uint8_t l_ol[num_segments * LDPC_MAX_CB_SIZE] __attribute__((aligned(16))); // hardcoded we use first device struct active_device *ad = active_devs; @@ -1082,7 +1080,7 @@ int32_t nrLDPC_coding_decoder(nrLDPC_slot_decoding_parameters_t *nrLDPC_slot_dec } for (enum op_data_type type = DATA_INPUT; type < 3; type += 2) { - ret = allocate_buffers_on_socket(queue_ops[type], num_blocks * sizeof(struct rte_bbdev_op_data), socket_id); + ret = allocate_buffers_on_socket(queue_ops[type], num_segments * sizeof(struct rte_bbdev_op_data), socket_id); AssertFatal(ret == 0, "Couldn't allocate memory for rte_bbdev_op_data structs"); ret = init_op_data_objs_dec(*queue_ops[type], l_ol, @@ -1107,6 +1105,9 @@ int32_t nrLDPC_coding_encoder(nrLDPC_slot_encoding_parameters_t *nrLDPC_slot_enc pthread_mutex_lock(&encode_mutex); if (nrLDPC_slot_encoding_parameters->tprep != NULL) start_meas(nrLDPC_slot_encoding_parameters->tprep); + + const uint16_t num_segments = nb_segments_encoding(nrLDPC_slot_encoding_parameters); + // hardcoded to use the first found board struct active_device *ad = active_devs; int ret; @@ -1126,12 +1127,8 @@ int32_t nrLDPC_coding_encoder(nrLDPC_slot_encoding_parameters_t *nrLDPC_slot_enc &op_params->q_bufs[socket_id][queue_id].hard_outputs, &op_params->q_bufs[socket_id][queue_id].harq_inputs, &op_params->q_bufs[socket_id][queue_id].harq_outputs}; - uint16_t num_blocks = 0; - for(uint16_t h = 0; h < nrLDPC_slot_encoding_parameters->nb_TBs; ++h){ - num_blocks += nrLDPC_slot_encoding_parameters->TBs[h].C; - } for (enum op_data_type type = DATA_INPUT; type < 3; type += 2) { - ret = allocate_buffers_on_socket(queue_ops[type], num_blocks * sizeof(struct rte_bbdev_op_data), socket_id); + ret = allocate_buffers_on_socket(queue_ops[type], num_segments * sizeof(struct rte_bbdev_op_data), socket_id); AssertFatal(ret == 0, "Couldn't allocate memory for rte_bbdev_op_data structs"); ret = init_op_data_objs_enc(*queue_ops[type], nrLDPC_slot_encoding_parameters, From 1612ba33a8a9be870df0ad36981385b242b05dd0 Mon Sep 17 00:00:00 2001 From: Thomas Schlichter Date: Fri, 2 May 2025 08:48:12 +0000 Subject: [PATCH 03/24] nrLDPC_coding_t2: remove unused soft_outputs, harq_inputs and harq_outputs elements --- .../nrLDPC_coding_t2/nrLDPC_coding_t2.c | 65 +++++-------------- .../nrLDPC_coding_t2/nrLDPC_coding_t2.h | 3 - 2 files changed, 15 insertions(+), 53 deletions(-) diff --git a/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c b/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c index 2e9756ead4..5a7cc75c3f 100644 --- a/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c +++ b/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c @@ -76,9 +76,6 @@ struct active_device { struct rte_mempool *bbdev_enc_op_pool; struct rte_mempool *in_mbuf_pool; struct rte_mempool *hard_out_mbuf_pool; - struct rte_mempool *soft_out_mbuf_pool; - struct rte_mempool *harq_in_mbuf_pool; - struct rte_mempool *harq_out_mbuf_pool; } active_devs[RTE_BBDEV_MAX_DEVS]; static int nb_active_devs; @@ -86,9 +83,6 @@ static int nb_active_devs; struct data_buffers { struct rte_bbdev_op_data *inputs; struct rte_bbdev_op_data *hard_outputs; - struct rte_bbdev_op_data *soft_outputs; - struct rte_bbdev_op_data *harq_inputs; - struct rte_bbdev_op_data *harq_outputs; }; /* Operation parameters specific for given test case */ @@ -395,9 +389,9 @@ static int init_op_data_objs_dec(struct rte_bbdev_op_data *bufs, bufs[j].data = m_head; bufs[j].offset = 0; bufs[j].length = 0; - - if ((op_type == DATA_INPUT) || (op_type == DATA_HARQ_INPUT)) { - if ((op_type == DATA_INPUT) && large_input) { + + if (op_type == DATA_INPUT) { + if (large_input) { /* Allocate a fake overused mbuf */ data = rte_malloc(NULL, data_len, 0); AssertFatal(data != NULL, "rte malloc failed with %u bytes", data_len); @@ -452,9 +446,9 @@ static int init_op_data_objs_enc(struct rte_bbdev_op_data *bufs, bufs[j].data = m_head; bufs[j].offset = 0; bufs[j].length = 0; - - if ((op_type == DATA_INPUT) || (op_type == DATA_HARQ_INPUT)) { - if ((op_type == DATA_INPUT) && large_input) { + + if (op_type == DATA_INPUT) { + if (large_input) { /* Allocate a fake overused mbuf */ data = rte_malloc(NULL, data_len, 0); AssertFatal(data != NULL, "rte malloc failed with %u bytes", data_len); @@ -509,17 +503,11 @@ free_buffers(struct active_device *ad, struct test_op_params *op_params) rte_mempool_free(ad->bbdev_enc_op_pool); rte_mempool_free(ad->in_mbuf_pool); rte_mempool_free(ad->hard_out_mbuf_pool); - rte_mempool_free(ad->soft_out_mbuf_pool); - rte_mempool_free(ad->harq_in_mbuf_pool); - rte_mempool_free(ad->harq_out_mbuf_pool); for (int i = 2; i < rte_lcore_count(); ++i) { for (int j = 0; j < RTE_MAX_NUMA_NODES; ++j) { rte_free(op_params->q_bufs[j][i].inputs); rte_free(op_params->q_bufs[j][i].hard_outputs); - rte_free(op_params->q_bufs[j][i].soft_outputs); - rte_free(op_params->q_bufs[j][i].harq_inputs); - rte_free(op_params->q_bufs[j][i].harq_outputs); } } } @@ -571,16 +559,8 @@ set_ldpc_dec_op(struct rte_bbdev_dec_op **ops, ops[j]->ldpc_dec.harq_combined_input.offset = harq_combined_offset; ops[j]->ldpc_dec.harq_combined_output.offset = harq_combined_offset; - if (bufs->hard_outputs != NULL) - ops[j]->ldpc_dec.hard_output = bufs->hard_outputs[start_idx + j]; - if (bufs->inputs != NULL) - ops[j]->ldpc_dec.input = bufs->inputs[start_idx + j]; - if (bufs->soft_outputs != NULL) - ops[j]->ldpc_dec.soft_output = bufs->soft_outputs[start_idx + j]; - if (bufs->harq_inputs != NULL) - ops[j]->ldpc_dec.harq_combined_input = bufs->harq_inputs[start_idx + j]; - if (bufs->harq_outputs != NULL) - ops[j]->ldpc_dec.harq_combined_output = bufs->harq_outputs[start_idx + j]; + ops[j]->ldpc_dec.hard_output = bufs->hard_outputs[start_idx + j]; + ops[j]->ldpc_dec.input = bufs->inputs[start_idx + j]; ++j; } } @@ -1052,18 +1032,10 @@ int32_t nrLDPC_coding_decoder(nrLDPC_slot_decoding_parameters_t *nrLDPC_slot_dec rte_bbdev_info_get(ad->dev_id, &info); int socket_id = GET_SOCKET(info.socket_id); // fill_queue_buffers -> init_op_data_objs - struct rte_mempool *in_mp = ad->in_mbuf_pool; - struct rte_mempool *hard_out_mp = ad->hard_out_mbuf_pool; - struct rte_mempool *soft_out_mp = ad->soft_out_mbuf_pool; - struct rte_mempool *harq_in_mp = ad->harq_in_mbuf_pool; - struct rte_mempool *harq_out_mp = ad->harq_out_mbuf_pool; - struct rte_mempool *mbuf_pools[DATA_NUM_TYPES] = {in_mp, soft_out_mp, hard_out_mp, harq_in_mp, harq_out_mp}; + struct rte_mempool *mbuf_pools[DATA_NUM_TYPES] = {ad->in_mbuf_pool, ad->hard_out_mbuf_pool}; uint8_t queue_id = ad->dec_queue; struct rte_bbdev_op_data **queue_ops[DATA_NUM_TYPES] = {&op_params->q_bufs[socket_id][queue_id].inputs, - &op_params->q_bufs[socket_id][queue_id].soft_outputs, - &op_params->q_bufs[socket_id][queue_id].hard_outputs, - &op_params->q_bufs[socket_id][queue_id].harq_inputs, - &op_params->q_bufs[socket_id][queue_id].harq_outputs}; + &op_params->q_bufs[socket_id][queue_id].hard_outputs}; int offset = 0; for(uint16_t h = 0; h < nrLDPC_slot_decoding_parameters->nb_TBs; ++h){ @@ -1079,7 +1051,7 @@ int32_t nrLDPC_coding_decoder(nrLDPC_slot_decoding_parameters_t *nrLDPC_slot_dec } } - for (enum op_data_type type = DATA_INPUT; type < 3; type += 2) { + for (enum op_data_type type = DATA_INPUT; type < DATA_NUM_TYPES; ++type) { ret = allocate_buffers_on_socket(queue_ops[type], num_segments * sizeof(struct rte_bbdev_op_data), socket_id); AssertFatal(ret == 0, "Couldn't allocate memory for rte_bbdev_op_data structs"); ret = init_op_data_objs_dec(*queue_ops[type], @@ -1115,19 +1087,12 @@ int32_t nrLDPC_coding_encoder(nrLDPC_slot_encoding_parameters_t *nrLDPC_slot_enc rte_bbdev_info_get(ad->dev_id, &info); int socket_id = GET_SOCKET(info.socket_id); // fill_queue_buffers -> init_op_data_objs - struct rte_mempool *in_mp = ad->in_mbuf_pool; - struct rte_mempool *hard_out_mp = ad->hard_out_mbuf_pool; - struct rte_mempool *soft_out_mp = ad->soft_out_mbuf_pool; - struct rte_mempool *harq_in_mp = ad->harq_in_mbuf_pool; - struct rte_mempool *harq_out_mp = ad->harq_out_mbuf_pool; - struct rte_mempool *mbuf_pools[DATA_NUM_TYPES] = {in_mp, soft_out_mp, hard_out_mp, harq_in_mp, harq_out_mp}; + struct rte_mempool *mbuf_pools[DATA_NUM_TYPES] = {ad->in_mbuf_pool, ad->hard_out_mbuf_pool}; uint8_t queue_id = ad->enc_queue; struct rte_bbdev_op_data **queue_ops[DATA_NUM_TYPES] = {&op_params->q_bufs[socket_id][queue_id].inputs, - &op_params->q_bufs[socket_id][queue_id].soft_outputs, - &op_params->q_bufs[socket_id][queue_id].hard_outputs, - &op_params->q_bufs[socket_id][queue_id].harq_inputs, - &op_params->q_bufs[socket_id][queue_id].harq_outputs}; - for (enum op_data_type type = DATA_INPUT; type < 3; type += 2) { + &op_params->q_bufs[socket_id][queue_id].hard_outputs}; + + for (enum op_data_type type = DATA_INPUT; type < DATA_NUM_TYPES; ++type) { ret = allocate_buffers_on_socket(queue_ops[type], num_segments * sizeof(struct rte_bbdev_op_data), socket_id); AssertFatal(ret == 0, "Couldn't allocate memory for rte_bbdev_op_data structs"); ret = init_op_data_objs_enc(*queue_ops[type], diff --git a/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.h b/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.h index 9da33f4671..642ac8f55a 100644 --- a/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.h +++ b/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.h @@ -16,10 +16,7 @@ enum op_data_type { DATA_INPUT = 0, - DATA_SOFT_OUTPUT, DATA_HARD_OUTPUT, - DATA_HARQ_INPUT, - DATA_HARQ_OUTPUT, DATA_NUM_TYPES, }; From ac9a8f017b23b8a0b2b9389985caa9d5cac5f988 Mon Sep 17 00:00:00 2001 From: Thomas Schlichter Date: Fri, 2 May 2025 08:58:15 +0000 Subject: [PATCH 04/24] nrLDPC_coding_t2 fix: make sure to free allocated mbufs The DPDK driver may directly provide the internal HW mbuf in the dequeued structure. So don't try to free the mbufs from that dequeued structure, but the ones we allocated. --- .../nrLDPC_coding_t2/nrLDPC_coding_t2.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c b/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c index 5a7cc75c3f..6a26316f1c 100644 --- a/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c +++ b/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c @@ -618,8 +618,6 @@ retrieve_ldpc_dec_op(struct rte_bbdev_dec_op **ops, data_len = rte_pktmbuf_data_len(m) - hard_output->offset; data = m->buf_addr; memcpy(nrLDPC_slot_decoding_parameters->TBs[h].segments[i].c, data + m->data_off, data_len); - rte_pktmbuf_free(ops[j]->ldpc_dec.hard_output.data); - rte_pktmbuf_free(ops[j]->ldpc_dec.input.data); ++j; } } @@ -668,8 +666,6 @@ retrieve_ldpc_enc_op(struct rte_bbdev_enc_op **ops, E_sum += nrLDPC_slot_encoding_parameters->TBs[h].segments[r].E; byte_offset = (E_sum + 7) / 8; bit_offset = E_sum % 8; - rte_pktmbuf_free(m); - rte_pktmbuf_free(ops[j]->ldpc_enc.input.data); ++j; } } @@ -1068,6 +1064,11 @@ int32_t nrLDPC_coding_decoder(nrLDPC_slot_decoding_parameters_t *nrLDPC_slot_dec LOG_E(PHY, "Couldn't start pmd dec\n"); } + for (enum op_data_type type = DATA_INPUT; type < DATA_NUM_TYPES; ++type) { + for (int segment = 0; segment < num_segments; ++segment) + rte_pktmbuf_free((*queue_ops[type])[segment].data); + } + pthread_mutex_unlock(&decode_mutex); return 0; } @@ -1104,6 +1105,12 @@ int32_t nrLDPC_coding_encoder(nrLDPC_slot_encoding_parameters_t *nrLDPC_slot_enc AssertFatal(ret == 0, "Couldn't init rte_bbdev_op_data structs"); } ret = start_pmd_enc(ad, op_params, nrLDPC_slot_encoding_parameters); + + for (enum op_data_type type = DATA_INPUT; type < DATA_NUM_TYPES; ++type) { + for (int segment = 0; segment < num_segments; ++segment) + rte_pktmbuf_free((*queue_ops[type])[segment].data); + } + pthread_mutex_unlock(&encode_mutex); return ret; } From 48e78ff4b000d9538be1006de0069b1315c32996 Mon Sep 17 00:00:00 2001 From: Thomas Schlichter Date: Fri, 2 May 2025 09:09:31 +0000 Subject: [PATCH 05/24] nrLDPC_coding_t2: fix q_bufs memory leak --- .../nrLDPC_coding_t2/nrLDPC_coding_t2.c | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c b/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c index 6a26316f1c..17f1dac69c 100644 --- a/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c +++ b/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c @@ -496,20 +496,12 @@ static int allocate_buffers_on_socket(struct rte_bbdev_op_data **buffers, const } // DPDK BBDEV copy -static void -free_buffers(struct active_device *ad, struct test_op_params *op_params) +static void free_mempools(struct active_device *ad) { rte_mempool_free(ad->bbdev_dec_op_pool); rte_mempool_free(ad->bbdev_enc_op_pool); rte_mempool_free(ad->in_mbuf_pool); rte_mempool_free(ad->hard_out_mbuf_pool); - - for (int i = 2; i < rte_lcore_count(); ++i) { - for (int j = 0; j < RTE_MAX_NUMA_NODES; ++j) { - rte_free(op_params->q_bufs[j][i].inputs); - rte_free(op_params->q_bufs[j][i].hard_outputs); - } - } } // based on DPDK BBDEV copy_reference_ldpc_dec_op @@ -998,7 +990,7 @@ int32_t nrLDPC_coding_shutdown() struct active_device *ad = active_devs; int dev_id = 0; struct rte_bbdev_stats stats; - free_buffers(ad, op_params); + free_mempools(ad); rte_free(op_params); rte_bbdev_stats_get(dev_id, &stats); rte_bbdev_stop(dev_id); @@ -1067,6 +1059,7 @@ int32_t nrLDPC_coding_decoder(nrLDPC_slot_decoding_parameters_t *nrLDPC_slot_dec for (enum op_data_type type = DATA_INPUT; type < DATA_NUM_TYPES; ++type) { for (int segment = 0; segment < num_segments; ++segment) rte_pktmbuf_free((*queue_ops[type])[segment].data); + rte_free(*queue_ops[type]); } pthread_mutex_unlock(&decode_mutex); @@ -1109,6 +1102,7 @@ int32_t nrLDPC_coding_encoder(nrLDPC_slot_encoding_parameters_t *nrLDPC_slot_enc for (enum op_data_type type = DATA_INPUT; type < DATA_NUM_TYPES; ++type) { for (int segment = 0; segment < num_segments; ++segment) rte_pktmbuf_free((*queue_ops[type])[segment].data); + rte_free(*queue_ops[type]); } pthread_mutex_unlock(&encode_mutex); From 300346c43afffa413b21c24308acdeff6366f596 Mon Sep 17 00:00:00 2001 From: Thomas Schlichter Date: Fri, 2 May 2025 09:30:39 +0000 Subject: [PATCH 06/24] nrLDPC_coding_t2: replace global q_bufs by struct data_buffers on stack --- .../nrLDPC_coding_t2/nrLDPC_coding_t2.c | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c b/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c index 17f1dac69c..04e41268f8 100644 --- a/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c +++ b/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c @@ -96,7 +96,6 @@ struct test_op_params { uint16_t num_lcores; int vector_mask; rte_atomic16_t sync; - struct data_buffers q_bufs[RTE_MAX_NUMA_NODES][MAX_QUEUES]; }; /* Contains per lcore params */ @@ -113,6 +112,7 @@ struct thread_params { struct test_op_params *op_params; struct rte_bbdev_dec_op *dec_ops[MAX_BURST]; struct rte_bbdev_enc_op *enc_ops[MAX_BURST]; + struct data_buffers *data_buffers; }; static uint16_t nb_segments_decoding(nrLDPC_slot_decoding_parameters_t *nrLDPC_slot_decoding_parameters) { @@ -703,7 +703,7 @@ pmd_lcore_ldpc_dec(void *arg) struct rte_bbdev_dec_op **ops_deq; ops_enq = (struct rte_bbdev_dec_op **)rte_calloc("struct rte_bbdev_dec_op **ops_enq", num_segments, sizeof(struct rte_bbdev_dec_op *), RTE_CACHE_LINE_SIZE); ops_deq = (struct rte_bbdev_dec_op **)rte_calloc("struct rte_bbdev_dec_op **ops_dec", num_segments, sizeof(struct rte_bbdev_dec_op *), RTE_CACHE_LINE_SIZE); - struct data_buffers *bufs = NULL; + struct data_buffers *bufs = tp->data_buffers; uint16_t h, i, j; int ret; struct rte_bbdev_info info; @@ -712,7 +712,6 @@ pmd_lcore_ldpc_dec(void *arg) AssertFatal((num_segments < MAX_BURST), "BURST_SIZE should be <= %u", MAX_BURST); rte_bbdev_info_get(tp->dev_id, &info); - bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; while (rte_atomic16_read(&tp->op_params->sync) == SYNC_WAIT) rte_pause(); @@ -793,13 +792,13 @@ static int pmd_lcore_ldpc_enc(void *arg) ops_deq = (struct rte_bbdev_enc_op **)rte_calloc("struct rte_bbdev_dec_op **ops_dec", num_segments, sizeof(struct rte_bbdev_enc_op *), RTE_CACHE_LINE_SIZE); struct rte_bbdev_info info; int ret; - struct data_buffers *bufs = NULL; + struct data_buffers *bufs = tp->data_buffers; uint16_t num_to_enq; AssertFatal((num_segments < MAX_BURST), "BURST_SIZE should be <= %u", MAX_BURST); rte_bbdev_info_get(tp->dev_id, &info); - bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; + while (rte_atomic16_read(&tp->op_params->sync) == SYNC_WAIT) rte_pause(); ret = rte_bbdev_enc_op_alloc_bulk(tp->op_params->mp_enc, ops_enq, num_segments); @@ -840,6 +839,7 @@ static int pmd_lcore_ldpc_enc(void *arg) // based on DPDK BBDEV throughput_pmd_lcore_dec int start_pmd_dec(struct active_device *ad, struct test_op_params *op_params, + struct data_buffers *data_buffers, nrLDPC_slot_decoding_parameters_t *nrLDPC_slot_decoding_parameters) { int ret; @@ -857,6 +857,7 @@ int start_pmd_dec(struct active_device *ad, t_params[0].dev_id = ad->dev_id; t_params[0].lcore_id = rte_lcore_id(); t_params[0].op_params = op_params; + t_params[0].data_buffers = data_buffers; t_params[0].queue_id = ad->dec_queue; t_params[0].iter_count = 0; t_params[0].nrLDPC_slot_decoding_parameters = nrLDPC_slot_decoding_parameters; @@ -868,6 +869,7 @@ int start_pmd_dec(struct active_device *ad, t_params[used_cores].dev_id = ad->dev_id; t_params[used_cores].lcore_id = lcore_id; t_params[used_cores].op_params = op_params; + t_params[used_cores].data_buffers = data_buffers; t_params[used_cores].queue_id = ad->queue_ids[used_cores]; t_params[used_cores].iter_count = 0; t_params[used_cores].nrLDPC_slot_decoding_parameters = nrLDPC_slot_decoding_parameters; @@ -885,6 +887,7 @@ int start_pmd_dec(struct active_device *ad, // based on DPDK BBDEV throughput_pmd_lcore_enc int32_t start_pmd_enc(struct active_device *ad, struct test_op_params *op_params, + struct data_buffers *data_buffers, nrLDPC_slot_encoding_parameters_t *nrLDPC_slot_encoding_parameters) { unsigned int lcore_id, used_cores = 0; @@ -896,6 +899,7 @@ int32_t start_pmd_enc(struct active_device *ad, t_params[0].dev_id = ad->dev_id; t_params[0].lcore_id = rte_lcore_id() + 1; t_params[0].op_params = op_params; + t_params[0].data_buffers = data_buffers; t_params[0].queue_id = ad->enc_queue; t_params[0].iter_count = 0; t_params[0].nrLDPC_slot_encoding_parameters = nrLDPC_slot_encoding_parameters; @@ -907,6 +911,7 @@ int32_t start_pmd_enc(struct active_device *ad, t_params[used_cores].dev_id = ad->dev_id; t_params[used_cores].lcore_id = lcore_id; t_params[used_cores].op_params = op_params; + t_params[used_cores].data_buffers = data_buffers; t_params[used_cores].queue_id = ad->queue_ids[1]; t_params[used_cores].iter_count = 0; t_params[used_cores].nrLDPC_slot_encoding_parameters = nrLDPC_slot_encoding_parameters; @@ -1021,9 +1026,8 @@ int32_t nrLDPC_coding_decoder(nrLDPC_slot_decoding_parameters_t *nrLDPC_slot_dec int socket_id = GET_SOCKET(info.socket_id); // fill_queue_buffers -> init_op_data_objs struct rte_mempool *mbuf_pools[DATA_NUM_TYPES] = {ad->in_mbuf_pool, ad->hard_out_mbuf_pool}; - uint8_t queue_id = ad->dec_queue; - struct rte_bbdev_op_data **queue_ops[DATA_NUM_TYPES] = {&op_params->q_bufs[socket_id][queue_id].inputs, - &op_params->q_bufs[socket_id][queue_id].hard_outputs}; + struct data_buffers data_buffers; + struct rte_bbdev_op_data **queue_ops[DATA_NUM_TYPES] = {&data_buffers.inputs, &data_buffers.hard_outputs}; int offset = 0; for(uint16_t h = 0; h < nrLDPC_slot_decoding_parameters->nb_TBs; ++h){ @@ -1051,7 +1055,7 @@ int32_t nrLDPC_coding_decoder(nrLDPC_slot_decoding_parameters_t *nrLDPC_slot_dec AssertFatal(ret == 0, "Couldn't init rte_bbdev_op_data structs"); } - ret = start_pmd_dec(ad, op_params, nrLDPC_slot_decoding_parameters); + ret = start_pmd_dec(ad, op_params, &data_buffers, nrLDPC_slot_decoding_parameters); if (ret < 0) { LOG_E(PHY, "Couldn't start pmd dec\n"); } @@ -1082,9 +1086,8 @@ int32_t nrLDPC_coding_encoder(nrLDPC_slot_encoding_parameters_t *nrLDPC_slot_enc int socket_id = GET_SOCKET(info.socket_id); // fill_queue_buffers -> init_op_data_objs struct rte_mempool *mbuf_pools[DATA_NUM_TYPES] = {ad->in_mbuf_pool, ad->hard_out_mbuf_pool}; - uint8_t queue_id = ad->enc_queue; - struct rte_bbdev_op_data **queue_ops[DATA_NUM_TYPES] = {&op_params->q_bufs[socket_id][queue_id].inputs, - &op_params->q_bufs[socket_id][queue_id].hard_outputs}; + struct data_buffers data_buffers; + struct rte_bbdev_op_data **queue_ops[DATA_NUM_TYPES] = {&data_buffers.inputs, &data_buffers.hard_outputs}; for (enum op_data_type type = DATA_INPUT; type < DATA_NUM_TYPES; ++type) { ret = allocate_buffers_on_socket(queue_ops[type], num_segments * sizeof(struct rte_bbdev_op_data), socket_id); @@ -1097,7 +1100,8 @@ int32_t nrLDPC_coding_encoder(nrLDPC_slot_encoding_parameters_t *nrLDPC_slot_enc info.drv.min_alignment); AssertFatal(ret == 0, "Couldn't init rte_bbdev_op_data structs"); } - ret = start_pmd_enc(ad, op_params, nrLDPC_slot_encoding_parameters); + + ret = start_pmd_enc(ad, op_params, &data_buffers, nrLDPC_slot_encoding_parameters); for (enum op_data_type type = DATA_INPUT; type < DATA_NUM_TYPES; ++type) { for (int segment = 0; segment < num_segments; ++segment) From e45aff7763058332c2078c4899ce593ac1066872 Mon Sep 17 00:00:00 2001 From: Thomas Schlichter Date: Fri, 2 May 2025 09:43:51 +0000 Subject: [PATCH 07/24] nrLDPC_coding_t2: replace global mp_dec and mp_enc by bbdev_op_pool in thread_params --- .../nrLDPC_coding_t2/nrLDPC_coding_t2.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c b/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c index 04e41268f8..644eb38d62 100644 --- a/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c +++ b/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c @@ -87,8 +87,6 @@ struct data_buffers { /* Operation parameters specific for given test case */ struct test_op_params { - struct rte_mempool *mp_dec; - struct rte_mempool *mp_enc; struct rte_bbdev_dec_op *ref_dec_op; struct rte_bbdev_enc_op *ref_enc_op; uint16_t burst_sz; @@ -113,6 +111,7 @@ struct thread_params { struct rte_bbdev_dec_op *dec_ops[MAX_BURST]; struct rte_bbdev_enc_op *enc_ops[MAX_BURST]; struct data_buffers *data_buffers; + struct rte_mempool *bbdev_op_pool; }; static uint16_t nb_segments_decoding(nrLDPC_slot_decoding_parameters_t *nrLDPC_slot_decoding_parameters) { @@ -675,10 +674,8 @@ static int init_test_op_params(struct test_op_params *op_params, int ret = 0; if (op_type == RTE_BBDEV_OP_LDPC_DEC) { ret = rte_bbdev_dec_op_alloc_bulk(ops_mp, &op_params->ref_dec_op, num_to_process); - op_params->mp_dec = ops_mp; } else { ret = rte_bbdev_enc_op_alloc_bulk(ops_mp, &op_params->ref_enc_op, 1); - op_params->mp_enc = ops_mp; } AssertFatal(ret == 0, "rte_bbdev_op_alloc_bulk() failed"); @@ -705,7 +702,6 @@ pmd_lcore_ldpc_dec(void *arg) ops_deq = (struct rte_bbdev_dec_op **)rte_calloc("struct rte_bbdev_dec_op **ops_dec", num_segments, sizeof(struct rte_bbdev_dec_op *), RTE_CACHE_LINE_SIZE); struct data_buffers *bufs = tp->data_buffers; uint16_t h, i, j; - int ret; struct rte_bbdev_info info; uint16_t num_to_enq; @@ -715,7 +711,7 @@ pmd_lcore_ldpc_dec(void *arg) while (rte_atomic16_read(&tp->op_params->sync) == SYNC_WAIT) rte_pause(); - ret = rte_bbdev_dec_op_alloc_bulk(tp->op_params->mp_dec, ops_enq, num_segments); + int ret = rte_bbdev_dec_op_alloc_bulk(tp->bbdev_op_pool, ops_enq, num_segments); AssertFatal(ret == 0, "Allocation failed for %d ops", num_segments); set_ldpc_dec_op(ops_enq, 0, bufs, nrLDPC_slot_decoding_parameters); @@ -791,7 +787,6 @@ static int pmd_lcore_ldpc_enc(void *arg) ops_enq = (struct rte_bbdev_enc_op **)rte_calloc("struct rte_bbdev_dec_op **ops_enq", num_segments, sizeof(struct rte_bbdev_enc_op *), RTE_CACHE_LINE_SIZE); ops_deq = (struct rte_bbdev_enc_op **)rte_calloc("struct rte_bbdev_dec_op **ops_dec", num_segments, sizeof(struct rte_bbdev_enc_op *), RTE_CACHE_LINE_SIZE); struct rte_bbdev_info info; - int ret; struct data_buffers *bufs = tp->data_buffers; uint16_t num_to_enq; @@ -801,7 +796,8 @@ static int pmd_lcore_ldpc_enc(void *arg) while (rte_atomic16_read(&tp->op_params->sync) == SYNC_WAIT) rte_pause(); - ret = rte_bbdev_enc_op_alloc_bulk(tp->op_params->mp_enc, ops_enq, num_segments); + + int ret = rte_bbdev_enc_op_alloc_bulk(tp->bbdev_op_pool, ops_enq, num_segments); AssertFatal(ret == 0, "Allocation failed for %d ops", num_segments); set_ldpc_enc_op(ops_enq, 0, bufs->inputs, bufs->hard_outputs, nrLDPC_slot_encoding_parameters); @@ -858,6 +854,7 @@ int start_pmd_dec(struct active_device *ad, t_params[0].lcore_id = rte_lcore_id(); t_params[0].op_params = op_params; t_params[0].data_buffers = data_buffers; + t_params[0].bbdev_op_pool = ad->bbdev_dec_op_pool; t_params[0].queue_id = ad->dec_queue; t_params[0].iter_count = 0; t_params[0].nrLDPC_slot_decoding_parameters = nrLDPC_slot_decoding_parameters; @@ -870,6 +867,7 @@ int start_pmd_dec(struct active_device *ad, t_params[used_cores].lcore_id = lcore_id; t_params[used_cores].op_params = op_params; t_params[used_cores].data_buffers = data_buffers; + t_params[used_cores].bbdev_op_pool = ad->bbdev_dec_op_pool; t_params[used_cores].queue_id = ad->queue_ids[used_cores]; t_params[used_cores].iter_count = 0; t_params[used_cores].nrLDPC_slot_decoding_parameters = nrLDPC_slot_decoding_parameters; @@ -900,6 +898,7 @@ int32_t start_pmd_enc(struct active_device *ad, t_params[0].lcore_id = rte_lcore_id() + 1; t_params[0].op_params = op_params; t_params[0].data_buffers = data_buffers; + t_params[0].bbdev_op_pool = ad->bbdev_enc_op_pool; t_params[0].queue_id = ad->enc_queue; t_params[0].iter_count = 0; t_params[0].nrLDPC_slot_encoding_parameters = nrLDPC_slot_encoding_parameters; @@ -912,6 +911,7 @@ int32_t start_pmd_enc(struct active_device *ad, t_params[used_cores].lcore_id = lcore_id; t_params[used_cores].op_params = op_params; t_params[used_cores].data_buffers = data_buffers; + t_params[used_cores].bbdev_op_pool = ad->bbdev_enc_op_pool; t_params[used_cores].queue_id = ad->queue_ids[1]; t_params[used_cores].iter_count = 0; t_params[used_cores].nrLDPC_slot_encoding_parameters = nrLDPC_slot_encoding_parameters; From f47b549f416696762b800de21ac2ddaa73445483 Mon Sep 17 00:00:00 2001 From: Thomas Schlichter Date: Fri, 2 May 2025 09:57:44 +0000 Subject: [PATCH 08/24] nrLDPC_coding_t2: remove unused rte_bbdev_dec_op from test_op_params and thread_params --- .../nrLDPC_coding_t2/nrLDPC_coding_t2.c | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c b/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c index 644eb38d62..a215adb210 100644 --- a/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c +++ b/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c @@ -87,8 +87,6 @@ struct data_buffers { /* Operation parameters specific for given test case */ struct test_op_params { - struct rte_bbdev_dec_op *ref_dec_op; - struct rte_bbdev_enc_op *ref_enc_op; uint16_t burst_sz; uint16_t num_to_process; uint16_t num_lcores; @@ -108,8 +106,6 @@ struct thread_params { rte_atomic16_t processing_status; rte_atomic16_t burst_sz; struct test_op_params *op_params; - struct rte_bbdev_dec_op *dec_ops[MAX_BURST]; - struct rte_bbdev_enc_op *enc_ops[MAX_BURST]; struct data_buffers *data_buffers; struct rte_mempool *bbdev_op_pool; }; @@ -671,15 +667,6 @@ static int init_test_op_params(struct test_op_params *op_params, uint16_t num_to_process, uint16_t num_lcores) { - int ret = 0; - if (op_type == RTE_BBDEV_OP_LDPC_DEC) { - ret = rte_bbdev_dec_op_alloc_bulk(ops_mp, &op_params->ref_dec_op, num_to_process); - } else { - ret = rte_bbdev_enc_op_alloc_bulk(ops_mp, &op_params->ref_enc_op, 1); - } - - AssertFatal(ret == 0, "rte_bbdev_op_alloc_bulk() failed"); - op_params->burst_sz = burst_sz; op_params->num_to_process = num_to_process; op_params->num_lcores = num_lcores; From 73c6d1fb621c6e9fcb2a41f01ee83fdf1387bee6 Mon Sep 17 00:00:00 2001 From: Thomas Schlichter Date: Fri, 2 May 2025 10:02:42 +0000 Subject: [PATCH 09/24] nrLDPC_coding_t2: remove unused burst_sz --- .../CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c b/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c index a215adb210..821b23f61f 100644 --- a/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c +++ b/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c @@ -87,7 +87,6 @@ struct data_buffers { /* Operation parameters specific for given test case */ struct test_op_params { - uint16_t burst_sz; uint16_t num_to_process; uint16_t num_lcores; int vector_mask; @@ -104,7 +103,6 @@ struct thread_params { uint8_t iter_count; rte_atomic16_t nb_dequeued; rte_atomic16_t processing_status; - rte_atomic16_t burst_sz; struct test_op_params *op_params; struct data_buffers *data_buffers; struct rte_mempool *bbdev_op_pool; @@ -667,7 +665,6 @@ static int init_test_op_params(struct test_op_params *op_params, uint16_t num_to_process, uint16_t num_lcores) { - op_params->burst_sz = burst_sz; op_params->num_to_process = num_to_process; op_params->num_lcores = num_lcores; return 0; From ea7e6ffb0b7251184875dc7d1cadf9b079b2761d Mon Sep 17 00:00:00 2001 From: Thomas Schlichter Date: Fri, 2 May 2025 10:04:56 +0000 Subject: [PATCH 10/24] nrLDPC_coding_t2: remove unused num_to_process --- .../CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c b/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c index 821b23f61f..ae741992ff 100644 --- a/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c +++ b/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c @@ -87,7 +87,6 @@ struct data_buffers { /* Operation parameters specific for given test case */ struct test_op_params { - uint16_t num_to_process; uint16_t num_lcores; int vector_mask; rte_atomic16_t sync; @@ -665,7 +664,6 @@ static int init_test_op_params(struct test_op_params *op_params, uint16_t num_to_process, uint16_t num_lcores) { - op_params->num_to_process = num_to_process; op_params->num_lcores = num_lcores; return 0; } From b02e6e8ddd51c6c91ea3938b1fd5d60ae38591c8 Mon Sep 17 00:00:00 2001 From: Thomas Schlichter Date: Fri, 2 May 2025 10:06:48 +0000 Subject: [PATCH 11/24] nrLDPC_coding_t2: inline and remove now nearly empty init_test_op_params() --- .../nrLDPC_coding_t2/nrLDPC_coding_t2.c | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c b/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c index ae741992ff..acece39884 100644 --- a/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c +++ b/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c @@ -656,18 +656,6 @@ retrieve_ldpc_enc_op(struct rte_bbdev_enc_op **ops, return 0; } -// based on DPDK BBDEV init_test_op_params -static int init_test_op_params(struct test_op_params *op_params, - enum rte_bbdev_op_type op_type, - struct rte_mempool *ops_mp, - uint16_t burst_sz, - uint16_t num_to_process, - uint16_t num_lcores) -{ - op_params->num_lcores = num_lcores; - return 0; -} - // based on DPDK BBDEV throughput_pmd_lcore_ldpc_dec static int pmd_lcore_ldpc_dec(void *arg) @@ -963,12 +951,7 @@ int32_t nrLDPC_coding_init() printf("Couldn't create mempools"); return -1; } - f_ret = init_test_op_params(op_params, RTE_BBDEV_OP_LDPC_DEC, ad->bbdev_dec_op_pool, num_queues, num_queues, 1); - f_ret = init_test_op_params(op_params, RTE_BBDEV_OP_LDPC_ENC, ad->bbdev_enc_op_pool, num_queues, num_queues, 1); - if (f_ret != 0) { - printf("Couldn't init test op params"); - return -1; - } + op_params->num_lcores = 1; return 0; } From 4dde956e8428a402314aeede1755ca8bc6eba9f0 Mon Sep 17 00:00:00 2001 From: Thomas Schlichter Date: Fri, 2 May 2025 10:11:32 +0000 Subject: [PATCH 12/24] nrLDPC_coding_t2: remove unused vector_mask --- .../nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c b/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c index acece39884..3cd364cf49 100644 --- a/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c +++ b/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c @@ -88,7 +88,6 @@ struct data_buffers { /* Operation parameters specific for given test case */ struct test_op_params { uint16_t num_lcores; - int vector_mask; rte_atomic16_t sync; }; @@ -583,10 +582,7 @@ set_ldpc_enc_op(struct rte_bbdev_enc_op **ops, } } -static int -retrieve_ldpc_dec_op(struct rte_bbdev_dec_op **ops, - const int vector_mask, - nrLDPC_slot_decoding_parameters_t *nrLDPC_slot_decoding_parameters) +static int retrieve_ldpc_dec_op(struct rte_bbdev_dec_op **ops, nrLDPC_slot_decoding_parameters_t *nrLDPC_slot_decoding_parameters) { struct rte_bbdev_op_data *hard_output; uint16_t data_len = 0; @@ -701,7 +697,7 @@ pmd_lcore_ldpc_dec(void *arg) DevAssert(time_out <= TIME_OUT_POLL); } if (deq == enq) { - ret = retrieve_ldpc_dec_op(ops_deq, tp->op_params->vector_mask, nrLDPC_slot_decoding_parameters); + ret = retrieve_ldpc_dec_op(ops_deq, nrLDPC_slot_decoding_parameters); AssertFatal(ret == 0, "LDPC offload decoder failed!"); tp->iter_count = 0; /* get the max of iter_count for all dequeued ops */ From adbf056abb946a50f67e74149da5a381a1b12caa Mon Sep 17 00:00:00 2001 From: Thomas Schlichter Date: Fri, 2 May 2025 10:14:30 +0000 Subject: [PATCH 13/24] nrLDPC_coding_t2: remove unused global variable m_head --- .../nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c b/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c index 3cd364cf49..cab1b6b442 100644 --- a/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c +++ b/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c @@ -412,7 +412,6 @@ static int init_op_data_objs_dec(struct rte_bbdev_op_data *bufs, // based on DPDK BBDEV init_op_data_objs static int init_op_data_objs_enc(struct rte_bbdev_op_data *bufs, nrLDPC_slot_encoding_parameters_t *nrLDPC_slot_encoding_parameters, - struct rte_mbuf *m_head, struct rte_mempool *mbuf_pool, enum op_data_type op_type, uint16_t min_alignment) @@ -891,8 +890,6 @@ int32_t start_pmd_enc(struct active_device *ad, struct test_op_params *op_params = NULL; -struct rte_mbuf *m_head[DATA_NUM_TYPES]; - // OAI CODE int32_t nrLDPC_coding_init() { @@ -1053,12 +1050,7 @@ int32_t nrLDPC_coding_encoder(nrLDPC_slot_encoding_parameters_t *nrLDPC_slot_enc for (enum op_data_type type = DATA_INPUT; type < DATA_NUM_TYPES; ++type) { ret = allocate_buffers_on_socket(queue_ops[type], num_segments * sizeof(struct rte_bbdev_op_data), socket_id); AssertFatal(ret == 0, "Couldn't allocate memory for rte_bbdev_op_data structs"); - ret = init_op_data_objs_enc(*queue_ops[type], - nrLDPC_slot_encoding_parameters, - m_head[type], - mbuf_pools[type], - type, - info.drv.min_alignment); + ret = init_op_data_objs_enc(*queue_ops[type], nrLDPC_slot_encoding_parameters, mbuf_pools[type], type, info.drv.min_alignment); AssertFatal(ret == 0, "Couldn't init rte_bbdev_op_data structs"); } From c1e057bc8b239f7b9bdb221bb1fadb113158a035 Mon Sep 17 00:00:00 2001 From: Thomas Schlichter Date: Fri, 2 May 2025 10:22:38 +0000 Subject: [PATCH 14/24] nrLDPC_coding_t2: remove unused atomic variables nb_dequeued and processing_status --- .../CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c b/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c index cab1b6b442..691e06b684 100644 --- a/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c +++ b/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c @@ -99,8 +99,6 @@ struct thread_params { nrLDPC_slot_decoding_parameters_t *nrLDPC_slot_decoding_parameters; nrLDPC_slot_encoding_parameters_t *nrLDPC_slot_encoding_parameters; uint8_t iter_count; - rte_atomic16_t nb_dequeued; - rte_atomic16_t processing_status; struct test_op_params *op_params; struct data_buffers *data_buffers; struct rte_mempool *bbdev_op_pool; From 07ff8a27c4eb95fdff1a7b2e86568d519794dc51 Mon Sep 17 00:00:00 2001 From: Thomas Schlichter Date: Fri, 2 May 2025 10:27:05 +0000 Subject: [PATCH 15/24] nrLDPC_coding_t2: remove unused functions mbuf_reset() and check_bit() --- .../nrLDPC_coding_t2/nrLDPC_coding_t2.c | 20 ------------------- 1 file changed, 20 deletions(-) diff --git a/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c b/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c index 691e06b684..68bfa5ef2d 100644 --- a/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c +++ b/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c @@ -122,26 +122,6 @@ static uint16_t nb_segments_encoding(nrLDPC_slot_encoding_parameters_t *nrLDPC_s return nb_segments; } -// DPDK BBDEV copy -static inline void -mbuf_reset(struct rte_mbuf *m) -{ - m->pkt_len = 0; - - do { - m->data_len = 0; - m = m->next; - } while (m != NULL); -} - -/* Read flag value 0/1 from bitmap */ -// DPDK BBDEV copy -static inline bool -check_bit(uint32_t bitmap, uint32_t bitmask) -{ - return bitmap & bitmask; -} - /* calculates optimal mempool size not smaller than the val */ // DPDK BBDEV copy static unsigned int From b5c9e13df35fca124780ac0ed8f846d9159c4fcd Mon Sep 17 00:00:00 2001 From: Thomas Schlichter Date: Fri, 2 May 2025 10:32:12 +0000 Subject: [PATCH 16/24] nrLDPC_coding_t2: remove unused #define HARQ_INCR --- .../CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c b/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c index 68bfa5ef2d..ac1308ecd0 100644 --- a/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c +++ b/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c @@ -45,8 +45,6 @@ #define SYNC_WAIT 0 #define SYNC_START 1 #define TIME_OUT_POLL 1e8 -/* Increment for next code block in external HARQ memory */ -#define HARQ_INCR 32768 /* Headroom for filler LLRs insertion in HARQ buffer */ #define FILLER_HEADROOM 1024 /* Number of segments that could be stored in HARQ combined buffers */ From d442461bd13e0ca7075932b1a648169afb2f3507 Mon Sep 17 00:00:00 2001 From: Thomas Schlichter Date: Fri, 2 May 2025 10:49:10 +0000 Subject: [PATCH 17/24] nrLDPC_coding_t2: remove unused start_idx from set_ldpc_enc_op() and set_ldpc_dec_op() --- .../nrLDPC_coding_t2/nrLDPC_coding_t2.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c b/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c index ac1308ecd0..6f047e8a31 100644 --- a/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c +++ b/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c @@ -473,7 +473,6 @@ static void free_mempools(struct active_device *ad) // based on DPDK BBDEV copy_reference_ldpc_dec_op static void set_ldpc_dec_op(struct rte_bbdev_dec_op **ops, - unsigned int start_idx, struct data_buffers *bufs, nrLDPC_slot_decoding_parameters_t *nrLDPC_slot_decoding_parameters) { @@ -517,8 +516,8 @@ set_ldpc_dec_op(struct rte_bbdev_dec_op **ops, ops[j]->ldpc_dec.harq_combined_input.offset = harq_combined_offset; ops[j]->ldpc_dec.harq_combined_output.offset = harq_combined_offset; - ops[j]->ldpc_dec.hard_output = bufs->hard_outputs[start_idx + j]; - ops[j]->ldpc_dec.input = bufs->inputs[start_idx + j]; + ops[j]->ldpc_dec.hard_output = bufs->hard_outputs[j]; + ops[j]->ldpc_dec.input = bufs->inputs[j]; ++j; } } @@ -527,7 +526,6 @@ set_ldpc_dec_op(struct rte_bbdev_dec_op **ops, // based on DPDK BBDEV copy_reference_ldpc_enc_op static void set_ldpc_enc_op(struct rte_bbdev_enc_op **ops, - unsigned int start_idx, struct rte_bbdev_op_data *inputs, struct rte_bbdev_op_data *outputs, nrLDPC_slot_encoding_parameters_t *nrLDPC_slot_encoding_parameters) @@ -550,8 +548,8 @@ set_ldpc_enc_op(struct rte_bbdev_enc_op **ops, ops[j]->ldpc_enc.rv_index = nrLDPC_slot_encoding_parameters->TBs[h].rv_index; ops[j]->ldpc_enc.op_flags = RTE_BBDEV_LDPC_RATE_MATCH; ops[j]->ldpc_enc.code_block_mode = 1; - ops[j]->ldpc_enc.output = outputs[start_idx + j]; - ops[j]->ldpc_enc.input = inputs[start_idx + j]; + ops[j]->ldpc_enc.output = outputs[j]; + ops[j]->ldpc_enc.input = inputs[j]; ++j; } } @@ -654,7 +652,7 @@ pmd_lcore_ldpc_dec(void *arg) int ret = rte_bbdev_dec_op_alloc_bulk(tp->bbdev_op_pool, ops_enq, num_segments); AssertFatal(ret == 0, "Allocation failed for %d ops", num_segments); - set_ldpc_dec_op(ops_enq, 0, bufs, nrLDPC_slot_decoding_parameters); + set_ldpc_dec_op(ops_enq, bufs, nrLDPC_slot_decoding_parameters); for (enq = 0, deq = 0; enq < num_segments;) { num_to_enq = num_segments; @@ -740,8 +738,8 @@ static int pmd_lcore_ldpc_enc(void *arg) int ret = rte_bbdev_enc_op_alloc_bulk(tp->bbdev_op_pool, ops_enq, num_segments); AssertFatal(ret == 0, "Allocation failed for %d ops", num_segments); + set_ldpc_enc_op(ops_enq, bufs->inputs, bufs->hard_outputs, nrLDPC_slot_encoding_parameters); - set_ldpc_enc_op(ops_enq, 0, bufs->inputs, bufs->hard_outputs, nrLDPC_slot_encoding_parameters); if (nrLDPC_slot_encoding_parameters->tprep != NULL) stop_meas(nrLDPC_slot_encoding_parameters->tprep); if (nrLDPC_slot_encoding_parameters->tparity != NULL) From af7054554ba4d98abb8fc9c05b8ee96bc678901a Mon Sep 17 00:00:00 2001 From: Thomas Schlichter Date: Fri, 2 May 2025 10:52:32 +0000 Subject: [PATCH 18/24] nrLDPC_coding_t2: make parameters for set_ldpc_dec_op() more smilar to set_ldpc_enc_op() --- .../nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c b/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c index 6f047e8a31..7729bec58c 100644 --- a/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c +++ b/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c @@ -473,7 +473,8 @@ static void free_mempools(struct active_device *ad) // based on DPDK BBDEV copy_reference_ldpc_dec_op static void set_ldpc_dec_op(struct rte_bbdev_dec_op **ops, - struct data_buffers *bufs, + struct rte_bbdev_op_data *inputs, + struct rte_bbdev_op_data *outputs, nrLDPC_slot_decoding_parameters_t *nrLDPC_slot_decoding_parameters) { unsigned int h; @@ -516,8 +517,8 @@ set_ldpc_dec_op(struct rte_bbdev_dec_op **ops, ops[j]->ldpc_dec.harq_combined_input.offset = harq_combined_offset; ops[j]->ldpc_dec.harq_combined_output.offset = harq_combined_offset; - ops[j]->ldpc_dec.hard_output = bufs->hard_outputs[j]; - ops[j]->ldpc_dec.input = bufs->inputs[j]; + ops[j]->ldpc_dec.hard_output = outputs[j]; + ops[j]->ldpc_dec.input = inputs[j]; ++j; } } @@ -652,7 +653,7 @@ pmd_lcore_ldpc_dec(void *arg) int ret = rte_bbdev_dec_op_alloc_bulk(tp->bbdev_op_pool, ops_enq, num_segments); AssertFatal(ret == 0, "Allocation failed for %d ops", num_segments); - set_ldpc_dec_op(ops_enq, bufs, nrLDPC_slot_decoding_parameters); + set_ldpc_dec_op(ops_enq, bufs->inputs, bufs->hard_outputs, nrLDPC_slot_decoding_parameters); for (enq = 0, deq = 0; enq < num_segments;) { num_to_enq = num_segments; From 2df487fc8b78362ee397fadca94a2082288641fc Mon Sep 17 00:00:00 2001 From: Thomas Schlichter Date: Fri, 2 May 2025 11:02:58 +0000 Subject: [PATCH 19/24] nrLDPC_coding_t2: use rte_bbdev_op_type_str() instead of hardcoded array of strings --- .../nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c b/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c index 7729bec58c..9a18342e56 100644 --- a/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c +++ b/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c @@ -53,15 +53,6 @@ pthread_mutex_t encode_mutex; pthread_mutex_t decode_mutex; -const char *typeStr[] = { - "RTE_BBDEV_OP_NONE", /**< Dummy operation that does nothing */ - "RTE_BBDEV_OP_TURBO_DEC", /**< Turbo decode */ - "RTE_BBDEV_OP_TURBO_ENC", /**< Turbo encode */ - "RTE_BBDEV_OP_LDPC_DEC", /**< LDPC decode */ - "RTE_BBDEV_OP_LDPC_ENC", /**< LDPC encode */ - "RTE_BBDEV_OP_TYPE_COUNT", /**< Count of different op types */ -}; - /* Represents tested active devices */ struct active_device { const char *driver_name; @@ -259,7 +250,7 @@ static int add_dev(uint8_t dev_id, struct rte_bbdev_info *info) /* Display for debug the capabilities of the card */ for (int i = 0; info->drv.capabilities[i].type != RTE_BBDEV_OP_NONE; i++) { - printf("device: %d, capability[%d]=%s\n", dev_id, i, typeStr[info->drv.capabilities[i].type]); + printf("device: %d, capability[%d]=%s\n", dev_id, i, rte_bbdev_op_type_str(info->drv.capabilities[i].type)); if (info->drv.capabilities[i].type == RTE_BBDEV_OP_LDPC_ENC) { const struct rte_bbdev_op_cap_ldpc_enc cap = info->drv.capabilities[i].cap.ldpc_enc; printf(" buffers: src = %d, dst = %d\n capabilites: ", cap.num_buffers_src, cap.num_buffers_dst); From 944ac15ab514aa639e40d854ef44806a2ab972ad Mon Sep 17 00:00:00 2001 From: Thomas Schlichter Date: Fri, 2 May 2025 11:06:26 +0000 Subject: [PATCH 20/24] nrLDPC_coding_t2: allocate array of rte_bbdev_dec_op pointers on stack instead of heap --- .../nrLDPC_coding_t2/nrLDPC_coding_t2.c | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c b/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c index 9a18342e56..87b9229541 100644 --- a/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c +++ b/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c @@ -627,10 +627,8 @@ pmd_lcore_ldpc_dec(void *arg) int time_out = 0; const uint16_t queue_id = tp->queue_id; const uint16_t num_segments = nb_segments_decoding(nrLDPC_slot_decoding_parameters); - struct rte_bbdev_dec_op **ops_enq; - struct rte_bbdev_dec_op **ops_deq; - ops_enq = (struct rte_bbdev_dec_op **)rte_calloc("struct rte_bbdev_dec_op **ops_enq", num_segments, sizeof(struct rte_bbdev_dec_op *), RTE_CACHE_LINE_SIZE); - ops_deq = (struct rte_bbdev_dec_op **)rte_calloc("struct rte_bbdev_dec_op **ops_dec", num_segments, sizeof(struct rte_bbdev_dec_op *), RTE_CACHE_LINE_SIZE); + struct rte_bbdev_dec_op *ops_enq[num_segments]; + struct rte_bbdev_dec_op *ops_deq[num_segments]; struct data_buffers *bufs = tp->data_buffers; uint16_t h, i, j; struct rte_bbdev_info info; @@ -698,8 +696,6 @@ pmd_lcore_ldpc_dec(void *arg) } rte_bbdev_dec_op_free_bulk(ops_enq, num_segments); - rte_free(ops_enq); - rte_free(ops_deq); // Return the worst decoding number of iterations for all segments return tp->iter_count; } @@ -713,10 +709,8 @@ static int pmd_lcore_ldpc_enc(void *arg) int time_out = 0; const uint16_t queue_id = tp->queue_id; const uint16_t num_segments = nb_segments_encoding(nrLDPC_slot_encoding_parameters); - struct rte_bbdev_enc_op **ops_enq; - struct rte_bbdev_enc_op **ops_deq; - ops_enq = (struct rte_bbdev_enc_op **)rte_calloc("struct rte_bbdev_dec_op **ops_enq", num_segments, sizeof(struct rte_bbdev_enc_op *), RTE_CACHE_LINE_SIZE); - ops_deq = (struct rte_bbdev_enc_op **)rte_calloc("struct rte_bbdev_dec_op **ops_dec", num_segments, sizeof(struct rte_bbdev_enc_op *), RTE_CACHE_LINE_SIZE); + struct rte_bbdev_enc_op *ops_enq[num_segments]; + struct rte_bbdev_enc_op *ops_deq[num_segments]; struct rte_bbdev_info info; struct data_buffers *bufs = tp->data_buffers; uint16_t num_to_enq; @@ -758,8 +752,6 @@ static int pmd_lcore_ldpc_enc(void *arg) if (nrLDPC_slot_encoding_parameters->toutput != NULL) stop_meas(nrLDPC_slot_encoding_parameters->toutput); rte_bbdev_enc_op_free_bulk(ops_enq, num_segments); - rte_free(ops_enq); - rte_free(ops_deq); return ret; } From c3d0b2db5c6e8d4ed13e684a3d1fc97ac5b5af81 Mon Sep 17 00:00:00 2001 From: Thomas Schlichter Date: Fri, 2 May 2025 11:13:54 +0000 Subject: [PATCH 21/24] nrLDPC_coding_t2 fix: use rte_pktmbuf_mtod_offset() to consider offset when accessing output data --- .../nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c b/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c index 87b9229541..e738e7cc5e 100644 --- a/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c +++ b/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c @@ -552,7 +552,7 @@ static int retrieve_ldpc_dec_op(struct rte_bbdev_dec_op **ops, nrLDPC_slot_decod struct rte_bbdev_op_data *hard_output; uint16_t data_len = 0; struct rte_mbuf *m; - char *data; + uint8_t *data; unsigned int h; unsigned int i; unsigned int j = 0; @@ -561,8 +561,8 @@ static int retrieve_ldpc_dec_op(struct rte_bbdev_dec_op **ops, nrLDPC_slot_decod hard_output = &ops[j]->ldpc_dec.hard_output; m = hard_output->data; data_len = rte_pktmbuf_data_len(m) - hard_output->offset; - data = m->buf_addr; - memcpy(nrLDPC_slot_decoding_parameters->TBs[h].segments[i].c, data + m->data_off, data_len); + data = rte_pktmbuf_mtod_offset(m, uint8_t *, hard_output->offset); + memcpy(nrLDPC_slot_decoding_parameters->TBs[h].segments[i].c, data, data_len); ++j; } } @@ -584,7 +584,7 @@ retrieve_ldpc_enc_op(struct rte_bbdev_enc_op **ops, struct rte_bbdev_op_data *output = &ops[j]->ldpc_enc.output; struct rte_mbuf *m = output->data; uint16_t data_len = rte_pktmbuf_data_len(m) - output->offset; - uint8_t *data = m->buf_addr + m->data_off; + uint8_t *data = rte_pktmbuf_mtod_offset(m, uint8_t *, output->offset); reverse_bits_u8(data, data_len, data); if (bit_offset == 0) { memcpy(&p_out[byte_offset], data, data_len); From ffb8e8ff37b48a8da840bce41f3d3b13a0bdebb9 Mon Sep 17 00:00:00 2001 From: Thomas Schlichter Date: Fri, 2 May 2025 11:26:17 +0000 Subject: [PATCH 22/24] nrLDPC_coding_t2: nb_TBs is of type int --- .../nrLDPC_coding_t2/nrLDPC_coding_t2.c | 55 ++++++++----------- 1 file changed, 23 insertions(+), 32 deletions(-) diff --git a/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c b/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c index e738e7cc5e..0cbca9d5fb 100644 --- a/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c +++ b/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c @@ -95,8 +95,7 @@ struct thread_params { static uint16_t nb_segments_decoding(nrLDPC_slot_decoding_parameters_t *nrLDPC_slot_decoding_parameters) { uint16_t nb_segments = 0; - for (uint16_t h = 0; h < nrLDPC_slot_decoding_parameters->nb_TBs; ++h) - { + for (int h = 0; h < nrLDPC_slot_decoding_parameters->nb_TBs; ++h) { nb_segments+=nrLDPC_slot_decoding_parameters->TBs[h].C; } return nb_segments; @@ -104,8 +103,7 @@ static uint16_t nb_segments_decoding(nrLDPC_slot_decoding_parameters_t *nrLDPC_s static uint16_t nb_segments_encoding(nrLDPC_slot_encoding_parameters_t *nrLDPC_slot_encoding_parameters) { uint16_t nb_segments = 0; - for (uint16_t h = 0; h < nrLDPC_slot_encoding_parameters->nb_TBs; ++h) - { + for (int h = 0; h < nrLDPC_slot_encoding_parameters->nb_TBs; ++h) { nb_segments+=nrLDPC_slot_encoding_parameters->TBs[h].C; } return nb_segments; @@ -328,9 +326,9 @@ static int init_op_data_objs_dec(struct rte_bbdev_op_data *bufs, uint16_t min_alignment) { bool large_input = false; - uint16_t j = 0; - for (uint16_t h = 0; h < nrLDPC_slot_decoding_parameters->nb_TBs; ++h) { - for (uint16_t i = 0; i < nrLDPC_slot_decoding_parameters->TBs[h].C; ++i) { + int j = 0; + for (int h = 0; h < nrLDPC_slot_decoding_parameters->nb_TBs; ++h) { + for (int i = 0; i < nrLDPC_slot_decoding_parameters->TBs[h].C; ++i) { uint32_t data_len = nrLDPC_slot_decoding_parameters->TBs[h].segments[i].E; char *data; struct rte_mbuf *m_head = rte_pktmbuf_alloc(mbuf_pool); @@ -384,8 +382,8 @@ static int init_op_data_objs_enc(struct rte_bbdev_op_data *bufs, uint16_t min_alignment) { bool large_input = false; - uint16_t j = 0; - for (uint16_t h = 0; h < nrLDPC_slot_encoding_parameters->nb_TBs; ++h) { + int j = 0; + for (int h = 0; h < nrLDPC_slot_encoding_parameters->nb_TBs; ++h) { for (int i = 0; i < nrLDPC_slot_encoding_parameters->TBs[h].C; ++i) { uint32_t data_len = (nrLDPC_slot_encoding_parameters->TBs[h].K - nrLDPC_slot_encoding_parameters->TBs[h].F + 7) / 8; char *data; @@ -468,11 +466,9 @@ set_ldpc_dec_op(struct rte_bbdev_dec_op **ops, struct rte_bbdev_op_data *outputs, nrLDPC_slot_decoding_parameters_t *nrLDPC_slot_decoding_parameters) { - unsigned int h; - unsigned int i; - unsigned int j = 0; - for (h = 0; h < nrLDPC_slot_decoding_parameters->nb_TBs; ++h){ - for (i = 0; i < nrLDPC_slot_decoding_parameters->TBs[h].C; ++i) { + int j = 0; + for (int h = 0; h < nrLDPC_slot_decoding_parameters->nb_TBs; ++h) { + for (int i = 0; i < nrLDPC_slot_decoding_parameters->TBs[h].C; ++i) { ops[j]->ldpc_dec.cb_params.e = nrLDPC_slot_decoding_parameters->TBs[h].segments[i].E; ops[j]->ldpc_dec.basegraph = nrLDPC_slot_decoding_parameters->TBs[h].BG; ops[j]->ldpc_dec.z_c = nrLDPC_slot_decoding_parameters->TBs[h].Z; @@ -522,11 +518,9 @@ set_ldpc_enc_op(struct rte_bbdev_enc_op **ops, struct rte_bbdev_op_data *outputs, nrLDPC_slot_encoding_parameters_t *nrLDPC_slot_encoding_parameters) { - unsigned int h; - unsigned int i; - unsigned int j = 0; - for (h = 0; h < nrLDPC_slot_encoding_parameters->nb_TBs; ++h){ - for (i = 0; i < nrLDPC_slot_encoding_parameters->TBs[h].C; ++i) { + int j = 0; + for (int h = 0; h < nrLDPC_slot_encoding_parameters->nb_TBs; ++h) { + for (int i = 0; i < nrLDPC_slot_encoding_parameters->TBs[h].C; ++i) { ops[j]->ldpc_enc.cb_params.e = nrLDPC_slot_encoding_parameters->TBs[h].segments[i].E; ops[j]->ldpc_enc.basegraph = nrLDPC_slot_encoding_parameters->TBs[h].BG; ops[j]->ldpc_enc.z_c = nrLDPC_slot_encoding_parameters->TBs[h].Z; @@ -553,11 +547,9 @@ static int retrieve_ldpc_dec_op(struct rte_bbdev_dec_op **ops, nrLDPC_slot_decod uint16_t data_len = 0; struct rte_mbuf *m; uint8_t *data; - unsigned int h; - unsigned int i; - unsigned int j = 0; - for (h = 0; h < nrLDPC_slot_decoding_parameters->nb_TBs; ++h){ - for (i = 0; i < nrLDPC_slot_decoding_parameters->TBs[h].C; ++i) { + int j = 0; + for (int h = 0; h < nrLDPC_slot_decoding_parameters->nb_TBs; ++h) { + for (int i = 0; i < nrLDPC_slot_decoding_parameters->TBs[h].C; ++i) { hard_output = &ops[j]->ldpc_dec.hard_output; m = hard_output->data; data_len = rte_pktmbuf_data_len(m) - hard_output->offset; @@ -574,13 +566,13 @@ retrieve_ldpc_enc_op(struct rte_bbdev_enc_op **ops, nrLDPC_slot_encoding_parameters_t *nrLDPC_slot_encoding_parameters) { uint8_t *p_out = NULL; - unsigned int j = 0; - for (unsigned int h = 0; h < nrLDPC_slot_encoding_parameters->nb_TBs; ++h){ + int j = 0; + for (int h = 0; h < nrLDPC_slot_encoding_parameters->nb_TBs; ++h){ int E_sum = 0; int bit_offset = 0; int byte_offset = 0; p_out = nrLDPC_slot_encoding_parameters->TBs[h].output; - for (unsigned int r = 0; r < nrLDPC_slot_encoding_parameters->TBs[h].C; ++r) { + for (int r = 0; r < nrLDPC_slot_encoding_parameters->TBs[h].C; ++r) { struct rte_bbdev_op_data *output = &ops[j]->ldpc_enc.output; struct rte_mbuf *m = output->data; uint16_t data_len = rte_pktmbuf_data_len(m) - output->offset; @@ -630,7 +622,6 @@ pmd_lcore_ldpc_dec(void *arg) struct rte_bbdev_dec_op *ops_enq[num_segments]; struct rte_bbdev_dec_op *ops_deq[num_segments]; struct data_buffers *bufs = tp->data_buffers; - uint16_t h, i, j; struct rte_bbdev_info info; uint16_t num_to_enq; @@ -664,9 +655,9 @@ pmd_lcore_ldpc_dec(void *arg) AssertFatal(ret == 0, "LDPC offload decoder failed!"); tp->iter_count = 0; /* get the max of iter_count for all dequeued ops */ - j = 0; - for (h = 0; h < nrLDPC_slot_decoding_parameters->nb_TBs; ++h){ - for (i = 0; i < nrLDPC_slot_decoding_parameters->TBs[h].C; ++i) { + int j = 0; + for (int h = 0; h < nrLDPC_slot_decoding_parameters->nb_TBs; ++h) { + for (int i = 0; i < nrLDPC_slot_decoding_parameters->TBs[h].C; ++i) { bool *status = &nrLDPC_slot_decoding_parameters->TBs[h].segments[i].decodeSuccess; tp->iter_count = RTE_MAX(ops_enq[j]->ldpc_dec.iter_count, tp->iter_count); @@ -946,7 +937,7 @@ int32_t nrLDPC_coding_decoder(nrLDPC_slot_decoding_parameters_t *nrLDPC_slot_dec struct rte_bbdev_op_data **queue_ops[DATA_NUM_TYPES] = {&data_buffers.inputs, &data_buffers.hard_outputs}; int offset = 0; - for(uint16_t h = 0; h < nrLDPC_slot_decoding_parameters->nb_TBs; ++h){ + for (int h = 0; h < nrLDPC_slot_decoding_parameters->nb_TBs; ++h) { for (int r = 0; r < nrLDPC_slot_decoding_parameters->TBs[h].C; r++) { memcpy(z_ol, nrLDPC_slot_decoding_parameters->TBs[h].segments[r].llr, nrLDPC_slot_decoding_parameters->TBs[h].segments[r].E * sizeof(uint16_t)); simde__m128i *pv_ol128 = (simde__m128i *)z_ol; From 073a705720116a8889ca3918beba76a29b1a3c85 Mon Sep 17 00:00:00 2001 From: Thomas Schlichter Date: Fri, 2 May 2025 11:31:42 +0000 Subject: [PATCH 23/24] nrLDPC_coding_t2: minor cleanup --- .../nrLDPC_coding_t2/nrLDPC_coding_t2.c | 51 ++++++++----------- 1 file changed, 20 insertions(+), 31 deletions(-) diff --git a/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c b/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c index 0cbca9d5fb..6960959e50 100644 --- a/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c +++ b/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c @@ -543,17 +543,13 @@ set_ldpc_enc_op(struct rte_bbdev_enc_op **ops, static int retrieve_ldpc_dec_op(struct rte_bbdev_dec_op **ops, nrLDPC_slot_decoding_parameters_t *nrLDPC_slot_decoding_parameters) { - struct rte_bbdev_op_data *hard_output; - uint16_t data_len = 0; - struct rte_mbuf *m; - uint8_t *data; int j = 0; for (int h = 0; h < nrLDPC_slot_decoding_parameters->nb_TBs; ++h) { for (int i = 0; i < nrLDPC_slot_decoding_parameters->TBs[h].C; ++i) { - hard_output = &ops[j]->ldpc_dec.hard_output; - m = hard_output->data; - data_len = rte_pktmbuf_data_len(m) - hard_output->offset; - data = rte_pktmbuf_mtod_offset(m, uint8_t *, hard_output->offset); + struct rte_bbdev_op_data *hard_output = &ops[j]->ldpc_dec.hard_output; + struct rte_mbuf *m = hard_output->data; + uint16_t data_len = rte_pktmbuf_data_len(m) - hard_output->offset; + uint8_t *data = rte_pktmbuf_mtod_offset(m, uint8_t *, hard_output->offset); memcpy(nrLDPC_slot_decoding_parameters->TBs[h].segments[i].c, data, data_len); ++j; } @@ -615,17 +611,16 @@ pmd_lcore_ldpc_dec(void *arg) { struct thread_params *tp = arg; nrLDPC_slot_decoding_parameters_t *nrLDPC_slot_decoding_parameters = tp->nrLDPC_slot_decoding_parameters; - uint16_t enq, deq; int time_out = 0; const uint16_t queue_id = tp->queue_id; const uint16_t num_segments = nb_segments_decoding(nrLDPC_slot_decoding_parameters); struct rte_bbdev_dec_op *ops_enq[num_segments]; struct rte_bbdev_dec_op *ops_deq[num_segments]; struct data_buffers *bufs = tp->data_buffers; - struct rte_bbdev_info info; - uint16_t num_to_enq; AssertFatal((num_segments < MAX_BURST), "BURST_SIZE should be <= %u", MAX_BURST); + + struct rte_bbdev_info info; rte_bbdev_info_get(tp->dev_id, &info); while (rte_atomic16_read(&tp->op_params->sync) == SYNC_WAIT) @@ -635,21 +630,19 @@ pmd_lcore_ldpc_dec(void *arg) AssertFatal(ret == 0, "Allocation failed for %d ops", num_segments); set_ldpc_dec_op(ops_enq, bufs->inputs, bufs->hard_outputs, nrLDPC_slot_decoding_parameters); - for (enq = 0, deq = 0; enq < num_segments;) { - num_to_enq = num_segments; - if (unlikely(num_segments - enq < num_to_enq)) - num_to_enq = num_segments - enq; - + uint16_t enq = 0, deq = 0; + while (enq < num_segments) { + uint16_t num_to_enq = num_segments - enq; enq += rte_bbdev_enqueue_ldpc_dec_ops(tp->dev_id, queue_id, &ops_enq[enq], num_to_enq); deq += rte_bbdev_dequeue_ldpc_dec_ops(tp->dev_id, queue_id, &ops_deq[deq], enq - deq); } - /* dequeue the remaining */ while (deq < enq) { deq += rte_bbdev_dequeue_ldpc_dec_ops(tp->dev_id, queue_id, &ops_deq[deq], enq - deq); time_out++; DevAssert(time_out <= TIME_OUT_POLL); } + if (deq == enq) { ret = retrieve_ldpc_dec_op(ops_deq, nrLDPC_slot_decoding_parameters); AssertFatal(ret == 0, "LDPC offload decoder failed!"); @@ -696,18 +689,16 @@ static int pmd_lcore_ldpc_enc(void *arg) { struct thread_params *tp = arg; nrLDPC_slot_encoding_parameters_t *nrLDPC_slot_encoding_parameters = tp->nrLDPC_slot_encoding_parameters; - uint16_t enq, deq; int time_out = 0; const uint16_t queue_id = tp->queue_id; const uint16_t num_segments = nb_segments_encoding(nrLDPC_slot_encoding_parameters); struct rte_bbdev_enc_op *ops_enq[num_segments]; struct rte_bbdev_enc_op *ops_deq[num_segments]; - struct rte_bbdev_info info; struct data_buffers *bufs = tp->data_buffers; - uint16_t num_to_enq; AssertFatal((num_segments < MAX_BURST), "BURST_SIZE should be <= %u", MAX_BURST); + struct rte_bbdev_info info; rte_bbdev_info_get(tp->dev_id, &info); while (rte_atomic16_read(&tp->op_params->sync) == SYNC_WAIT) @@ -721,10 +712,10 @@ static int pmd_lcore_ldpc_enc(void *arg) stop_meas(nrLDPC_slot_encoding_parameters->tprep); if (nrLDPC_slot_encoding_parameters->tparity != NULL) start_meas(nrLDPC_slot_encoding_parameters->tparity); - for (enq = 0, deq = 0; enq < num_segments;) { - num_to_enq = num_segments; - if (unlikely(num_segments - enq < num_to_enq)) - num_to_enq = num_segments - enq; + + uint16_t enq = 0, deq = 0; + while (enq < num_segments) { + uint16_t num_to_enq = num_segments - enq; enq += rte_bbdev_enqueue_ldpc_enc_ops(tp->dev_id, queue_id, &ops_enq[enq], num_to_enq); deq += rte_bbdev_dequeue_ldpc_enc_ops(tp->dev_id, queue_id, &ops_deq[deq], enq - deq); } @@ -752,11 +743,9 @@ int start_pmd_dec(struct active_device *ad, struct data_buffers *data_buffers, nrLDPC_slot_decoding_parameters_t *nrLDPC_slot_decoding_parameters) { - int ret; unsigned int lcore_id, used_cores = 0; - uint16_t num_lcores; /* Set number of lcores */ - num_lcores = (ad->nb_queues < (op_params->num_lcores)) ? ad->nb_queues : op_params->num_lcores; + int num_lcores = (ad->nb_queues < (op_params->num_lcores)) ? ad->nb_queues : op_params->num_lcores; /* Allocate memory for thread parameters structure */ struct thread_params *t_params = rte_zmalloc(NULL, num_lcores * sizeof(struct thread_params), RTE_CACHE_LINE_SIZE); AssertFatal(t_params != 0, @@ -788,7 +777,7 @@ int start_pmd_dec(struct active_device *ad, rte_eal_remote_launch(pmd_lcore_ldpc_dec, &t_params[used_cores++], lcore_id); } rte_atomic16_set(&op_params->sync, SYNC_START); - ret = pmd_lcore_ldpc_dec(&t_params[0]); + int ret = pmd_lcore_ldpc_dec(&t_params[0]); /* Master core is always used */ // for (used_cores = 1; used_cores < num_lcores; used_cores++) // ret |= rte_eal_wait_lcore(t_params[used_cores].lcore_id); @@ -912,13 +901,12 @@ int32_t nrLDPC_coding_shutdown() return 0; } -int32_t nrLDPC_coding_decoder(nrLDPC_slot_decoding_parameters_t *nrLDPC_slot_decoding_parameters){ - +int32_t nrLDPC_coding_decoder(nrLDPC_slot_decoding_parameters_t *nrLDPC_slot_decoding_parameters) +{ pthread_mutex_lock(&decode_mutex); const uint16_t num_segments = nb_segments_decoding(nrLDPC_slot_decoding_parameters); - uint16_t z_ol[LDPC_MAX_CB_SIZE] __attribute__((aligned(16))); /* It is not unlikely that l_ol becomes big enough to overflow the stack * If you observe this behavior then move it to the heap * Then you would better do a persistent allocation to limit the overhead @@ -939,6 +927,7 @@ int32_t nrLDPC_coding_decoder(nrLDPC_slot_decoding_parameters_t *nrLDPC_slot_dec int offset = 0; for (int h = 0; h < nrLDPC_slot_decoding_parameters->nb_TBs; ++h) { for (int r = 0; r < nrLDPC_slot_decoding_parameters->TBs[h].C; r++) { + uint16_t z_ol[LDPC_MAX_CB_SIZE] __attribute__((aligned(16))); memcpy(z_ol, nrLDPC_slot_decoding_parameters->TBs[h].segments[r].llr, nrLDPC_slot_decoding_parameters->TBs[h].segments[r].E * sizeof(uint16_t)); simde__m128i *pv_ol128 = (simde__m128i *)z_ol; simde__m128i *pl_ol128 = (simde__m128i *)&l_ol[offset]; From b264ddc1ec88664e2e6b0532507ec9642119dbb9 Mon Sep 17 00:00:00 2001 From: Thomas Schlichter Date: Fri, 2 May 2025 12:01:16 +0000 Subject: [PATCH 24/24] nrLDPC_coding_t2 fix: convert the correct number of LLRs from 16 Bit to 8 Bit --- .../CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c b/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c index 6960959e50..04ad571de0 100644 --- a/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c +++ b/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c @@ -931,8 +931,7 @@ int32_t nrLDPC_coding_decoder(nrLDPC_slot_decoding_parameters_t *nrLDPC_slot_dec memcpy(z_ol, nrLDPC_slot_decoding_parameters->TBs[h].segments[r].llr, nrLDPC_slot_decoding_parameters->TBs[h].segments[r].E * sizeof(uint16_t)); simde__m128i *pv_ol128 = (simde__m128i *)z_ol; simde__m128i *pl_ol128 = (simde__m128i *)&l_ol[offset]; - int kc = nrLDPC_slot_decoding_parameters->TBs[h].BG == 2 ? 52 : 68; - for (int i = 0, j = 0; j < ((kc * nrLDPC_slot_decoding_parameters->TBs[h].Z) >> 4) + 1; i += 2, j++) { + for (int i = 0, j = 0; j < ((nrLDPC_slot_decoding_parameters->TBs[h].segments[r].E + 15) >> 4); i += 2, j++) { pl_ol128[j] = simde_mm_packs_epi16(pv_ol128[i], pv_ol128[i + 1]); } offset += LDPC_MAX_CB_SIZE;