From 98d5a1318a68147e15331cc4a342ce426df37b06 Mon Sep 17 00:00:00 2001 From: Bruce Richardson Date: Thu, 6 Nov 2014 13:55:32 +0000 Subject: [PATCH 1/1] 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 --- 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 585ff88ae8..656ee5c5fd 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.20.1