[MERGED] osmocom-bb[master]: VIRT-PHY: Scheduler - correct handling over hyperframe repeat.

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.

Harald Welte gerrit-no-reply at lists.osmocom.org
Wed Jul 12 21:48:57 UTC 2017


Harald Welte has submitted this change and it was merged.

Change subject: VIRT-PHY: Scheduler - correct handling over hyperframe repeat.
......................................................................


VIRT-PHY: Scheduler - correct handling over hyperframe repeat.

Scheduler will no longer skip tasks that are scheduler for a framenumber
greater than the current fn because of a hyperframe repetition.

Change-Id: I683ba18b5dee308d58f9a95a0ee10e22da207eda
---
M src/host/virt_phy/src/virt_l1_sched_simple.c
1 file changed, 14 insertions(+), 4 deletions(-)

Approvals:
  Harald Welte: Looks good to me, approved
  Jenkins Builder: Verified



diff --git a/src/host/virt_phy/src/virt_l1_sched_simple.c b/src/host/virt_phy/src/virt_l1_sched_simple.c
index fbb5423..d3975ee 100644
--- a/src/host/virt_phy/src/virt_l1_sched_simple.c
+++ b/src/host/virt_phy/src/virt_l1_sched_simple.c
@@ -9,6 +9,8 @@
 
 static LLIST_HEAD(mframe_item_list);
 
+static uint32_t last_exec_fn = 0;
+
 /**
  * @brief Initialize schedulers data structures.
  */
@@ -70,10 +72,16 @@
 void virt_l1_sched_execute(uint32_t fn)
 {
 	struct virt_l1_sched_mframe_item *mi_next, *mi_tmp;
-	// FIXME: change of hyperframe and thus restarting fn at 0 may cause messages in the queue that are never handled
+	uint8_t hyperframe_restart = fn < last_exec_fn;
+
 	llist_for_each_entry_safe(mi_next, mi_tmp, &mframe_item_list, mframe_item_entry)
 	{
-		if (mi_next->fn <= fn) {
+		/* execute all registered handler for current mf sched item */
+		uint8_t exec_now = mi_next->fn <= fn || (hyperframe_restart && mi_next->fn > last_exec_fn);
+		/* break loop, as we have an ordered list in case the hyperframe had not been reset */
+		uint8_t break_now = mi_next->fn > fn && !hyperframe_restart;
+
+		if(exec_now) {
 			struct virt_l1_sched_tdma_item *ti_next, *ti_tmp;
 			// run through all scheduled tdma sched items for that frame number
 			llist_for_each_entry_safe(ti_next, ti_tmp, &mi_next->tdma_item_list, tdma_item_entry)
@@ -87,11 +95,13 @@
 			// remove handled mframe sched item
 			llist_del(&mi_next->mframe_item_entry);
 			talloc_free(mi_next);
-		} else if (mi_next->fn > fn) {
-			/* break the loop as our list is ordered */
+		}
+
+		if(break_now) {
 			break;
 		}
 	}
+	last_exec_fn = fn;
 }
 
 /**

-- 
To view, visit https://gerrit.osmocom.org/3209
To unsubscribe, visit https://gerrit.osmocom.org/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I683ba18b5dee308d58f9a95a0ee10e22da207eda
Gerrit-PatchSet: 2
Gerrit-Project: osmocom-bb
Gerrit-Branch: master
Gerrit-Owner: Harald Welte <laforge at gnumonks.org>
Gerrit-Reviewer: BastusIII <sebastian.stumpf87 at googlemail.com>
Gerrit-Reviewer: Harald Welte <laforge at gnumonks.org>
Gerrit-Reviewer: Jenkins Builder



More information about the gerrit-log mailing list