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.orgReview at https://gerrit.osmocom.org/6809 trxcon/scheduler: prioritize FACCH correctly Previously we used to compare two consecutive first primitives, taken from a transmit queue. This approach may cause some delay, which is critical for FACCH e.g. in case of handover. Let's walk through a whole transmit queue to find a pair of both FACCH frames, and only then decide what to do. Change-Id: I925cca77bfaa255dd095bc882c901d41c9bc4633 --- M src/host/trxcon/sched_prim.c 1 file changed, 41 insertions(+), 33 deletions(-) git pull ssh://gerrit.osmocom.org:29418/osmocom-bb refs/changes/09/6809/1 diff --git a/src/host/trxcon/sched_prim.c b/src/host/trxcon/sched_prim.c index 3a46ab6..da2ff3b 100644 --- a/src/host/trxcon/sched_prim.c +++ b/src/host/trxcon/sched_prim.c @@ -145,43 +145,51 @@ */ static struct trx_ts_prim *sched_prim_dequeue_tch(struct llist_head *queue) { - struct trx_ts_prim *a, *b; + struct trx_ts_prim *facch = NULL; + struct trx_ts_prim *tch = NULL; + struct trx_ts_prim *i; - /* Dequeue the first prim */ - a = llist_entry(queue->next, struct trx_ts_prim, list); - llist_del(&a->list); + /* Attempt to find a pair of FACCH and TCH frames */ + llist_for_each_entry(i, queue, list) { + /* Find one FACCH frame */ + if (!facch && PRIM_IS_FACCH(i)) + facch = i; - /* If this was the only one => do nothing... */ - if (llist_empty(queue)) - return a; + /* Find one TCH frame */ + if (!tch && PRIM_IS_TCH(i)) + tch = i; - /* Obtain the next prim */ - b = llist_entry(queue->next, struct trx_ts_prim, list); - - /* Find and prioritize FACCH */ - if (PRIM_IS_FACCH(a) && PRIM_IS_TCH(b)) { - /** - * Case 1: first is FACCH, second is TCH: - * Prioritize FACCH, dropping TCH - */ - llist_del(&b->list); - talloc_free(b); - return a; - } else if (PRIM_IS_TCH(a) && PRIM_IS_FACCH(b)) { - /** - * Case 2: first is TCH, second is FACCH: - * Prioritize FACCH, dropping TCH - */ - llist_del(&b->list); - talloc_free(a); - return b; - } else { - /** - * Otherwise: both are TCH or FACCH frames: - * Nothing to prioritize, return the first one - */ - return a; + /* If both are found */ + if (facch && tch) + break; } + + /* There should be at least one frame found */ + OSMO_ASSERT(facch || tch); + + /* Prioritize FACCH */ + if (facch && tch) { + /* We found a pair, dequeue both */ + llist_del(&facch->list); + llist_del(&tch->list); + + /* Drop TCH */ + talloc_free(tch); + + /* FACCH replaces TCH */ + return facch; + } else if (facch) { + /* Only FACCH was found */ + llist_del(&facch->list); + return facch; + } else if (tch) { + /* Only TCH was found */ + llist_del(&tch->list); + return tch; + } + + /* Unreachable */ + OSMO_ASSERT(0); } /** -- To view, visit https://gerrit.osmocom.org/6809 To unsubscribe, visit https://gerrit.osmocom.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I925cca77bfaa255dd095bc882c901d41c9bc4633 Gerrit-PatchSet: 1 Gerrit-Project: osmocom-bb Gerrit-Branch: master Gerrit-Owner: Harald Welte <laforge at gnumonks.org>