Am Thu, Aug 06, 2026 at 10:58:14AM -0400 schrieb Aaron Conole:
> Felix Huettner <[email protected]> writes:
> 
> > We replace the existing rculists used for conntrack sweeping with just
> > iterating over all known connections. This allows us to get rid of the
> > exp_lists in struct conntrack and thereby also of the usage of ct_lock
> > in the connection insert and deletion path.
> > 
> > This means after this commit connection insertion and deletion across
> > different zones has no longer any shared lock. Within the same zone
> > there is still a single lock.
> > 
> > The exp_lists where not ordered in any way, the only difference compared
> > to iterating over all connections was that they only contained
> > connections in the forward direction.
> > This means that this patch will trade away some cleaning performance in
> > order to gain connection insertion and deletion speeds. We will improve
> > the ct cleaning in the following commits.
> > 
> > Signed-off-by: Felix Huettner <[email protected]>
> > ---
> > 
> > Notes:
> >     v3->v4: split to 4 patches, this is 4/4 of the previous patch 5
> > 
> >  lib/conntrack-private.h | 11 +-----
> >  lib/conntrack.c         | 84 ++++++++++++++++-------------------------
> >  2 files changed, 33 insertions(+), 62 deletions(-)
> 
> [...]
> 
> > @@ -1513,29 +1492,35 @@ conntrack_get_sweep_interval(struct conntrack *ct)
> >  }
> >  
> >  static size_t
> > -ct_sweep(struct conntrack *ct, struct rculist *list, long long now,
> > -         size_t *cleaned_count)
> > +ct_sweep_zone(struct conntrack *ct, uint16_t zone, long long now,
> > +              size_t *cleaned_count)
> >      OVS_NO_THREAD_SAFETY_ANALYSIS
> >  {
> > +    struct conn_key_node *keyn;
> > +    struct conntrack_zone *cz;
> > +    unsigned int conn_count = 0;
> > +    unsigned int cleaned = 0;
> >      struct conn *conn;
> > -    size_t cleaned = 0;
> > -    size_t count = 0;
> > +    long long expiration;
> >  
> > -    RCULIST_FOR_EACH (conn, node, list) {
> > -        if (conn_expired(conn, now)) {
> > +    cz = zone_lookup(ct, zone);
> > +    CMAP_FOR_EACH (keyn, cm_node, &cz->conns) {
> > +        if (keyn->dir != CT_DIR_FWD) {
> > +            continue;
> > +        }
> > +
> > +        conn = CONTAINER_OF(keyn, struct conn, key_node[keyn->dir]);
> > +        expiration = conn_expiration(conn);
> > +        if (now >= expiration) {
> >              conn_clean(ct, conn);
> >              cleaned++;
> >          }
> >  
> > -        count++;
> > +        conn_count++;
> >      }
> > -
> > -    if (cleaned_count) {
> > -        *cleaned_count = cleaned;
> > -    }
> > -
> > -    return count;
> > -}
> > +    *cleaned_count = cleaned;
> > +    return conn_count;
> > + }
> 
>   ^  Spacing here.


Thanks
> 
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to