Skip to contentSkip to conversation

DPDK PIE computation is broken

DISCUSSION Stephen Hemminger 1 participant 1 message May 23, 2022

lore
Share & tools
lore
#0 lore raw

Was looking at where rte_rand() is currently used in DPDK. Found that rte_pie uses it (that is expected.
But it also using it wrong on a couple of levels.

First. Look at:

#define RTE_RAND_MAX ~0LLU /**< Max value of the random number */

_rte_pie_drop(const struct rte_pie_config *pie_cfg,
struct rte_pie *pie)

{
	uint64_t rand_value;
...
	rand_value = rte_rand()/RTE_RAND_MAX;

	if ((double)rand_value < pie->drop_prob) {
		pie->accu_prob = 0;
		return 1;
	}

	/* No drop */
	return 0;

Since rand_value is 64 bit unsigned value the division happens as unsigned Therefore for all values of rte_rand(). rand_value is going to be 0 Converting it to double just makes it zero in another form.

How was PIE tested? Why was this not seen.

Second, the obvious fix would be to make rand_value a double. But doing floating point divide in the packet path would be a major performance loss. Saw this earlier with the packet_sched code.