<p>fixeria has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bts/+/22224">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">paging: refactor and optimize fill_paging_type_1()<br><br>As far as I can see from my perf measurements, bitvec_fill() is called<br>quite often and takes 0.27% of the CPU.  A more detailed look reveals<br>that it's indirectly called by fill_paging_type_1() in order to fill<br>the remaining octets with constant '2B'O padding.<br><br>Let's optimize this function:<br><br>  - use memset() for padding *before* writing optional P1 Rest Octets;<br>  - conditionally initialize the bit vector for P1 Rest Octets;<br>  - use designated initializers instead of memset().<br><br>Change-Id: I90473356b396e5dd9326598aca025afacca4afc8<br>---<br>M src/common/paging.c<br>1 file changed, 18 insertions(+), 16 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-bts refs/changes/24/22224/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/common/paging.c b/src/common/paging.c</span><br><span>index fca58b5..2973141 100644</span><br><span>--- a/src/common/paging.c</span><br><span>+++ b/src/common/paging.c</span><br><span>@@ -352,34 +352,36 @@</span><br><span>                            uint8_t chan2, const struct p1_rest_octets *p1ro)</span><br><span> {</span><br><span>       struct gsm48_paging1 *pt1 = (struct gsm48_paging1 *) out_buf;</span><br><span style="color: hsl(0, 100%, 40%);">-   struct bitvec bv;</span><br><span style="color: hsl(0, 100%, 40%);">-       unsigned int paging_len;</span><br><span style="color: hsl(120, 100%, 40%);">+      unsigned int ro_len;</span><br><span>         uint8_t *cur;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       memset(out_buf, 0, sizeof(*pt1));</span><br><span style="color: hsl(120, 100%, 40%);">+     *pt1 = (struct gsm48_paging1) {</span><br><span style="color: hsl(120, 100%, 40%);">+               .proto_discr = GSM48_PDISC_RR,</span><br><span style="color: hsl(120, 100%, 40%);">+                .msg_type = GSM48_MT_RR_PAG_REQ_1,</span><br><span style="color: hsl(120, 100%, 40%);">+            .pag_mode = GSM48_PM_NORMAL,</span><br><span style="color: hsl(120, 100%, 40%);">+          .cneed1 = chan1 & 3,</span><br><span style="color: hsl(120, 100%, 40%);">+              .cneed2 = chan2 & 3,</span><br><span style="color: hsl(120, 100%, 40%);">+      };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  pt1->proto_discr = GSM48_PDISC_RR;</span><br><span style="color: hsl(0, 100%, 40%);">-   pt1->msg_type = GSM48_MT_RR_PAG_REQ_1;</span><br><span style="color: hsl(0, 100%, 40%);">-       pt1->pag_mode = GSM48_PM_NORMAL;</span><br><span style="color: hsl(0, 100%, 40%);">-     pt1->cneed1 = chan1 & 3;</span><br><span style="color: hsl(0, 100%, 40%);">- pt1->cneed2 = chan2 & 3;</span><br><span>      cur = lv_put(pt1->data, identity1_lv[0], identity1_lv+1);</span><br><span>         if (identity2_lv)</span><br><span>            cur = tlv_put(cur, GSM48_IE_MOBILE_ID, identity2_lv[0], identity2_lv+1);</span><br><span> </span><br><span>         pt1->l2_plen = L2_PLEN(cur - out_buf);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   paging_len = cur - out_buf;</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Pad remaining octets with constant '2B'O */</span><br><span style="color: hsl(120, 100%, 40%);">+        ro_len = GSM_MACBLOCK_LEN - (cur - out_buf);</span><br><span style="color: hsl(120, 100%, 40%);">+  memset(cur, GSM_MACBLOCK_PADDING, ro_len);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  memset(&bv, 0, sizeof(bv));</span><br><span style="color: hsl(0, 100%, 40%);">- bv.data = cur;</span><br><span style="color: hsl(0, 100%, 40%);">-  bv.data_len = GSM_MACBLOCK_LEN - paging_len;</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Optional P1 Rest Octets */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (p1ro) {</span><br><span style="color: hsl(120, 100%, 40%);">+           struct bitvec bv = {</span><br><span style="color: hsl(120, 100%, 40%);">+                  .data_len = ro_len,</span><br><span style="color: hsl(120, 100%, 40%);">+                   .data = cur,</span><br><span style="color: hsl(120, 100%, 40%);">+          };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  if (p1ro)</span><br><span>            append_p1_rest_octets(&bv, p1ro);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   /* pad to the end of the MAC block */</span><br><span style="color: hsl(0, 100%, 40%);">-   bitvec_spare_padding(&bv, bv.data_len *8);</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span> </span><br><span>        return GSM_MACBLOCK_LEN;</span><br><span> }</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bts/+/22224">change 22224</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/+/22224"/><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: I90473356b396e5dd9326598aca025afacca4afc8 </div>
<div style="display:none"> Gerrit-Change-Number: 22224 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>