<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css" style="display:none;"> P {margin-top:0;margin-bottom:0;} </style>
</head>
<body dir="ltr">
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);" class="elementToProof ContentPasted0">
Hi Team,</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);" class="elementToProof ContentPasted0">
<br>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);" class="elementToProof ContentPasted0">
We are trying to compile and run dpdk 20.11 pipeline using clang (LLVM 5.0) compiler. We are able to compile and run the pipeline. However, we observed a lot of pkts not executing the acl lookup properly. While debugging, we found that a lot of pkts were missed
 in packets out mask. This aspect was checked with the rte_table_acl_lookup function in lib/librte_table/rte_table_acl.c file.
<div><br class="ContentPasted0">
</div>
<div class="ContentPasted0">Here is the function:</div>
<div><br class="ContentPasted0">
</div>
<div class="ContentPasted0">static int</div>
<div class="ContentPasted0">rte_table_acl_lookup(</div>
<div class="ContentPasted0">    void *table,</div>
<div class="ContentPasted0">    struct rte_mbuf **pkts,</div>
<div class="ContentPasted0">    uint64_t pkts_mask,</div>
<div class="ContentPasted0">    uint64_t *lookup_hit_mask,</div>
<div class="ContentPasted0">    void **entries)</div>
<div class="ContentPasted0">{</div>
<div class="ContentPasted0">    struct rte_table_acl *acl = (struct rte_table_acl *) table;</div>
<div class="ContentPasted0">    const uint8_t *pkts_data[RTE_PORT_IN_BURST_SIZE_MAX];</div>
<div class="ContentPasted0">    uint32_t results[RTE_PORT_IN_BURST_SIZE_MAX];</div>
<div class="ContentPasted0">    uint64_t pkts_out_mask;</div>
<div class="ContentPasted0">    uint32_t n_pkts, i, j;</div>
<div><br class="ContentPasted0">
</div>
<div class="ContentPasted0">     __rte_unused uint32_t n_pkts_in = __builtin_popcountll(pkts_mask);</div>
<div class="ContentPasted0">    RTE_TABLE_ACL_STATS_PKTS_IN_ADD(acl, n_pkts_in);</div>
<div><br class="ContentPasted0">
</div>
<div class="ContentPasted0">     /* Input conversion */</div>
<div class="ContentPasted0">    for (i = 0, j = 0; i < (uint32_t)(RTE_PORT_IN_BURST_SIZE_MAX -</div>
<div class="ContentPasted0">        __builtin_clzll(pkts_mask)); i++) {</div>
<div class="ContentPasted0">        uint64_t pkt_mask = 1LLU << i;</div>
<div><br class="ContentPasted0">
</div>
<div class="ContentPasted0">         if (pkt_mask & pkts_mask) {</div>
<div class="ContentPasted0">            pkts_data[j] = rte_pktmbuf_mtod(pkts[i], uint8_t *);</div>
<div class="ContentPasted0">            j++;</div>
<div class="ContentPasted0">        }</div>
<div class="ContentPasted0">    }</div>
<div class="ContentPasted0">    n_pkts = j;</div>
<div><br class="ContentPasted0">
</div>
<div class="ContentPasted0"> </div>
<div class="ContentPasted0">    /* Low-level ACL table lookup */</div>
<div class="ContentPasted0">    if (acl->ctx != NULL)</div>
<div class="ContentPasted0">        rte_acl_classify(acl->ctx, pkts_data, results, n_pkts, 1);</div>
<div class="ContentPasted0">    else</div>
<div class="ContentPasted0">        n_pkts = 0;</div>
<div><br class="ContentPasted0">
</div>
<div class="ContentPasted0"> </div>
<div class="ContentPasted0">    /* Output conversion */</div>
<div class="ContentPasted0">    pkts_out_mask = 0;</div>
<div class="ContentPasted0">    for (i = 0; i < n_pkts; i++) {</div>
<div class="ContentPasted0">        uint32_t action_table_pos = results[i];</div>
<div class="ContentPasted0">        uint32_t pkt_pos = __builtin_ctzll(pkts_mask);</div>
<div class="ContentPasted0">        uint64_t pkt_mask = 1LLU << pkt_pos;</div>
<div><br class="ContentPasted0">
</div>
<div class="ContentPasted0">         pkts_mask &= ~pkt_mask;</div>
<div><br class="ContentPasted0">
</div>
<div class="ContentPasted0">         if (action_table_pos != 0) {</div>
<div class="ContentPasted0">            pkts_out_mask |= pkt_mask;</div>
<div class="ContentPasted0">            entries[pkt_pos] = (void *)</div>
<div class="ContentPasted0">&acl->memory[action_table_pos *</div>
<div class="ContentPasted0">                acl->entry_size];</div>
<div class="ContentPasted0">            rte_prefetch0(entries[pkt_pos]);</div>
<div class="ContentPasted0">        }</div>
<div class="ContentPasted0">    }</div>
<div><br class="ContentPasted0">
</div>
<div class="ContentPasted0">     *lookup_hit_mask = pkts_out_mask;</div>
<div class="ContentPasted0">    RTE_TABLE_ACL_STATS_PKTS_LOOKUP_MISS(acl, n_pkts_in - __builtin_popcountll(pkts_out_mask));</div>
<div><br class="ContentPasted0">
</div>
<div class="ContentPasted0">     return 0;</div>
<div class="ContentPasted0">}</div>
<div><br class="ContentPasted0">
</div>
Can you provide some suggestions to avoid this issue and enable acl to run without functionality loss?<br>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);" class="elementToProof ContentPasted0">
<br>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);" class="elementToProof ContentPasted0">
Thanks and regards,</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);" class="elementToProof ContentPasted0">
<br>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);" class="elementToProof ContentPasted0">
R. Sundararaman</div>
</body>
</html>