summaryrefslogtreecommitdiff
path: root/lib/librte_distributor
diff options
context:
space:
mode:
authorBruce Richardson <bruce.richardson@intel.com>2014-11-06 13:55:32 +0000
committerThomas Monjalon <thomas.monjalon@6wind.com>2014-11-07 15:04:59 +0100
commit98d5a1318a68147e15331cc4a342ce426df37b06 (patch)
treee342e32051dac51eced61a94ddb7c59de82d3e3b /lib/librte_distributor
parent1c1dc182da4fe345240f431f807b62ddb49ca08e (diff)
downloaddpdk-next-eventdev-98d5a1318a68147e15331cc4a342ce426df37b06.zip
dpdk-next-eventdev-98d5a1318a68147e15331cc4a342ce426df37b06.tar.gz
dpdk-next-eventdev-98d5a1318a68147e15331cc4a342ce426df37b06.tar.xz
distributor: add comments
Add in some additional comments around more complex areas of the code so as to make the code easier to read and understand. Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
Diffstat (limited to 'lib/librte_distributor')
-rw-r--r--lib/librte_distributor/rte_distributor.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/lib/librte_distributor/rte_distributor.c b/lib/librte_distributor/rte_distributor.c
index 585ff88..656ee5c 100644
--- a/lib/librte_distributor/rte_distributor.c
+++ b/lib/librte_distributor/rte_distributor.c
@@ -92,6 +92,7 @@ struct rte_distributor {
unsigned num_workers; /**< Number of workers polling */
uint32_t in_flight_tags[RTE_MAX_LCORE];
+ /**< Tracks the tag being processed per core, 0 == no pkt */
struct rte_distributor_backlog backlog[RTE_MAX_LCORE];
union rte_distributor_buffer bufs[RTE_MAX_LCORE];
@@ -282,10 +283,22 @@ rte_distributor_process(struct rte_distributor *d,
next_mb = mbufs[next_idx++];
next_value = (((int64_t)(uintptr_t)next_mb)
<< RTE_DISTRIB_FLAG_BITS);
+ /*
+ * Set the low bit on the tag, so we can guarantee that
+ * we never store a tag value of zero. That means we can
+ * use the zero-value to indicate that no packet is
+ * being processed by a worker.
+ */
new_tag = (next_mb->hash.rss | 1);
uint32_t match = 0;
unsigned i;
+ /*
+ * to scan for a match use "xor" and "not" to get a 0/1
+ * value, then use shifting to merge to single "match"
+ * variable, where a one-bit indicates a match for the
+ * worker given by the bit-position
+ */
for (i = 0; i < d->num_workers; i++)
match |= (!(d->in_flight_tags[i] ^ new_tag)
<< i);