Change in osmo-bts[master]: paging: prioritize CS related paging over PS related pagings.

laforge gerrit-no-reply at lists.osmocom.org
Wed Jul 14 19:21:39 UTC 2021


laforge has submitted this change. ( https://gerrit.osmocom.org/c/osmo-bts/+/24658 )

Change subject: paging: prioritize CS related paging over PS related pagings.
......................................................................

paging: prioritize CS related paging over PS related pagings.

When the paging queue is filled up to a critical level, pagings from the
PCU should be dropped as each immediate assignment paging from the PCU
is worth 4 normal CS pagings. Also the PCU may still issue pagings if the
paginging queue is already full and CS pagings are dropped. In a
congestion situation it is more important to get the CS rather than PS
pagings through.

Change-Id: I30f97672d7a0c369c4a656e878ab8cbbd83e31ea
Related: SYS#5306
---
M include/osmo-bts/bts.h
M include/osmo-bts/paging.h
M src/common/bts.c
M src/common/paging.c
M src/common/pcu_sock.c
5 files changed, 52 insertions(+), 3 deletions(-)

Approvals:
  Jenkins Builder: Verified
  osmith: Looks good to me, but someone else must approve
  daniel: Looks good to me, approved
  laforge: Looks good to me, but someone else must approve



diff --git a/include/osmo-bts/bts.h b/include/osmo-bts/bts.h
index e116618..6a61d01 100644
--- a/include/osmo-bts/bts.h
+++ b/include/osmo-bts/bts.h
@@ -18,7 +18,9 @@
 enum {
 	BTS_CTR_PAGING_RCVD,
 	BTS_CTR_PAGING_DROP,
+	BTS_CTR_PAGING_DROP_PS,
 	BTS_CTR_PAGING_SENT,
+	BTS_CTR_PAGING_CONG,
 	BTS_CTR_RACH_RCVD,
 	BTS_CTR_RACH_DROP,
 	BTS_CTR_RACH_HO,
diff --git a/include/osmo-bts/paging.h b/include/osmo-bts/paging.h
index 7fc0bf0..ef1fc93 100644
--- a/include/osmo-bts/paging.h
+++ b/include/osmo-bts/paging.h
@@ -37,7 +37,7 @@
 
 /* Add an IMM.ASS message to the paging queue */
 int paging_add_imm_ass(struct paging_state *ps, const uint8_t *data,
-                       uint8_t len);
+                       uint8_t len, bool from_pcu);
 
 /* generate paging message for given gsm time */
 int paging_gen_msg(struct paging_state *ps, uint8_t *out_buf, struct gsm_time *gt,
diff --git a/src/common/bts.c b/src/common/bts.c
index d222699..27c7f74 100644
--- a/src/common/bts.c
+++ b/src/common/bts.c
@@ -90,6 +90,8 @@
 static const struct rate_ctr_desc bts_ctr_desc[] = {
 	[BTS_CTR_PAGING_RCVD] =		{"paging:rcvd", "Received paging requests (Abis)"},
 	[BTS_CTR_PAGING_DROP] =		{"paging:drop", "Dropped paging requests (Abis)"},
+	[BTS_CTR_PAGING_DROP_PS] =	{"paging:drop-ps", "Dropped paging requests (PS/PCU)"},
+	[BTS_CTR_PAGING_CONG] =		{"paging:cong", "Paging congestion detected (Abis)"},
 	[BTS_CTR_PAGING_SENT] =		{"paging:sent", "Sent paging requests (Um)"},
 
 	[BTS_CTR_RACH_RCVD] =		{"rach:rcvd", "Received RACH requests (Um)"},
diff --git a/src/common/paging.c b/src/common/paging.c
index 2973141..54d7263 100644
--- a/src/common/paging.c
+++ b/src/common/paging.c
@@ -80,8 +80,37 @@
 	/* total number of currently active paging records in queue */
 	unsigned int num_paging;
 	struct llist_head paging_queue[MAX_PAGING_BLOCKS_CCCH*MAX_BS_PA_MFRMS];
+
+	/* prioritization of cs pagings will automatically become
+	 * active on congestions (queue almost full) */
+	bool cs_priority_active;
 };
 
+/* The prioritization of cs pagings is controlled by a hysteresis. When the
+ * fill state of the paging queue exceeds the upper fill level
+ * THRESHOLD_CONGESTED [%], then PS pagings (immediate assignments) will be
+ * dropped until fill state of the paging queue drops under the lower fill
+ * level THRESHOLD_CLEAR [%]. */
+#define THRESHOLD_CONGESTED 66 /* (percent of num_paging_max) */
+#define THRESHOLD_CLEAR 50 /* (percent of num_paging_max) */
+
+/* Check the queue fill status and decide if prioritization of CS pagings
+ * must be turned on to flatten the negative effects of the congestion
+ * situation on the CS domain. */
+static void check_congestion(struct paging_state *ps)
+{
+	int pag_queue_len = paging_queue_length(ps);
+	int pag_queue_max = paging_get_queue_max(ps);
+	unsigned int treshold_upper = pag_queue_max * THRESHOLD_CONGESTED / 100;
+	unsigned int treshold_lower = pag_queue_max * THRESHOLD_CLEAR / 100;
+
+	if (pag_queue_len > treshold_upper && ps->cs_priority_active == false) {
+		ps->cs_priority_active = true;
+		rate_ctr_inc2(ps->bts->ctrs, BTS_CTR_PAGING_CONG);
+	} else if (pag_queue_len < treshold_lower)
+		ps->cs_priority_active = false;
+}
+
 unsigned int paging_get_lifetime(struct paging_state *ps)
 {
 	return ps->paging_lifetime;
@@ -181,6 +210,8 @@
 	int blocks = gsm48_number_of_paging_subchannels(&ps->chan_desc);
 	struct paging_record *pr;
 
+	check_congestion(ps);
+
 	rate_ctr_inc2(ps->bts->ctrs, BTS_CTR_PAGING_RCVD);
 
 	if (paging_group >= blocks) {
@@ -238,12 +269,21 @@
 
 /* Add an IMM.ASS message to the paging queue */
 int paging_add_imm_ass(struct paging_state *ps, const uint8_t *data,
-		       uint8_t len)
+                       uint8_t len, bool from_pcu)
 {
 	struct llist_head *group_q;
 	struct paging_record *pr;
 	uint16_t imsi, paging_group;
 
+	check_congestion(ps);
+
+	if (ps->cs_priority_active && from_pcu) {
+		LOGP(DPAG, LOGL_NOTICE, "Dropping paging for PS, queue congested (%u)\n",
+			ps->num_paging);
+		rate_ctr_inc2(ps->bts->ctrs, BTS_CTR_PAGING_DROP_PS);
+		return -ENOSPC;
+	}
+
 	if (len != GSM_MACBLOCK_LEN + 3) {
 		LOGP(DPAG, LOGL_ERROR, "IMM.ASS invalid length %d\n", len);
 		return -EINVAL;
@@ -530,6 +570,10 @@
 	int group;
 	int len;
 
+	/* This will have no effect on behavior of this function, we just need
+	 * need to check the congestion status of the queue from time to time. */
+	check_congestion(ps);
+
 	*is_empty = 0;
 	bts->load.ccch.pch_total += 1;
 
@@ -711,6 +755,7 @@
 	ps->bts = bts;
 	ps->paging_lifetime = paging_lifetime;
 	ps->num_paging_max = num_paging_max;
+	ps->cs_priority_active = false;
 
 	for (i = 0; i < ARRAY_SIZE(ps->paging_queue); i++)
 		INIT_LLIST_HEAD(&ps->paging_queue[i]);
diff --git a/src/common/pcu_sock.c b/src/common/pcu_sock.c
index 41a5ffc..03f1a05 100644
--- a/src/common/pcu_sock.c
+++ b/src/common/pcu_sock.c
@@ -673,7 +673,7 @@
 
 	switch (data_req->sapi) {
 	case PCU_IF_SAPI_PCH:
-		paging_add_imm_ass(bts->paging_state, data_req->data, data_req->len);
+		paging_add_imm_ass(bts->paging_state, data_req->data, data_req->len, true);
 		break;
 	case PCU_IF_SAPI_AGCH:
 		msg = msgb_alloc(data_req->len, "pcu_agch");

-- 
To view, visit https://gerrit.osmocom.org/c/osmo-bts/+/24658
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-bts
Gerrit-Branch: master
Gerrit-Change-Id: I30f97672d7a0c369c4a656e878ab8cbbd83e31ea
Gerrit-Change-Number: 24658
Gerrit-PatchSet: 8
Gerrit-Owner: dexter <pmaier at sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: daniel <dwillmann at sysmocom.de>
Gerrit-Reviewer: fixeria <vyanitskiy at sysmocom.de>
Gerrit-Reviewer: laforge <laforge at osmocom.org>
Gerrit-Reviewer: neels <nhofmeyr at sysmocom.de>
Gerrit-Reviewer: osmith <osmith at sysmocom.de>
Gerrit-Reviewer: pespin <pespin at sysmocom.de>
Gerrit-MessageType: merged
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20210714/36ea3dd4/attachment.htm>


More information about the gerrit-log mailing list