<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bts/+/24658">View Change</a></p><div style="white-space:pre-wrap">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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">paging: prioritize CS related paging over PS related pagings.<br><br>When the paging queue is filled up to a critical level, pagings from the<br>PCU should be dropped as each immediate assignment paging from the PCU<br>is worth 4 normal CS pagings. Also the PCU may still issue pagings if the<br>paginging queue is already full and CS pagings are dropped. In a<br>congestion situation it is more important to get the CS rather than PS<br>pagings through.<br><br>Change-Id: I30f97672d7a0c369c4a656e878ab8cbbd83e31ea<br>Related: SYS#5306<br>---<br>M include/osmo-bts/bts.h<br>M include/osmo-bts/paging.h<br>M src/common/bts.c<br>M src/common/paging.c<br>M src/common/pcu_sock.c<br>5 files changed, 52 insertions(+), 3 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmo-bts/bts.h b/include/osmo-bts/bts.h</span><br><span>index e116618..6a61d01 100644</span><br><span>--- a/include/osmo-bts/bts.h</span><br><span>+++ b/include/osmo-bts/bts.h</span><br><span>@@ -18,7 +18,9 @@</span><br><span> enum {</span><br><span>   BTS_CTR_PAGING_RCVD,</span><br><span>         BTS_CTR_PAGING_DROP,</span><br><span style="color: hsl(120, 100%, 40%);">+  BTS_CTR_PAGING_DROP_PS,</span><br><span>      BTS_CTR_PAGING_SENT,</span><br><span style="color: hsl(120, 100%, 40%);">+  BTS_CTR_PAGING_CONG,</span><br><span>         BTS_CTR_RACH_RCVD,</span><br><span>   BTS_CTR_RACH_DROP,</span><br><span>   BTS_CTR_RACH_HO,</span><br><span>diff --git a/include/osmo-bts/paging.h b/include/osmo-bts/paging.h</span><br><span>index 7fc0bf0..ef1fc93 100644</span><br><span>--- a/include/osmo-bts/paging.h</span><br><span>+++ b/include/osmo-bts/paging.h</span><br><span>@@ -37,7 +37,7 @@</span><br><span> </span><br><span> /* Add an IMM.ASS message to the paging queue */</span><br><span> int paging_add_imm_ass(struct paging_state *ps, const uint8_t *data,</span><br><span style="color: hsl(0, 100%, 40%);">-                       uint8_t len);</span><br><span style="color: hsl(120, 100%, 40%);">+                       uint8_t len, bool from_pcu);</span><br><span> </span><br><span> /* generate paging message for given gsm time */</span><br><span> int paging_gen_msg(struct paging_state *ps, uint8_t *out_buf, struct gsm_time *gt,</span><br><span>diff --git a/src/common/bts.c b/src/common/bts.c</span><br><span>index d222699..27c7f74 100644</span><br><span>--- a/src/common/bts.c</span><br><span>+++ b/src/common/bts.c</span><br><span>@@ -90,6 +90,8 @@</span><br><span> static const struct rate_ctr_desc bts_ctr_desc[] = {</span><br><span>        [BTS_CTR_PAGING_RCVD] =         {"paging:rcvd", "Received paging requests (Abis)"},</span><br><span>      [BTS_CTR_PAGING_DROP] =         {"paging:drop", "Dropped paging requests (Abis)"},</span><br><span style="color: hsl(120, 100%, 40%);">+        [BTS_CTR_PAGING_DROP_PS] =      {"paging:drop-ps", "Dropped paging requests (PS/PCU)"},</span><br><span style="color: hsl(120, 100%, 40%);">+   [BTS_CTR_PAGING_CONG] =         {"paging:cong", "Paging congestion detected (Abis)"},</span><br><span>    [BTS_CTR_PAGING_SENT] =         {"paging:sent", "Sent paging requests (Um)"},</span><br><span> </span><br><span>        [BTS_CTR_RACH_RCVD] =           {"rach:rcvd", "Received RACH requests (Um)"},</span><br><span>diff --git a/src/common/paging.c b/src/common/paging.c</span><br><span>index 2973141..54d7263 100644</span><br><span>--- a/src/common/paging.c</span><br><span>+++ b/src/common/paging.c</span><br><span>@@ -80,8 +80,37 @@</span><br><span>      /* total number of currently active paging records in queue */</span><br><span>       unsigned int num_paging;</span><br><span>     struct llist_head paging_queue[MAX_PAGING_BLOCKS_CCCH*MAX_BS_PA_MFRMS];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* prioritization of cs pagings will automatically become</span><br><span style="color: hsl(120, 100%, 40%);">+      * active on congestions (queue almost full) */</span><br><span style="color: hsl(120, 100%, 40%);">+       bool cs_priority_active;</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* The prioritization of cs pagings is controlled by a hysteresis. When the</span><br><span style="color: hsl(120, 100%, 40%);">+ * fill state of the paging queue exceeds the upper fill level</span><br><span style="color: hsl(120, 100%, 40%);">+ * THRESHOLD_CONGESTED [%], then PS pagings (immediate assignments) will be</span><br><span style="color: hsl(120, 100%, 40%);">+ * dropped until fill state of the paging queue drops under the lower fill</span><br><span style="color: hsl(120, 100%, 40%);">+ * level THRESHOLD_CLEAR [%]. */</span><br><span style="color: hsl(120, 100%, 40%);">+#define THRESHOLD_CONGESTED 66 /* (percent of num_paging_max) */</span><br><span style="color: hsl(120, 100%, 40%);">+#define THRESHOLD_CLEAR 50 /* (percent of num_paging_max) */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Check the queue fill status and decide if prioritization of CS pagings</span><br><span style="color: hsl(120, 100%, 40%);">+ * must be turned on to flatten the negative effects of the congestion</span><br><span style="color: hsl(120, 100%, 40%);">+ * situation on the CS domain. */</span><br><span style="color: hsl(120, 100%, 40%);">+static void check_congestion(struct paging_state *ps)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  int pag_queue_len = paging_queue_length(ps);</span><br><span style="color: hsl(120, 100%, 40%);">+  int pag_queue_max = paging_get_queue_max(ps);</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned int treshold_upper = pag_queue_max * THRESHOLD_CONGESTED / 100;</span><br><span style="color: hsl(120, 100%, 40%);">+      unsigned int treshold_lower = pag_queue_max * THRESHOLD_CLEAR / 100;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (pag_queue_len > treshold_upper && ps->cs_priority_active == false) {</span><br><span style="color: hsl(120, 100%, 40%);">+                ps->cs_priority_active = true;</span><br><span style="color: hsl(120, 100%, 40%);">+             rate_ctr_inc2(ps->bts->ctrs, BTS_CTR_PAGING_CONG);</span><br><span style="color: hsl(120, 100%, 40%);">+      } else if (pag_queue_len < treshold_lower)</span><br><span style="color: hsl(120, 100%, 40%);">+         ps->cs_priority_active = false;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> unsigned int paging_get_lifetime(struct paging_state *ps)</span><br><span> {</span><br><span>    return ps->paging_lifetime;</span><br><span>@@ -181,6 +210,8 @@</span><br><span>         int blocks = gsm48_number_of_paging_subchannels(&ps->chan_desc);</span><br><span>      struct paging_record *pr;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ check_congestion(ps);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>      rate_ctr_inc2(ps->bts->ctrs, BTS_CTR_PAGING_RCVD);</span><br><span> </span><br><span>         if (paging_group >= blocks) {</span><br><span>@@ -238,12 +269,21 @@</span><br><span> </span><br><span> /* Add an IMM.ASS message to the paging queue */</span><br><span> int paging_add_imm_ass(struct paging_state *ps, const uint8_t *data,</span><br><span style="color: hsl(0, 100%, 40%);">-                       uint8_t len)</span><br><span style="color: hsl(120, 100%, 40%);">+                       uint8_t len, bool from_pcu)</span><br><span> {</span><br><span>         struct llist_head *group_q;</span><br><span>  struct paging_record *pr;</span><br><span>    uint16_t imsi, paging_group;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+      check_congestion(ps);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       if (ps->cs_priority_active && from_pcu) {</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGP(DPAG, LOGL_NOTICE, "Dropping paging for PS, queue congested (%u)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                   ps->num_paging);</span><br><span style="color: hsl(120, 100%, 40%);">+           rate_ctr_inc2(ps->bts->ctrs, BTS_CTR_PAGING_DROP_PS);</span><br><span style="color: hsl(120, 100%, 40%);">+           return -ENOSPC;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  if (len != GSM_MACBLOCK_LEN + 3) {</span><br><span>           LOGP(DPAG, LOGL_ERROR, "IMM.ASS invalid length %d\n", len);</span><br><span>                return -EINVAL;</span><br><span>@@ -530,6 +570,10 @@</span><br><span>       int group;</span><br><span>   int len;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+  /* This will have no effect on behavior of this function, we just need</span><br><span style="color: hsl(120, 100%, 40%);">+         * need to check the congestion status of the queue from time to time. */</span><br><span style="color: hsl(120, 100%, 40%);">+     check_congestion(ps);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>      *is_empty = 0;</span><br><span>       bts->load.ccch.pch_total += 1;</span><br><span> </span><br><span>@@ -711,6 +755,7 @@</span><br><span>  ps->bts = bts;</span><br><span>    ps->paging_lifetime = paging_lifetime;</span><br><span>    ps->num_paging_max = num_paging_max;</span><br><span style="color: hsl(120, 100%, 40%);">+       ps->cs_priority_active = false;</span><br><span> </span><br><span>       for (i = 0; i < ARRAY_SIZE(ps->paging_queue); i++)</span><br><span>             INIT_LLIST_HEAD(&ps->paging_queue[i]);</span><br><span>diff --git a/src/common/pcu_sock.c b/src/common/pcu_sock.c</span><br><span>index 41a5ffc..03f1a05 100644</span><br><span>--- a/src/common/pcu_sock.c</span><br><span>+++ b/src/common/pcu_sock.c</span><br><span>@@ -673,7 +673,7 @@</span><br><span> </span><br><span>     switch (data_req->sapi) {</span><br><span>         case PCU_IF_SAPI_PCH:</span><br><span style="color: hsl(0, 100%, 40%);">-           paging_add_imm_ass(bts->paging_state, data_req->data, data_req->len);</span><br><span style="color: hsl(120, 100%, 40%);">+                paging_add_imm_ass(bts->paging_state, data_req->data, data_req->len, true);</span><br><span>                 break;</span><br><span>       case PCU_IF_SAPI_AGCH:</span><br><span>               msg = msgb_alloc(data_req->len, "pcu_agch");</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bts/+/24658">change 24658</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/osmo-bts/+/24658"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-bts </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I30f97672d7a0c369c4a656e878ab8cbbd83e31ea </div>
<div style="display:none"> Gerrit-Change-Number: 24658 </div>
<div style="display:none"> Gerrit-PatchSet: 8 </div>
<div style="display:none"> Gerrit-Owner: dexter <pmaier@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: daniel <dwillmann@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: osmith <osmith@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>