[PATCH] osmo-pcu[master]: Simplify TS alloc: separate capacity computation

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/.

Max gerrit-no-reply at lists.osmocom.org
Wed Jan 31 16:38:42 UTC 2018


Hello Harald Welte, Jenkins Builder,

I'd like you to reexamine a change.  Please visit

    https://gerrit.osmocom.org/3934

to look at the new patch set (#10).

Simplify TS alloc: separate capacity computation

Move TRX capacity computation into separate function and document it.

Change-Id: Ifd88fc7ff818ea2a041eae61c5d457926a0df0f2
Related: OS#2282
---
M src/gprs_rlcmac_ts_alloc.cpp
M src/mslot_class.c
M src/mslot_class.h
3 files changed, 52 insertions(+), 43 deletions(-)


  git pull ssh://gerrit.osmocom.org:29418/osmo-pcu refs/changes/34/3934/10

diff --git a/src/gprs_rlcmac_ts_alloc.cpp b/src/gprs_rlcmac_ts_alloc.cpp
index 07b7c21..622342c 100644
--- a/src/gprs_rlcmac_ts_alloc.cpp
+++ b/src/gprs_rlcmac_ts_alloc.cpp
@@ -58,24 +58,6 @@
 	return was_set;
 }
 
-static inline int8_t find_free_usf(const struct gprs_rlcmac_pdch *pdch)
-{
-	uint8_t usf_map = 0;
-	uint8_t usf;
-
-	usf_map = pdch->assigned_usf();
-	if (usf_map == (1 << 7) - 1)
-		return -1;
-
-	/* look for USF, don't use USF=7 */
-	for (usf = 0; usf < 7; usf++) {
-		if (!(usf_map & (1 << usf)))
-			return usf;
-	}
-
-	return -1;
-}
-
 static inline int8_t find_free_tfi(const struct gprs_rlcmac_pdch *pdch, enum gprs_rlcmac_tbf_direction dir)
 {
 	uint32_t tfi_map = pdch->assigned_tfi(dir);
@@ -211,7 +193,7 @@
 			}
 			/* Make sure that an USF is available */
 			if (dir == GPRS_RLCMAC_UL_TBF) {
-				usf = find_free_usf(pdch);
+				usf = find_free_usf(pdch->assigned_usf());
 				if (usf < 0) {
 					LOGP(DRLCMAC, LOGL_DEBUG,
 						"- Skipping TS %d, because "
@@ -461,6 +443,33 @@
 	return 0;
 }
 
+/*! Compute capacity of a given TRX
+ *
+ *  \param[in] trx Pointer to TRX object
+ *  \param[in] rx_window Receive window
+ *  \param[in] tx_window Transmit window
+ *  \returns non-negative capacity
+ */
+static inline unsigned compute_capacity(const struct gprs_rlcmac_trx *trx, int rx_window, int tx_window)
+{
+	const struct gprs_rlcmac_pdch *pdch;
+	unsigned ts, capacity = 0;
+
+	for (ts = 0; ts < ARRAY_SIZE(trx->pdch); ts++) {
+		pdch = &trx->pdch[ts];
+		if (rx_window & (1 << ts))
+			capacity += OSMO_MAX(32 - pdch->num_reserved(GPRS_RLCMAC_DL_TBF), 1);
+
+		/* Only consider common slots for UL */
+		if (tx_window & rx_window & (1 << ts)) {
+			if (find_free_usf(pdch->assigned_usf()) >= 0)
+				capacity += OSMO_MAX(32 - pdch->num_reserved(GPRS_RLCMAC_UL_TBF), 1);
+		}
+	}
+
+	return capacity;
+}
+
 /*! Find set of slots available for allocation while taking MS class into account
  *
  *  \param[in] trx Pointer to TRX object
@@ -475,9 +484,8 @@
 		Sum = mslot_class_get_sum(mslot_class); /* Max number of Tx + Rx slots */
 	int rx_window, tx_window, pdch_slots;
 	char slot_info[9] = {0};
-	int max_capacity;
-	uint8_t max_ul_slots;
-	uint8_t max_dl_slots;
+	int max_capacity = -1;
+	uint8_t max_ul_slots = 0, max_dl_slots = 0;
 	unsigned max_slots;
 
 	unsigned ul_ts, dl_ts;
@@ -562,7 +570,6 @@
 		unsigned rx_slot_count;
 		uint16_t rx_bad;
 		uint8_t rx_good;
-		unsigned ts;
 		int capacity;
 
 		/* Filter out bad slots */
@@ -661,25 +668,7 @@
 		}
 
 		/* Compute capacity */
-		capacity = 0;
-
-		for (ts = 0; ts < ARRAY_SIZE(trx->pdch); ts++) {
-			int c;
-			const struct gprs_rlcmac_pdch *pdch = &trx->pdch[ts];
-			if (rx_window & (1 << ts)) {
-				c = 32 - pdch->num_reserved(GPRS_RLCMAC_DL_TBF);
-				c = OSMO_MAX(c, 1);
-				capacity += c;
-			}
-			/* Only consider common slots for UL */
-			if (tx_window & rx_window & (1 << ts)) {
-				if (find_free_usf(pdch) >= 0) {
-					c = 32 - pdch->num_reserved(GPRS_RLCMAC_UL_TBF);
-					c = OSMO_MAX(c, 1);
-					capacity += c;
-				}
-			}
-		}
+		capacity = compute_capacity(trx, rx_window, tx_window);
 
 #ifdef ENABLE_TS_ALLOC_DEBUG
 		LOGP(DRLCMAC, LOGL_DEBUG,
@@ -700,7 +689,10 @@
 		max_capacity = capacity;
 		max_ul_slots = tx_window;
 		max_dl_slots = rx_window;
-	}}}}
+	}
+	}
+	}
+	}
 
 	if (!max_ul_slots || !max_dl_slots) {
 		LOGP(DRLCMAC, LOGL_NOTICE,
diff --git a/src/mslot_class.c b/src/mslot_class.c
index 1c79a21..87e37ca 100644
--- a/src/mslot_class.c
+++ b/src/mslot_class.c
@@ -212,3 +212,19 @@
 	rx_mask[MASK_TT] = (rx_mask[MASK_TT] << 3) | (rx_mask[MASK_TT] >> 5);
 	rx_mask[MASK_TR] = (rx_mask[MASK_TR] << 3) | (rx_mask[MASK_TR] >> 5);
 }
+
+/* look for USF, don't use USF=7 */
+int8_t find_free_usf(uint8_t usf_map)
+{
+	uint8_t usf;
+
+	if (usf_map == (1 << 7) - 1)
+		return -1;
+
+	for (usf = 0; usf < 7; usf++) {
+		if (!(usf_map & (1 << usf)))
+			return usf;
+	}
+
+	return -1;
+}
diff --git a/src/mslot_class.h b/src/mslot_class.h
index 4f5a7ff..d248526 100644
--- a/src/mslot_class.h
+++ b/src/mslot_class.h
@@ -50,3 +50,4 @@
 uint8_t mslot_class_max();
 
 void mslot_fill_rx_mask(uint8_t mslot_class, uint8_t num_tx, uint8_t *rx_mask);
+int8_t find_free_usf(uint8_t usf_map);

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

Gerrit-MessageType: newpatchset
Gerrit-Change-Id: Ifd88fc7ff818ea2a041eae61c5d457926a0df0f2
Gerrit-PatchSet: 10
Gerrit-Project: osmo-pcu
Gerrit-Branch: master
Gerrit-Owner: Max <msuraev at sysmocom.de>
Gerrit-Reviewer: Harald Welte <laforge at gnumonks.org>
Gerrit-Reviewer: Jenkins Builder



More information about the gerrit-log mailing list