Felix Huettner via dev <[email protected]> writes:
> 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);
> +
nit: double newline
> + 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;
> }
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev