<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bts/+/22224">View Change</a></p><div style="white-space:pre-wrap">Approvals:
pespin: Looks good to me, but someone else must approve
laforge: Looks good to me, approved
Jenkins Builder: Verified
</div><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>It's generally better to avoid using bitvec_fill() when using memset()<br>is possible, because the former operates on bits rather than bytes.<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;"><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: 2 </div>
<div style="display:none"> Gerrit-Owner: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>