Skip to content

Commit 3157144

Browse files
frankistcodebot
authored andcommitted
sched: handle only one DL buffer occupancy update per bearer per slot
1 parent 7525221 commit 3157144

File tree

2 files changed

+80
-21
lines changed

2 files changed

+80
-21
lines changed

lib/scheduler/ue_scheduling/ue_event_manager.cpp

Lines changed: 75 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,80 @@
1515

1616
using namespace srsran;
1717

18+
class ue_event_manager::ue_dl_buffer_occupancy_manager
19+
{
20+
public:
21+
ue_dl_buffer_occupancy_manager(ue_event_manager& parent_) : parent(parent_)
22+
{
23+
std::fill(ue_rlc_bo_list.begin(), ue_rlc_bo_list.end(), -1);
24+
}
25+
26+
void enqueue_rlc_buffer_occupancy_update(const dl_buffer_state_indication_message& rlc_dl_bo)
27+
{
28+
unsigned idx = rlc_dl_bo.ue_index * MAX_NOF_RB_LCIDS + rlc_dl_bo.lcid;
29+
bool first_rlc_bo = ue_rlc_bo_list[idx].exchange(rlc_dl_bo.bs, std::memory_order_acquire) < 0;
30+
31+
if (not first_rlc_bo) {
32+
return;
33+
}
34+
35+
pending_evs.push(rlc_dl_bo);
36+
}
37+
38+
void slot_indication()
39+
{
40+
// Retrieve pending UEs.
41+
pending_evs.slot_indication();
42+
span<dl_buffer_state_indication_message> ues_to_process = pending_evs.get_events();
43+
44+
// Process RLC buffer updates of pending UEs.
45+
for (dl_buffer_state_indication_message& dl_bo : ues_to_process) {
46+
if (not parent.ue_db.contains(dl_bo.ue_index)) {
47+
parent.log_invalid_ue_index(dl_bo.ue_index);
48+
continue;
49+
}
50+
ue& u = parent.ue_db[dl_bo.ue_index];
51+
52+
// Update DL buffer state with latest RLC buffer occupancy update for this UE.
53+
unsigned idx = dl_bo.ue_index * MAX_NOF_RB_LCIDS + dl_bo.lcid;
54+
dl_bo.bs = ue_rlc_bo_list[idx].exchange(-1, std::memory_order_acq_rel);
55+
56+
// Forward DL buffer state to UE.
57+
u.handle_dl_buffer_state_indication(dl_bo);
58+
if (dl_bo.lcid == LCID_SRB0) {
59+
// Signal SRB0 scheduler with the new SRB0 buffer state.
60+
parent.du_cells[u.get_pcell().cell_index].srb0_sched->handle_dl_buffer_state_indication(dl_bo.ue_index);
61+
}
62+
63+
// Log event.
64+
parent.ev_logger.enqueue(dl_bo);
65+
66+
// Report event.
67+
parent.metrics_handler.handle_dl_buffer_state_indication(dl_bo);
68+
}
69+
}
70+
71+
private:
72+
ue_event_manager& parent;
73+
74+
std::array<std::atomic<int>, MAX_NOF_DU_UES * MAX_NOF_RB_LCIDS> ue_rlc_bo_list;
75+
76+
slot_event_list<dl_buffer_state_indication_message> pending_evs;
77+
};
78+
1879
ue_event_manager::ue_event_manager(ue_repository& ue_db_,
1980
scheduler_metrics_handler& metrics_handler_,
2081
scheduler_event_logger& ev_logger_) :
21-
ue_db(ue_db_), metrics_handler(metrics_handler_), ev_logger(ev_logger_), logger(srslog::fetch_basic_logger("SCHED"))
82+
ue_db(ue_db_),
83+
metrics_handler(metrics_handler_),
84+
ev_logger(ev_logger_),
85+
logger(srslog::fetch_basic_logger("SCHED")),
86+
dl_bo_mng(std::make_unique<ue_dl_buffer_occupancy_manager>(*this))
2287
{
2388
}
2489

90+
ue_event_manager::~ue_event_manager() {}
91+
2592
void ue_event_manager::handle_ue_creation(ue_config_update_event ev)
2693
{
2794
// Create UE object outside the scheduler slot indication handler to minimize latency.
@@ -323,30 +390,13 @@ void ue_event_manager::handle_dl_mac_ce_indication(const dl_mac_ce_indication& c
323390

324391
void ue_event_manager::handle_dl_buffer_state_indication(const dl_buffer_state_indication_message& bs)
325392
{
326-
common_events.emplace(bs.ue_index, [this, bs]() {
327-
if (not ue_db.contains(bs.ue_index)) {
328-
log_invalid_ue_index(bs.ue_index, "DL Buffer State");
329-
return;
330-
}
331-
ue& u = ue_db[bs.ue_index];
332-
333-
u.handle_dl_buffer_state_indication(bs);
334-
if (bs.lcid == LCID_SRB0) {
335-
// Signal SRB0 scheduler with the new SRB0 buffer state.
336-
du_cells[u.get_pcell().cell_index].srb0_sched->handle_dl_buffer_state_indication(bs.ue_index);
337-
}
338-
339-
// Log event.
340-
ev_logger.enqueue(bs);
341-
342-
// Report event.
343-
metrics_handler.handle_dl_buffer_state_indication(bs);
344-
});
393+
dl_bo_mng->enqueue_rlc_buffer_occupancy_update(bs);
345394
}
346395

347396
void ue_event_manager::process_common(slot_point sl, du_cell_index_t cell_index)
348397
{
349-
if (last_sl != sl) {
398+
bool new_slot_detected = last_sl != sl;
399+
if (new_slot_detected) {
350400
// Pop pending common events.
351401
common_events.slot_indication();
352402
last_sl = sl;
@@ -377,6 +427,10 @@ void ue_event_manager::process_common(slot_point sl, du_cell_index_t cell_index)
377427
}
378428
}
379429
}
430+
431+
if (new_slot_detected) {
432+
dl_bo_mng->slot_indication();
433+
}
380434
}
381435

382436
void ue_event_manager::process_cell_specific(du_cell_index_t cell_index)

lib/scheduler/ue_scheduling/ue_event_manager.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ class ue_event_manager final : public sched_ue_configuration_handler,
3333
{
3434
public:
3535
ue_event_manager(ue_repository& ue_db, scheduler_metrics_handler& metrics_handler, scheduler_event_logger& ev_logger);
36+
~ue_event_manager();
3637

3738
void add_cell(const cell_configuration& cell_cfg_, ue_srb0_scheduler& srb0_sched);
3839

@@ -55,6 +56,8 @@ class ue_event_manager final : public sched_ue_configuration_handler,
5556
void run(slot_point sl, du_cell_index_t cell_index);
5657

5758
private:
59+
class ue_dl_buffer_occupancy_manager;
60+
5861
struct common_event_t {
5962
du_ue_index_t ue_index = MAX_NOF_DU_UES;
6063
unique_function<void()> callback;
@@ -115,6 +118,8 @@ class ue_event_manager final : public sched_ue_configuration_handler,
115118
/// UE carriers when CA is enabled (e.g. SR, BSR, reconfig).
116119
slot_event_list<common_event_t> common_events;
117120
slot_point last_sl;
121+
122+
std::unique_ptr<ue_dl_buffer_occupancy_manager> dl_bo_mng;
118123
};
119124

120125
} // namespace srsran

0 commit comments

Comments
 (0)