Commit c1d8e3fb authored by Horatiu Vultur's avatar Horatiu Vultur Committed by Jakub Kicinski
Browse files

net: microchip: vcap: Change how the rule id is generated



Currently whenever a new rule id is generated, it picks up the next
number bigger than previous id. So it would always be 1, 2, 3, etc.
When the rule with id 1 will be deleted and a new rule will be added,
it will have the id 4 and not id 1.
In theory this can be a problem if at some point a rule will be added
and removed ~0 times. Then no more rules can be added because there
are no more ids.

Change this such that when a new rule is added, search for an empty
rule id starting with value of 1 as value 0 is reserved.

Fixes: c9da1ac1 ("net: microchip: sparx5: Adding initial tc flower support for VCAP API")
Signed-off-by: default avatarHoratiu Vultur <horatiu.vultur@microchip.com>
Link: https://lore.kernel.org/r/20221128142959.8325-1-horatiu.vultur@microchip.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 450f0650
Loading
Loading
Loading
Loading
+1 −6
Original line number Diff line number Diff line
@@ -985,17 +985,12 @@ static u32 vcap_next_rule_addr(u32 addr, struct vcap_rule_internal *ri)
/* Assign a unique rule id and autogenerate one if id == 0 */
static u32 vcap_set_rule_id(struct vcap_rule_internal *ri)
{
	u32 next_id;

	if (ri->data.id != 0)
		return ri->data.id;

	next_id = ri->vctrl->rule_id + 1;

	for (next_id = ri->vctrl->rule_id + 1; next_id < ~0; ++next_id) {
	for (u32 next_id = 1; next_id < ~0; ++next_id) {
		if (!vcap_lookup_rule(ri->vctrl, next_id)) {
			ri->data.id = next_id;
			ri->vctrl->rule_id = next_id;
			break;
		}
	}
+0 −1
Original line number Diff line number Diff line
@@ -268,7 +268,6 @@ struct vcap_operations {

/* VCAP API Client control interface */
struct vcap_control {
	u32 rule_id; /* last used rule id (unique across VCAP instances) */
	struct vcap_operations *ops;  /* client supplied operations */
	const struct vcap_info *vcaps; /* client supplied vcap models */
	const struct vcap_statistics *stats; /* client supplied vcap stats */