The following commit has been merged in the batadv/net-next branch: commit 9aa2560d5cb456378a08dccf5ad2555499f1b02c Author: Remi Pommarel repk@triplefau.lt Date: Wed Nov 20 18:47:18 2024 +0100
batman-adv: Don't keep redundant TT change events
When adding a local TT twice within the same OGM interval (e.g. happens when flag get updated), the flags of the first TT change entry is updated with the second one and both change events is added to the change list. This leads to having the same ADD change entry twice. Similarly a DEL+DEL scenario is also creating twice the same event.
Deduplicate ADD+ADD or DEL+DEL scenarios to reduce the TT change events that need to be sent in both OGM and TT response.
Signed-off-by: Remi Pommarel repk@triplefau.lt Signed-off-by: Sven Eckelmann sven@narfation.org Signed-off-by: Simon Wunderlich sw@simonwunderlich.de
diff --git a/net/batman-adv/translation-table.c b/net/batman-adv/translation-table.c index aa5c44e114190..8533deb15ebd0 100644 --- a/net/batman-adv/translation-table.c +++ b/net/batman-adv/translation-table.c @@ -437,7 +437,7 @@ static void batadv_tt_local_event(struct batadv_priv *bat_priv,
del_op_requested = flags & BATADV_TT_CLIENT_DEL;
- /* check for ADD+DEL or DEL+ADD events */ + /* check for ADD+DEL, DEL+ADD, ADD+ADD or DEL+DEL events */ spin_lock_bh(&bat_priv->tt.changes_list_lock); list_for_each_entry_safe(entry, safe, &bat_priv->tt.changes_list, list) { @@ -457,17 +457,21 @@ static void batadv_tt_local_event(struct batadv_priv *bat_priv, if (del_op_requested && !del_op_entry) goto del;
- /* this is a second add in the same originator interval. It - * means that flags have been changed: update them! + /* this is a second add or del in the same originator interval. + * It could mean that flags have been changed (e.g. double + * add): update them */ - if (!del_op_requested && !del_op_entry) + if (del_op_requested == del_op_entry) { entry->change.flags = flags; + goto discard; + }
continue; del: list_del(&entry->list); kmem_cache_free(batadv_tt_change_cache, entry); bat_priv->tt.local_changes--; +discard: kmem_cache_free(batadv_tt_change_cache, tt_change_node); goto unlock; }