This will remove the inefficiencies we would have when just iterating using a position.
Signed-off-by: Felix Huettner <[email protected]> --- Notes: v4->v5: fix skipping the first connection of each zone from cleaning lib/conntrack.c | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/lib/conntrack.c b/lib/conntrack.c index f2adb82a3..ea1a0f614 100644 --- a/lib/conntrack.c +++ b/lib/conntrack.c @@ -23,6 +23,7 @@ #include <string.h> #include "conntrack.h" +#include "cmap.h" #include "conntrack-private.h" #include "conntrack-tp.h" #include "coverage.h" @@ -1506,8 +1507,8 @@ ct_sweep_zone(struct conntrack *ct, uint16_t zone, long long now, struct conn_key_node *keyn; struct conntrack_zone *cz; unsigned int conn_handled = 0; + struct cmap_cursor cursor; struct conn *conn; - struct cmap_node *node; long long expiration; cz = zone_lookup(ct, zone); @@ -1516,13 +1517,24 @@ ct_sweep_zone(struct conntrack *ct, uint16_t zone, long long now, return true; } - if (!*current_position) { - *current_position = xzalloc(sizeof(**current_position)); + if (*current_position) { + /* Note that cmap_position_to_cursor and CMAP_CURSOR_FOR_EACH_CONTINUE + * both advance the cmap cursor by one. This means that we will skip + * the first item of a zone when we resume cleaning. A single + * connection might be skipped in one clean run, but will then + * generally be handled in the next run. */ + cursor = cmap_position_to_cursor(&cz->conns, *current_position); + free(*current_position); + *current_position = NULL; + } else { + cursor = cmap_cursor_start(&cz->conns); } - while ((node = cmap_next_position(&cz->conns, *current_position))) { - keyn = OBJECT_CONTAINING(node, keyn, cm_node); + + CMAP_CURSOR_FOR_EACH_CONTINUE (keyn, cm_node, &cursor) { if (conn_handled > limit) { + *current_position = xzalloc(sizeof(**current_position)); + cmap_cursor_to_position(&cursor, *current_position); *conn_count = conn_handled; return false; } @@ -1541,8 +1553,6 @@ ct_sweep_zone(struct conntrack *ct, uint16_t zone, long long now, conn_handled++; } - free(*current_position); - *current_position = NULL; *conn_count = conn_handled; return true; } -- 2.43.0 _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
