* [PATCH v3 0/5] batman-adv: TT change events fixes and improvements
@ 2024-11-20 17:47 Remi Pommarel
2024-11-20 19:46 ` Sven Eckelmann
0 siblings, 1 reply; 14+ messages in thread
From: Remi Pommarel @ 2024-11-20 17:47 UTC (permalink / raw)
To: b.a.t.m.a.n
Cc: Marek Lindner, Simon Wunderlich, Antonio Quartulli,
Sven Eckelmann, Remi Pommarel
The first three patches are actual fixes.
The first two try to avoid sending uninitialized data that could be
interpreted as invalid TT change events in both TT change response and
OGM. Following invalid entries could be seen when that happen with
batctl o:
* 00:00:00:00:00:00 -1 [....] ( 0) 88:12:4e:ad:7e:ba (179) (0x45845380)
* 00:00:00:00:78:79 4092 [.W..] ( 0) 88:12:4e:ad:7e:3c (145) (0x8ebadb8b)
The third one fixes an issue that happened when a TT change event list
is too big for the MTU, the list was never actually sent nor free and
continued to grow indefinitely from this point. That also caused the
OGM TTVN to increase at each OGM interval without any changes being ever
visible to other nodes. This ever growing TT change event list could be
observed by looking at /sys/kernel/slab/batadv_tt_change_cache/objects
that sometimes showed unusal high value even after issuing a memcache
shrink.
The next two patches are more cleanup / potential slight improvements.
While patch 4 is mainly cosmetic (having negative tt.local_changes
values is not exactly an issue), patch 5 is here to keep the TT changes
list as short as possible (reducing network overhead).
V3:
- Fix commit message wording
- Update outdated comments
V2:
- This has been tested enough to not be in RFC state anymore
- Add one more uninitialize TT change fix for full table TT responses
Remi Pommarel (5):
batman-adv: Do not send uninitialized TT changes
batman-adv: Remove uninitialized data in full table TT response
batman-adv: Do not let TT changes list grows indefinitely
batman-adv: Remove atomic usage for tt.local_changes
batman-adv: Don't keep redundant TT change events
net/batman-adv/soft-interface.c | 2 +-
net/batman-adv/translation-table.c | 92 ++++++++++++++++++------------
net/batman-adv/types.h | 4 +-
3 files changed, 60 insertions(+), 38 deletions(-)
--
2.40.0
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v3 0/5] batman-adv: TT change events fixes and improvements
2024-11-20 17:47 [PATCH v3 0/5] batman-adv: TT change events fixes and improvements Remi Pommarel
@ 2024-11-20 19:46 ` Sven Eckelmann
2024-11-20 19:54 ` Remi Pommarel
0 siblings, 1 reply; 14+ messages in thread
From: Sven Eckelmann @ 2024-11-20 19:46 UTC (permalink / raw)
To: Antonio Quartulli
Cc: b.a.t.m.a.n, Remi Pommarel, Marek Lindner, Simon Wunderlich,
Remi Pommarel
[-- Attachment #1: Type: text/plain, Size: 424 bytes --]
On Wednesday, 20 November 2024 18:47:13 CET Remi Pommarel wrote:
> The first three patches are actual fixes.
[...]
>
> V3:
> - Fix commit message wording
> - Update outdated comments
Antonio, can you please review the patches? It is important that we get the
first three out early (to avoid merge conflicts when sending the second part).
So maybe you can have at least a look at the first three.
Kind regards,
Sven
[-- Attachment #2: This is a digitally signed message part. --]
[-- Type: application/pgp-signature, Size: 228 bytes --]
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v3 0/5] batman-adv: TT change events fixes and improvements
2024-11-20 19:46 ` Sven Eckelmann
@ 2024-11-20 19:54 ` Remi Pommarel
2024-11-20 20:29 ` Antonio Quartulli
2024-11-20 21:04 ` Sven Eckelmann
0 siblings, 2 replies; 14+ messages in thread
From: Remi Pommarel @ 2024-11-20 19:54 UTC (permalink / raw)
To: Sven Eckelmann
Cc: Antonio Quartulli, b.a.t.m.a.n, Marek Lindner, Simon Wunderlich
On Wed, Nov 20, 2024 at 08:46:12PM +0100, Sven Eckelmann wrote:
> On Wednesday, 20 November 2024 18:47:13 CET Remi Pommarel wrote:
> > The first three patches are actual fixes.
> [...]
> >
> > V3:
> > - Fix commit message wording
> > - Update outdated comments
>
> Antonio, can you please review the patches? It is important that we get the
> first three out early (to avoid merge conflicts when sending the second part).
> So maybe you can have at least a look at the first three.
If it is more convenient for you, I sure can split the serie in two ?
Also just saw that I forgot to remove the "a" from "a creating" in the
commit log, sorry about that. Do you need re-spin for that ?
Thanks,
--
Remi
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v3 0/5] batman-adv: TT change events fixes and improvements
2024-11-20 19:54 ` Remi Pommarel
@ 2024-11-20 20:29 ` Antonio Quartulli
2024-11-20 21:04 ` Sven Eckelmann
1 sibling, 0 replies; 14+ messages in thread
From: Antonio Quartulli @ 2024-11-20 20:29 UTC (permalink / raw)
To: Remi Pommarel, Sven Eckelmann
Cc: b.a.t.m.a.n, Marek Lindner, Simon Wunderlich
On 20/11/2024 20:54, Remi Pommarel wrote:
> On Wed, Nov 20, 2024 at 08:46:12PM +0100, Sven Eckelmann wrote:
>> On Wednesday, 20 November 2024 18:47:13 CET Remi Pommarel wrote:
>>> The first three patches are actual fixes.
>> [...]
>>>
>>> V3:
>>> - Fix commit message wording
>>> - Update outdated comments
>>
>> Antonio, can you please review the patches? It is important that we get the
>> first three out early (to avoid merge conflicts when sending the second part).
>> So maybe you can have at least a look at the first three.
>
> If it is more convenient for you, I sure can split the serie in two ?
No problem for me. I'll allocate some hours tomorrow morning.
Thanks for the ping, Sven.
Regards,
>
> Also just saw that I forgot to remove the "a" from "a creating" in the
> commit log, sorry about that. Do you need re-spin for that ?
>
> Thanks,
>
--
Antonio Quartulli
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v3 0/5] batman-adv: TT change events fixes and improvements
2024-11-20 19:54 ` Remi Pommarel
2024-11-20 20:29 ` Antonio Quartulli
@ 2024-11-20 21:04 ` Sven Eckelmann
1 sibling, 0 replies; 14+ messages in thread
From: Sven Eckelmann @ 2024-11-20 21:04 UTC (permalink / raw)
To: Remi Pommarel
Cc: Antonio Quartulli, b.a.t.m.a.n, Marek Lindner, Simon Wunderlich
[-- Attachment #1: Type: text/plain, Size: 283 bytes --]
On Wednesday, 20 November 2024 20:54:49 CET Remi Pommarel wrote:
> Also just saw that I forgot to remove the "a" from "a creating" in the
> commit log, sorry about that. Do you need re-spin for that ?
No, I will try to fix this directly when applying the patch.
Kind regards,
Sven
[-- Attachment #2: This is a digitally signed message part. --]
[-- Type: application/pgp-signature, Size: 228 bytes --]
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v3 0/5] batman-adv: TT change events fixes and improvements
@ 2024-11-22 15:52 Remi Pommarel
2024-11-22 15:52 ` [PATCH v4 1/5] batman-adv: Do not send uninitialized TT changes Remi Pommarel
` (4 more replies)
0 siblings, 5 replies; 14+ messages in thread
From: Remi Pommarel @ 2024-11-22 15:52 UTC (permalink / raw)
To: b.a.t.m.a.n
Cc: Marek Lindner, Simon Wunderlich, Antonio Quartulli,
Sven Eckelmann, Remi Pommarel
The first three patches are actual fixes.
The first two try to avoid sending uninitialized data that could be
interpreted as invalid TT change events in both TT change response and
OGM. Following invalid entries could be seen when that happen with
batctl o:
* 00:00:00:00:00:00 -1 [....] ( 0) 88:12:4e:ad:7e:ba (179) (0x45845380)
* 00:00:00:00:78:79 4092 [.W..] ( 0) 88:12:4e:ad:7e:3c (145) (0x8ebadb8b)
The third one fixes an issue that happened when a TT change event list
is too big for the MTU, the list was never actually sent nor free and
continued to grow indefinitely from this point. That also caused the
OGM TTVN to increase at each OGM interval without any changes being ever
visible to other nodes. This ever growing TT change event list could be
observed by looking at /sys/kernel/slab/batadv_tt_change_cache/objects
that sometimes showed unusal high value even after issuing a memcache
shrink.
The next two patches are more cleanup / potential slight improvements.
While patch 4 is mainly cosmetic (having negative tt.local_changes
values is not exactly an issue), patch 5 is here to keep the TT changes
list as short as possible (reducing network overhead).
V4:
- Reword comment on patch 4
- Fix flag assignment position is patch 4
- Fix store stearing with WRITE_ONCE
- Change tt.local_change < 1 to tt.local_change == 0 in patch 4
- Rework/simplify TT event deduplication logic
V3:
- Fix commit message wording
- Update outdated comments
V2:
- This has been tested enough to not be in RFC state anymore
- Add one more uninitialize TT change fix for full table TT responses
Remi Pommarel (5):
batman-adv: Do not send uninitialized TT changes
batman-adv: Remove uninitialized data in full table TT response
batman-adv: Do not let TT changes list grows indefinitely
batman-adv: Remove atomic usage for tt.local_changes
batman-adv: Don't keep redundant TT change events
net/batman-adv/soft-interface.c | 2 +-
net/batman-adv/translation-table.c | 123 ++++++++++++++++-------------
net/batman-adv/types.h | 4 +-
3 files changed, 72 insertions(+), 57 deletions(-)
--
2.40.0
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v4 1/5] batman-adv: Do not send uninitialized TT changes
2024-11-22 15:52 [PATCH v3 0/5] batman-adv: TT change events fixes and improvements Remi Pommarel
@ 2024-11-22 15:52 ` Remi Pommarel
2024-11-22 15:52 ` [PATCH v4 2/5] batman-adv: Remove uninitialized data in full table TT response Remi Pommarel
` (3 subsequent siblings)
4 siblings, 0 replies; 14+ messages in thread
From: Remi Pommarel @ 2024-11-22 15:52 UTC (permalink / raw)
To: b.a.t.m.a.n
Cc: Marek Lindner, Simon Wunderlich, Antonio Quartulli,
Sven Eckelmann, Remi Pommarel
The number of TT changes can be less than initially expected in
batadv_tt_tvlv_container_update() (changes can be removed by
batadv_tt_local_event() in ADD+DEL sequence between reading
tt_diff_entries_num and actually iterating the change list under lock).
Thus tt_diff_len could be bigger than the actual changes size that need
to be sent. Because batadv_send_my_tt_response sends the whole
packet, uninitialized data can be interpreted as TT changes on other
nodes leading to weird TT global entries on those nodes such as:
* 00:00:00:00:00:00 -1 [....] ( 0) 88:12:4e:ad:7e:ba (179) (0x45845380)
* 00:00:00:00:78:79 4092 [.W..] ( 0) 88:12:4e:ad:7e:3c (145) (0x8ebadb8b)
All of the above also applies to OGM tvlv container buffer's tvlv_len.
Remove the extra allocated space to avoid sending uninitialized TT
changes in batadv_send_my_tt_response() and batadv_v_ogm_send_softif().
Fixes: e1bf0c14096f ("batman-adv: tvlv - convert tt data sent within OGMs")
Signed-off-by: Remi Pommarel <repk@triplefau.lt>
---
net/batman-adv/translation-table.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/net/batman-adv/translation-table.c b/net/batman-adv/translation-table.c
index 2243cec18ecc..f0590f9bc2b1 100644
--- a/net/batman-adv/translation-table.c
+++ b/net/batman-adv/translation-table.c
@@ -990,6 +990,7 @@ static void batadv_tt_tvlv_container_update(struct batadv_priv *bat_priv)
int tt_diff_len, tt_change_len = 0;
int tt_diff_entries_num = 0;
int tt_diff_entries_count = 0;
+ size_t tt_extra_len = 0;
u16 tvlv_len;
tt_diff_entries_num = atomic_read(&bat_priv->tt.local_changes);
@@ -1027,6 +1028,9 @@ static void batadv_tt_tvlv_container_update(struct batadv_priv *bat_priv)
}
spin_unlock_bh(&bat_priv->tt.changes_list_lock);
+ tt_extra_len = batadv_tt_len(tt_diff_entries_num -
+ tt_diff_entries_count);
+
/* Keep the buffer for possible tt_request */
spin_lock_bh(&bat_priv->tt.last_changeset_lock);
kfree(bat_priv->tt.last_changeset);
@@ -1035,6 +1039,7 @@ static void batadv_tt_tvlv_container_update(struct batadv_priv *bat_priv)
tt_change_len = batadv_tt_len(tt_diff_entries_count);
/* check whether this new OGM has no changes due to size problems */
if (tt_diff_entries_count > 0) {
+ tt_diff_len -= tt_extra_len;
/* if kmalloc() fails we will reply with the full table
* instead of providing the diff
*/
@@ -1047,6 +1052,8 @@ static void batadv_tt_tvlv_container_update(struct batadv_priv *bat_priv)
}
spin_unlock_bh(&bat_priv->tt.last_changeset_lock);
+ /* Remove extra packet space for OGM */
+ tvlv_len -= tt_extra_len;
container_register:
batadv_tvlv_container_register(bat_priv, BATADV_TVLV_TT, 1, tt_data,
tvlv_len);
--
2.40.0
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH v4 2/5] batman-adv: Remove uninitialized data in full table TT response
2024-11-22 15:52 [PATCH v3 0/5] batman-adv: TT change events fixes and improvements Remi Pommarel
2024-11-22 15:52 ` [PATCH v4 1/5] batman-adv: Do not send uninitialized TT changes Remi Pommarel
@ 2024-11-22 15:52 ` Remi Pommarel
2024-11-22 15:52 ` [PATCH v4 3/5] batman-adv: Do not let TT changes list grows indefinitely Remi Pommarel
` (2 subsequent siblings)
4 siblings, 0 replies; 14+ messages in thread
From: Remi Pommarel @ 2024-11-22 15:52 UTC (permalink / raw)
To: b.a.t.m.a.n
Cc: Marek Lindner, Simon Wunderlich, Antonio Quartulli,
Sven Eckelmann, Remi Pommarel
The number of entries filled by batadv_tt_tvlv_generate() can be less
than initially expected in batadv_tt_prepare_tvlv_{global,local}_data()
(changes can be removed by batadv_tt_local_event() in ADD+DEL sequence
in the meantime as the lock held during the whole tvlv global/local data
generation).
Thus tvlv_len could be bigger than the actual TT entry size that need
to be sent so full table TT_RESPONSE could hold invalid TT entries such
as below.
* 00:00:00:00:00:00 -1 [....] ( 0) 88:12:4e:ad:7e:ba (179) (0x45845380)
* 00:00:00:00:78:79 4092 [.W..] ( 0) 88:12:4e:ad:7e:3c (145) (0x8ebadb8b)
Remove the extra allocated space to avoid sending uninitialized entries
for full table TT_RESPONSE in both batadv_send_other_tt_response() and
batadv_send_my_tt_response().
Fixes: 7ea7b4a14275 ("batman-adv: make the TT CRC logic VLAN specific")
Signed-off-by: Remi Pommarel <repk@triplefau.lt>
---
net/batman-adv/translation-table.c | 37 ++++++++++++++++++------------
1 file changed, 22 insertions(+), 15 deletions(-)
diff --git a/net/batman-adv/translation-table.c b/net/batman-adv/translation-table.c
index f0590f9bc2b1..bbab7491c83f 100644
--- a/net/batman-adv/translation-table.c
+++ b/net/batman-adv/translation-table.c
@@ -2754,14 +2754,16 @@ static bool batadv_tt_global_valid(const void *entry_ptr,
*
* Fills the tvlv buff with the tt entries from the specified hash. If valid_cb
* is not provided then this becomes a no-op.
+ *
+ * Return: Remaining unused length in tvlv_buff.
*/
-static void batadv_tt_tvlv_generate(struct batadv_priv *bat_priv,
- struct batadv_hashtable *hash,
- void *tvlv_buff, u16 tt_len,
- bool (*valid_cb)(const void *,
- const void *,
- u8 *flags),
- void *cb_data)
+static u16 batadv_tt_tvlv_generate(struct batadv_priv *bat_priv,
+ struct batadv_hashtable *hash,
+ void *tvlv_buff, u16 tt_len,
+ bool (*valid_cb)(const void *,
+ const void *,
+ u8 *flags),
+ void *cb_data)
{
struct batadv_tt_common_entry *tt_common_entry;
struct batadv_tvlv_tt_change *tt_change;
@@ -2775,7 +2777,7 @@ static void batadv_tt_tvlv_generate(struct batadv_priv *bat_priv,
tt_change = tvlv_buff;
if (!valid_cb)
- return;
+ return tt_len;
rcu_read_lock();
for (i = 0; i < hash->size; i++) {
@@ -2801,6 +2803,8 @@ static void batadv_tt_tvlv_generate(struct batadv_priv *bat_priv,
}
}
rcu_read_unlock();
+
+ return batadv_tt_len(tt_tot - tt_num_entries);
}
/**
@@ -3076,10 +3080,11 @@ static bool batadv_send_other_tt_response(struct batadv_priv *bat_priv,
goto out;
/* fill the rest of the tvlv with the real TT entries */
- batadv_tt_tvlv_generate(bat_priv, bat_priv->tt.global_hash,
- tt_change, tt_len,
- batadv_tt_global_valid,
- req_dst_orig_node);
+ tvlv_len -= batadv_tt_tvlv_generate(bat_priv,
+ bat_priv->tt.global_hash,
+ tt_change, tt_len,
+ batadv_tt_global_valid,
+ req_dst_orig_node);
}
/* Don't send the response, if larger than fragmented packet. */
@@ -3203,9 +3208,11 @@ static bool batadv_send_my_tt_response(struct batadv_priv *bat_priv,
goto out;
/* fill the rest of the tvlv with the real TT entries */
- batadv_tt_tvlv_generate(bat_priv, bat_priv->tt.local_hash,
- tt_change, tt_len,
- batadv_tt_local_valid, NULL);
+ tvlv_len -= batadv_tt_tvlv_generate(bat_priv,
+ bat_priv->tt.local_hash,
+ tt_change, tt_len,
+ batadv_tt_local_valid,
+ NULL);
}
tvlv_tt_data->flags = BATADV_TT_RESPONSE;
--
2.40.0
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH v4 3/5] batman-adv: Do not let TT changes list grows indefinitely
2024-11-22 15:52 [PATCH v3 0/5] batman-adv: TT change events fixes and improvements Remi Pommarel
2024-11-22 15:52 ` [PATCH v4 1/5] batman-adv: Do not send uninitialized TT changes Remi Pommarel
2024-11-22 15:52 ` [PATCH v4 2/5] batman-adv: Remove uninitialized data in full table TT response Remi Pommarel
@ 2024-11-22 15:52 ` Remi Pommarel
2024-11-22 15:57 ` Antonio Quartulli
2024-11-22 15:52 ` [PATCH v4 4/5] batman-adv: Remove atomic usage for tt.local_changes Remi Pommarel
2024-11-22 15:52 ` [PATCH v4 5/5] batman-adv: Don't keep redundant TT change events Remi Pommarel
4 siblings, 1 reply; 14+ messages in thread
From: Remi Pommarel @ 2024-11-22 15:52 UTC (permalink / raw)
To: b.a.t.m.a.n
Cc: Marek Lindner, Simon Wunderlich, Antonio Quartulli,
Sven Eckelmann, Remi Pommarel
When TT changes list is too big to fit in packet due to MTU size, an
empty OGM is sent expected other node to send TT request to get the
changes. The issue is that tt.last_changeset was not built thus the
originator was responding with previous changes to those TT requests
(see batadv_send_my_tt_response). Also the changes list was never
cleaned up effectively never ending growing from this point onwards,
repeatedly sending the same TT response changes over and over, and
creating a new empty OGM every OGM interval expecting for the local
changes to be purged.
When there is more TT changes that can fit in packet, drop all changes,
send empty OGM and wait for TT request so we can respond with a full
table instead.
Fixes: e1bf0c14096f ("batman-adv: tvlv - convert tt data sent within OGMs")
Signed-off-by: Remi Pommarel <repk@triplefau.lt>
---
net/batman-adv/translation-table.c | 14 +++++++++++---
1 file changed, 11 insertions(+), 3 deletions(-)
diff --git a/net/batman-adv/translation-table.c b/net/batman-adv/translation-table.c
index bbab7491c83f..53dea8ae96e4 100644
--- a/net/batman-adv/translation-table.c
+++ b/net/batman-adv/translation-table.c
@@ -990,6 +990,7 @@ static void batadv_tt_tvlv_container_update(struct batadv_priv *bat_priv)
int tt_diff_len, tt_change_len = 0;
int tt_diff_entries_num = 0;
int tt_diff_entries_count = 0;
+ bool drop_changes = false;
size_t tt_extra_len = 0;
u16 tvlv_len;
@@ -997,10 +998,17 @@ static void batadv_tt_tvlv_container_update(struct batadv_priv *bat_priv)
tt_diff_len = batadv_tt_len(tt_diff_entries_num);
/* if we have too many changes for one packet don't send any
- * and wait for the tt table request which will be fragmented
+ * and wait for the tt table request so we can reply with the full
+ * (fragmented) table.
+ *
+ * The local change history should still be cleaned up so the next
+ * TT round can start again with a clean state.
*/
- if (tt_diff_len > bat_priv->soft_iface->mtu)
+ if (tt_diff_len > bat_priv->soft_iface->mtu) {
tt_diff_len = 0;
+ tt_diff_entries_num = 0;
+ drop_changes = true;
+ }
tvlv_len = batadv_tt_prepare_tvlv_local_data(bat_priv, &tt_data,
&tt_change, &tt_diff_len);
@@ -1009,7 +1017,7 @@ static void batadv_tt_tvlv_container_update(struct batadv_priv *bat_priv)
tt_data->flags = BATADV_TT_OGM_DIFF;
- if (tt_diff_len == 0)
+ if (!drop_changes && tt_diff_len == 0)
goto container_register;
spin_lock_bh(&bat_priv->tt.changes_list_lock);
--
2.40.0
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH v4 4/5] batman-adv: Remove atomic usage for tt.local_changes
2024-11-22 15:52 [PATCH v3 0/5] batman-adv: TT change events fixes and improvements Remi Pommarel
` (2 preceding siblings ...)
2024-11-22 15:52 ` [PATCH v4 3/5] batman-adv: Do not let TT changes list grows indefinitely Remi Pommarel
@ 2024-11-22 15:52 ` Remi Pommarel
2024-11-22 15:52 ` [PATCH v4 5/5] batman-adv: Don't keep redundant TT change events Remi Pommarel
4 siblings, 0 replies; 14+ messages in thread
From: Remi Pommarel @ 2024-11-22 15:52 UTC (permalink / raw)
To: b.a.t.m.a.n
Cc: Marek Lindner, Simon Wunderlich, Antonio Quartulli,
Sven Eckelmann, Remi Pommarel
The tt.local_changes atomic is either written with tt.changes_list_lock
or close to it (see batadv_tt_local_event()). Thus the performance gain
using an atomic was limited (or because of atomic_read() impact even
negative). Using atomic also comes with the need to be wary of potential
negative tt.local_changes value.
Simplify the tt.local_changes usage by removing the atomic property and
modifying it only with tt.changes_list_lock held.
Signed-off-by: Remi Pommarel <repk@triplefau.lt>
---
net/batman-adv/soft-interface.c | 2 +-
net/batman-adv/translation-table.c | 24 +++++++++++-------------
net/batman-adv/types.h | 4 ++--
3 files changed, 14 insertions(+), 16 deletions(-)
diff --git a/net/batman-adv/soft-interface.c b/net/batman-adv/soft-interface.c
index 2758aba47a2f..5666c268cead 100644
--- a/net/batman-adv/soft-interface.c
+++ b/net/batman-adv/soft-interface.c
@@ -783,13 +783,13 @@ static int batadv_softif_init_late(struct net_device *dev)
atomic_set(&bat_priv->mesh_state, BATADV_MESH_INACTIVE);
atomic_set(&bat_priv->bcast_seqno, 1);
atomic_set(&bat_priv->tt.vn, 0);
- atomic_set(&bat_priv->tt.local_changes, 0);
atomic_set(&bat_priv->tt.ogm_append_cnt, 0);
#ifdef CONFIG_BATMAN_ADV_BLA
atomic_set(&bat_priv->bla.num_requests, 0);
#endif
atomic_set(&bat_priv->tp_num, 0);
+ WRITE_ONCE(bat_priv->tt.local_changes, 0);
bat_priv->tt.last_changeset = NULL;
bat_priv->tt.last_changeset_len = 0;
bat_priv->isolation_mark = 0;
diff --git a/net/batman-adv/translation-table.c b/net/batman-adv/translation-table.c
index 53dea8ae96e4..f7e894811e7f 100644
--- a/net/batman-adv/translation-table.c
+++ b/net/batman-adv/translation-table.c
@@ -463,8 +463,8 @@ static void batadv_tt_local_event(struct batadv_priv *bat_priv,
struct batadv_tt_change_node *tt_change_node, *entry, *safe;
struct batadv_tt_common_entry *common = &tt_local_entry->common;
u8 flags = common->flags | event_flags;
- bool event_removed = false;
bool del_op_requested, del_op_entry;
+ size_t changes;
tt_change_node = kmem_cache_alloc(batadv_tt_change_cache, GFP_ATOMIC);
if (!tt_change_node)
@@ -480,6 +480,7 @@ static void batadv_tt_local_event(struct batadv_priv *bat_priv,
/* check for ADD+DEL or DEL+ADD events */
spin_lock_bh(&bat_priv->tt.changes_list_lock);
+ changes = READ_ONCE(bat_priv->tt.local_changes);
list_for_each_entry_safe(entry, safe, &bat_priv->tt.changes_list,
list) {
if (!batadv_compare_eth(entry->change.addr, common->addr))
@@ -508,21 +509,18 @@ static void batadv_tt_local_event(struct batadv_priv *bat_priv,
del:
list_del(&entry->list);
kmem_cache_free(batadv_tt_change_cache, entry);
+ changes--;
kmem_cache_free(batadv_tt_change_cache, tt_change_node);
- event_removed = true;
- goto unlock;
+ goto update_changes;
}
/* track the change in the OGMinterval list */
list_add_tail(&tt_change_node->list, &bat_priv->tt.changes_list);
+ changes++;
-unlock:
+update_changes:
+ WRITE_ONCE(bat_priv->tt.local_changes, changes);
spin_unlock_bh(&bat_priv->tt.changes_list_lock);
-
- if (event_removed)
- atomic_dec(&bat_priv->tt.local_changes);
- else
- atomic_inc(&bat_priv->tt.local_changes);
}
/**
@@ -994,7 +992,7 @@ static void batadv_tt_tvlv_container_update(struct batadv_priv *bat_priv)
size_t tt_extra_len = 0;
u16 tvlv_len;
- tt_diff_entries_num = atomic_read(&bat_priv->tt.local_changes);
+ tt_diff_entries_num = READ_ONCE(bat_priv->tt.local_changes);
tt_diff_len = batadv_tt_len(tt_diff_entries_num);
/* if we have too many changes for one packet don't send any
@@ -1021,7 +1019,7 @@ static void batadv_tt_tvlv_container_update(struct batadv_priv *bat_priv)
goto container_register;
spin_lock_bh(&bat_priv->tt.changes_list_lock);
- atomic_set(&bat_priv->tt.local_changes, 0);
+ WRITE_ONCE(bat_priv->tt.local_changes, 0);
list_for_each_entry_safe(entry, safe, &bat_priv->tt.changes_list,
list) {
@@ -1437,7 +1435,7 @@ static void batadv_tt_changes_list_free(struct batadv_priv *bat_priv)
kmem_cache_free(batadv_tt_change_cache, entry);
}
- atomic_set(&bat_priv->tt.local_changes, 0);
+ WRITE_ONCE(bat_priv->tt.local_changes, 0);
spin_unlock_bh(&bat_priv->tt.changes_list_lock);
}
@@ -3707,7 +3705,7 @@ static void batadv_tt_local_commit_changes_nolock(struct batadv_priv *bat_priv)
{
lockdep_assert_held(&bat_priv->tt.commit_lock);
- if (atomic_read(&bat_priv->tt.local_changes) < 1) {
+ if (READ_ONCE(bat_priv->tt.local_changes) == 0) {
if (!batadv_atomic_dec_not_zero(&bat_priv->tt.ogm_append_cnt))
batadv_tt_tvlv_container_update(bat_priv);
return;
diff --git a/net/batman-adv/types.h b/net/batman-adv/types.h
index 04f6398b3a40..f491bff8c51b 100644
--- a/net/batman-adv/types.h
+++ b/net/batman-adv/types.h
@@ -1022,7 +1022,7 @@ struct batadv_priv_tt {
atomic_t ogm_append_cnt;
/** @local_changes: changes registered in an originator interval */
- atomic_t local_changes;
+ size_t local_changes;
/**
* @changes_list: tracks tt local changes within an originator interval
@@ -1044,7 +1044,7 @@ struct batadv_priv_tt {
*/
struct list_head roam_list;
- /** @changes_list_lock: lock protecting changes_list */
+ /** @changes_list_lock: lock protecting changes_list & local_changes */
spinlock_t changes_list_lock;
/** @req_list_lock: lock protecting req_list */
--
2.40.0
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH v4 5/5] batman-adv: Don't keep redundant TT change events
2024-11-22 15:52 [PATCH v3 0/5] batman-adv: TT change events fixes and improvements Remi Pommarel
` (3 preceding siblings ...)
2024-11-22 15:52 ` [PATCH v4 4/5] batman-adv: Remove atomic usage for tt.local_changes Remi Pommarel
@ 2024-11-22 15:52 ` Remi Pommarel
2024-11-24 10:00 ` Sven Eckelmann
4 siblings, 1 reply; 14+ messages in thread
From: Remi Pommarel @ 2024-11-22 15:52 UTC (permalink / raw)
To: b.a.t.m.a.n
Cc: Marek Lindner, Simon Wunderlich, Antonio Quartulli,
Sven Eckelmann, Remi Pommarel
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.
Co-developped-by: Sven Eckelmann <sven@narfation.org>
Signed-off-by: Remi Pommarel <repk@triplefau.lt>
---
net/batman-adv/translation-table.c | 43 +++++++++++++-----------------
1 file changed, 19 insertions(+), 24 deletions(-)
diff --git a/net/batman-adv/translation-table.c b/net/batman-adv/translation-table.c
index f7e894811e7f..b22a9d2aa5b2 100644
--- a/net/batman-adv/translation-table.c
+++ b/net/batman-adv/translation-table.c
@@ -478,7 +478,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);
changes = READ_ONCE(bat_priv->tt.local_changes);
list_for_each_entry_safe(entry, safe, &bat_priv->tt.changes_list,
@@ -486,30 +486,25 @@ static void batadv_tt_local_event(struct batadv_priv *bat_priv,
if (!batadv_compare_eth(entry->change.addr, common->addr))
continue;
- /* DEL+ADD in the same orig interval have no effect and can be
- * removed to avoid silly behaviour on the receiver side. The
- * other way around (ADD+DEL) can happen in case of roaming of
- * a client still in the NEW state. Roaming of NEW clients is
- * now possible due to automatically recognition of "temporary"
- * clients
- */
- del_op_entry = entry->change.flags & BATADV_TT_CLIENT_DEL;
- if (!del_op_requested && del_op_entry)
- goto del;
- 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!
- */
- if (!del_op_requested && !del_op_entry)
- entry->change.flags = flags;
+ if (del_op_requested != del_op_entry) {
+ /* DEL+ADD in the same orig interval have no effect and
+ * can be removed to avoid silly behaviour on the
+ * receiver side. The other way around (ADD+DEL) can
+ * happen in case of roaming of a client still in the
+ * NEW state. Roaming of NEW clients is now possible due
+ * to automatically recognition of "temporary" clients
+ */
+ list_del(&entry->list);
+ kmem_cache_free(batadv_tt_change_cache, entry);
+ changes--;
+ } else {
+ /* 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
+ */
+ entry->change.flags = flags;
+ }
- continue;
-del:
- list_del(&entry->list);
- kmem_cache_free(batadv_tt_change_cache, entry);
- changes--;
kmem_cache_free(batadv_tt_change_cache, tt_change_node);
goto update_changes;
}
--
2.40.0
^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [PATCH v4 3/5] batman-adv: Do not let TT changes list grows indefinitely
2024-11-22 15:52 ` [PATCH v4 3/5] batman-adv: Do not let TT changes list grows indefinitely Remi Pommarel
@ 2024-11-22 15:57 ` Antonio Quartulli
0 siblings, 0 replies; 14+ messages in thread
From: Antonio Quartulli @ 2024-11-22 15:57 UTC (permalink / raw)
To: Remi Pommarel, b.a.t.m.a.n
Cc: Marek Lindner, Simon Wunderlich, Sven Eckelmann
On 22/11/2024 16:52, Remi Pommarel wrote:
> When TT changes list is too big to fit in packet due to MTU size, an
> empty OGM is sent expected other node to send TT request to get the
> changes. The issue is that tt.last_changeset was not built thus the
> originator was responding with previous changes to those TT requests
> (see batadv_send_my_tt_response). Also the changes list was never
> cleaned up effectively never ending growing from this point onwards,
> repeatedly sending the same TT response changes over and over, and
> creating a new empty OGM every OGM interval expecting for the local
> changes to be purged.
>
> When there is more TT changes that can fit in packet, drop all changes,
> send empty OGM and wait for TT request so we can respond with a full
> table instead.
>
> Fixes: e1bf0c14096f ("batman-adv: tvlv - convert tt data sent within OGMs")
> Signed-off-by: Remi Pommarel <repk@triplefau.lt>
Acked-by: Antonio Quartulli <Antonio@mandelbit.com>
--
Antonio Quartulli
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v4 5/5] batman-adv: Don't keep redundant TT change events
2024-11-22 15:52 ` [PATCH v4 5/5] batman-adv: Don't keep redundant TT change events Remi Pommarel
@ 2024-11-24 10:00 ` Sven Eckelmann
2024-11-25 9:42 ` Remi Pommarel
0 siblings, 1 reply; 14+ messages in thread
From: Sven Eckelmann @ 2024-11-24 10:00 UTC (permalink / raw)
To: b.a.t.m.a.n, Remi Pommarel
Cc: Marek Lindner, Simon Wunderlich, Antonio Quartulli, Remi Pommarel
On Friday, 22 November 2024 16:52:52 CET Remi Pommarel wrote:
> - del_op_entry = entry->change.flags & BATADV_TT_CLIENT_DEL;
>
This line must not be dropped. Just checked my PoC change and it seems like I
already dropped it. I thought I've spotted and fixed this before. But most
likely, I've just changed it in the editor and then forgot to copy it back to
the mail client.
It is also called "Co-Developed-by: " and needs a SoB directly after that
(which I didn't give at that specific point - but now did in batadv/net-next).
I have now changed this directly the batadv/net-next branch. But in case there
needs to be a v6, please also change this locally on your end.
We will still wait for Antonio before I consider it really as accepted (and
then try to send it to the netdev maintainers).
Kind regards,
Sven
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v4 5/5] batman-adv: Don't keep redundant TT change events
2024-11-24 10:00 ` Sven Eckelmann
@ 2024-11-25 9:42 ` Remi Pommarel
0 siblings, 0 replies; 14+ messages in thread
From: Remi Pommarel @ 2024-11-25 9:42 UTC (permalink / raw)
To: Sven Eckelmann
Cc: b.a.t.m.a.n, Marek Lindner, Simon Wunderlich, Antonio Quartulli
On Sun, Nov 24, 2024 at 11:00:40AM +0100, Sven Eckelmann wrote:
> On Friday, 22 November 2024 16:52:52 CET Remi Pommarel wrote:
> > - del_op_entry = entry->change.flags & BATADV_TT_CLIENT_DEL;
> >
>
> This line must not be dropped. Just checked my PoC change and it seems like I
> already dropped it. I thought I've spotted and fixed this before. But most
> likely, I've just changed it in the editor and then forgot to copy it back to
> the mail client.
Outch, sorry for not having noticed that. I am a bit surprised that gcc
does not complain.
>
> It is also called "Co-Developed-by: " and needs a SoB directly after that
> (which I didn't give at that specific point - but now did in batadv/net-next).
Actually according to checkpatch the preferred tag seems to be
"Co-developed-by", which was still not what I used. Also I have mixed
feeling about this tag, I have been asked before to add the
Co-developped-by tag but I don't really feel confortable giving
Signed-off-by in other people name....
Don't know if you noticed, but I also messed up indentation at line
505, my bad.
>
> I have now changed this directly the batadv/net-next branch. But in case there
> needs to be a v6, please also change this locally on your end.
>
> We will still wait for Antonio before I consider it really as accepted (and
> then try to send it to the netdev maintainers).
Thanks.
Regards,
--
Remi
^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2024-11-25 9:44 UTC | newest]
Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-11-22 15:52 [PATCH v3 0/5] batman-adv: TT change events fixes and improvements Remi Pommarel
2024-11-22 15:52 ` [PATCH v4 1/5] batman-adv: Do not send uninitialized TT changes Remi Pommarel
2024-11-22 15:52 ` [PATCH v4 2/5] batman-adv: Remove uninitialized data in full table TT response Remi Pommarel
2024-11-22 15:52 ` [PATCH v4 3/5] batman-adv: Do not let TT changes list grows indefinitely Remi Pommarel
2024-11-22 15:57 ` Antonio Quartulli
2024-11-22 15:52 ` [PATCH v4 4/5] batman-adv: Remove atomic usage for tt.local_changes Remi Pommarel
2024-11-22 15:52 ` [PATCH v4 5/5] batman-adv: Don't keep redundant TT change events Remi Pommarel
2024-11-24 10:00 ` Sven Eckelmann
2024-11-25 9:42 ` Remi Pommarel
-- strict thread matches above, loose matches on Subject: below --
2024-11-20 17:47 [PATCH v3 0/5] batman-adv: TT change events fixes and improvements Remi Pommarel
2024-11-20 19:46 ` Sven Eckelmann
2024-11-20 19:54 ` Remi Pommarel
2024-11-20 20:29 ` Antonio Quartulli
2024-11-20 21:04 ` Sven Eckelmann
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).