From: "Bruce Richardson" <bruce.richard...@intel.com> 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 at intel.com> --- lib/librte_distributor/rte_distributor.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) 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); -- 2.1.1