On Sat, Jan 06, 2024 at 04:59:53PM +0100, Stefano Brivio wrote: > On Thu, 21 Dec 2023 17:53:22 +1100 > David Gibson wrote: > > > Currently we use icmp_act[] to scan for ICMP ids which might have an open > > socket which could time out. However icmp_act[] contains no information > > that's not already in icmp_id_map[] - it's just an "index" which allows > > scanning for relevant entries with less cache footprint. > > > > We only scan for ICMP socket expiry every 1s, though, so it's not clear > > that cache footprint really matters. Furthermore, there's no strong reason > > we need to scan even that often - the timeout is fairly arbitrary and > > approximate. > > > > So, eliminate icmp_act[] in favour of directly scanning icmp_id_map[] and > > compensate for the cache impact by reducing the scan frequency to once > > every 10s. > > > > Signed-off-by: David Gibson > > --- > > icmp.c | 34 ++++++---------------------------- > > icmp.h | 2 +- > > 2 files changed, 7 insertions(+), 29 deletions(-) > > > > diff --git a/icmp.c b/icmp.c > > index dd98c7f..02739b9 100644 > > --- a/icmp.c > > +++ b/icmp.c > > @@ -56,9 +56,6 @@ struct icmp_id_sock { > > /* Indexed by ICMP echo identifier */ > > static struct icmp_id_sock icmp_id_map[IP_VERSIONS][ICMP_NUM_IDS]; > > > > -/* Bitmaps, activity monitoring needed for identifier */ > > -static uint8_t icmp_act[IP_VERSIONS][DIV_ROUND_UP(ICMP_NUM_IDS, 8)]; > > - > > /** > > * icmp_sock_handler() - Handle new data from IPv4 ICMP socket > > * @c: Execution context > > @@ -194,7 +191,6 @@ int icmp_tap_handler(const struct ctx *c, uint8_t pif, int af, > > debug("ICMP: new socket %i for echo ID %i", s, id); > > } > > icmp_id_map[V4][id].ts = now->tv_sec; > > - bitmap_set(icmp_act[V4], id); > > > > sa.sin_addr = *(struct in_addr *)daddr; > > if (sendto(s, ih, sizeof(*ih) + plen, MSG_NOSIGNAL, > > @@ -237,7 +233,6 @@ int icmp_tap_handler(const struct ctx *c, uint8_t pif, int af, > > debug("ICMPv6: new socket %i for echo ID %i", s, id); > > } > > icmp_id_map[V6][id].ts = now->tv_sec; > > - bitmap_set(icmp_act[V6], id); > > > > sa.sin6_addr = *(struct in6_addr *)daddr; > > if (sendto(s, ih, sizeof(*ih) + plen, MSG_NOSIGNAL, > > @@ -261,20 +256,15 @@ fail_sock: > > /** > > * icmp_timer_one() - Handler for timed events related to a given identifier > > * @c: Execution context > > - * @v6: Set for IPv6 echo identifier bindings > > - * @id: Echo identifier, host order > > + * @id_map: id socket information to check timers for > > It took me a few readings to understand this... what about: > > * @id_sock: Socket number and activity timestamp > > ? Works for me. Updated. -- David Gibson | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_ | _way_ _around_! http://www.ozlabs.org/~dgibson