Fix greedy allocation: schedule not more than what slice has
This commit is contained in:
@@ -543,7 +543,7 @@ void dlsch_scheduler_pre_processor_accounting(module_id_t Mod_id,
|
|||||||
|
|
||||||
rnti_t rnti;
|
rnti_t rnti;
|
||||||
uint8_t harq_pid, round;
|
uint8_t harq_pid, round;
|
||||||
uint16_t available_rbs;
|
uint16_t available_rbs[NFAPI_CC_MAX];
|
||||||
uint8_t rbs_retx[NFAPI_CC_MAX];
|
uint8_t rbs_retx[NFAPI_CC_MAX];
|
||||||
uint16_t average_rbs_per_user[NFAPI_CC_MAX];
|
uint16_t average_rbs_per_user[NFAPI_CC_MAX];
|
||||||
int total_ue_count[NFAPI_CC_MAX];
|
int total_ue_count[NFAPI_CC_MAX];
|
||||||
@@ -562,6 +562,7 @@ void dlsch_scheduler_pre_processor_accounting(module_id_t Mod_id,
|
|||||||
ue_count_retx[CC_id] = 0;
|
ue_count_retx[CC_id] = 0;
|
||||||
rbs_retx[CC_id] = 0;
|
rbs_retx[CC_id] = 0;
|
||||||
average_rbs_per_user[CC_id] = 0;
|
average_rbs_per_user[CC_id] = 0;
|
||||||
|
available_rbs[CC_id] = 0;
|
||||||
//for (UE_id = 0; UE_id < NFAPI_CC_MAX; ++UE_id) {
|
//for (UE_id = 0; UE_id < NFAPI_CC_MAX; ++UE_id) {
|
||||||
// ue_retx_flag[CC_id][UE_id] = 0;
|
// ue_retx_flag[CC_id][UE_id] = 0;
|
||||||
//}
|
//}
|
||||||
@@ -600,10 +601,18 @@ void dlsch_scheduler_pre_processor_accounting(module_id_t Mod_id,
|
|||||||
// Reduces the available RBs according to slicing configuration
|
// Reduces the available RBs according to slicing configuration
|
||||||
dlsch_scheduler_pre_processor_partitioning(Mod_id, slice_idx, rbs_retx);
|
dlsch_scheduler_pre_processor_partitioning(Mod_id, slice_idx, rbs_retx);
|
||||||
|
|
||||||
|
for (CC_id = 0; CC_id < RC.nb_mac_CC[Mod_id]; ++CC_id) {
|
||||||
|
if (UE_list->head < 0) continue; // no UEs in list
|
||||||
|
// max_rbs_allowed_slice is saved in every UE, so take it from the first one
|
||||||
|
ue_sched_ctl = &UE_list->UE_sched_ctrl[UE_list->head];
|
||||||
|
available_rbs[CC_id] = ue_sched_ctl->max_rbs_allowed_slice[CC_id][slice_idx];
|
||||||
|
}
|
||||||
|
|
||||||
switch (RC.mac[Mod_id]->slice_info.dl[slice_idx].accounting) {
|
switch (RC.mac[Mod_id]->slice_info.dl[slice_idx].accounting) {
|
||||||
|
|
||||||
// If greedy scheduling, try to account all the required RBs
|
// If greedy scheduling, try to account all the required RBs
|
||||||
case POL_GREEDY:
|
case POL_GREEDY:
|
||||||
|
|
||||||
for (UE_id = UE_list->head; UE_id >= 0; UE_id = UE_list->next[UE_id]) {
|
for (UE_id = UE_list->head; UE_id >= 0; UE_id = UE_list->next[UE_id]) {
|
||||||
rnti = UE_RNTI(Mod_id, UE_id);
|
rnti = UE_RNTI(Mod_id, UE_id);
|
||||||
if (rnti == NOT_A_RNTI) continue;
|
if (rnti == NOT_A_RNTI) continue;
|
||||||
@@ -612,7 +621,9 @@ void dlsch_scheduler_pre_processor_accounting(module_id_t Mod_id,
|
|||||||
|
|
||||||
for (i = 0; i < UE_num_active_CC(UE_list, UE_id); i++) {
|
for (i = 0; i < UE_num_active_CC(UE_list, UE_id); i++) {
|
||||||
CC_id = UE_list->ordered_CCids[i][UE_id];
|
CC_id = UE_list->ordered_CCids[i][UE_id];
|
||||||
nb_rbs_accounted[CC_id][UE_id] = nb_rbs_required[CC_id][UE_id];
|
if (available_rbs[CC_id] == 0) continue;
|
||||||
|
nb_rbs_accounted[CC_id][UE_id] = cmin(nb_rbs_required[CC_id][UE_id], available_rbs[CC_id]);
|
||||||
|
available_rbs[CC_id] -= nb_rbs_accounted[CC_id][UE_id];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -634,12 +645,12 @@ void dlsch_scheduler_pre_processor_accounting(module_id_t Mod_id,
|
|||||||
|
|
||||||
CC_id = UE_list->ordered_CCids[i][UE_id];
|
CC_id = UE_list->ordered_CCids[i][UE_id];
|
||||||
ue_sched_ctl = &UE_list->UE_sched_ctrl[UE_id];
|
ue_sched_ctl = &UE_list->UE_sched_ctrl[UE_id];
|
||||||
available_rbs = ue_sched_ctl->max_rbs_allowed_slice[CC_id][slice_idx];
|
available_rbs[CC_id] = ue_sched_ctl->max_rbs_allowed_slice[CC_id][slice_idx];
|
||||||
|
|
||||||
if (ue_count_newtx[CC_id] == 0) {
|
if (ue_count_newtx[CC_id] == 0) {
|
||||||
average_rbs_per_user[CC_id] = 0;
|
average_rbs_per_user[CC_id] = 0;
|
||||||
} else if (min_rb_unit[CC_id]*ue_count_newtx[CC_id] <= available_rbs) {
|
} else if (min_rb_unit[CC_id]*ue_count_newtx[CC_id] <= available_rbs[CC_id]) {
|
||||||
average_rbs_per_user[CC_id] = (uint16_t)floor(available_rbs/ue_count_newtx[CC_id]);
|
average_rbs_per_user[CC_id] = (uint16_t)floor(available_rbs[CC_id]/ue_count_newtx[CC_id]);
|
||||||
} else {
|
} else {
|
||||||
// consider the total number of use that can be scheduled UE
|
// consider the total number of use that can be scheduled UE
|
||||||
average_rbs_per_user[CC_id] = (uint16_t)min_rb_unit[CC_id];
|
average_rbs_per_user[CC_id] = (uint16_t)min_rb_unit[CC_id];
|
||||||
|
|||||||
Reference in New Issue
Block a user