]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
vxlan: Add a linked list of FDB entries
authorIdo Schimmel <idosch@nvidia.com>
Tue, 15 Apr 2025 12:11:35 +0000 (15:11 +0300)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 22 Apr 2025 09:11:15 +0000 (11:11 +0200)
Currently, FDB entries are stored in a hash table with a fixed number of
buckets. The table is used for both lookups and entry traversal.
Subsequent patches will convert the table to rhashtable which is not
suitable for entry traversal.

In preparation for this conversion, add FDB entries to a linked list.
Subsequent patches will convert the driver to use this list when
traversing entries during dump, flush, etc.

Reviewed-by: Petr Machata <petrm@nvidia.com>
Signed-off-by: Ido Schimmel <idosch@nvidia.com>
Link: https://patch.msgid.link/20250415121143.345227-8-idosch@nvidia.com
Reviewed-by: Nikolay Aleksandrov <razor@blackwall.org>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/vxlan/vxlan_core.c
drivers/net/vxlan/vxlan_private.h
include/net/vxlan.h

index b8edd8afda2840b8052b0041eb37201aa35c5f19..511c24e29d4571208d435a1613684604c5a2e6de 100644 (file)
@@ -908,6 +908,7 @@ int vxlan_fdb_create(struct vxlan_dev *vxlan,
        ++vxlan->addrcnt;
        hlist_add_head_rcu(&f->hlist,
                           vxlan_fdb_head(vxlan, mac, src_vni));
+       hlist_add_head_rcu(&f->fdb_node, &vxlan->fdb_list);
 
        *fdb = f;
 
@@ -962,6 +963,7 @@ static void vxlan_fdb_destroy(struct vxlan_dev *vxlan, struct vxlan_fdb *f,
                                                 swdev_notify, NULL);
        }
 
+       hlist_del_init_rcu(&f->fdb_node);
        hlist_del_rcu(&f->hlist);
        list_del_rcu(&f->nh_list);
        call_rcu(&f->rcu, vxlan_fdb_free);
@@ -3360,6 +3362,7 @@ static void vxlan_setup(struct net_device *dev)
 
        for (h = 0; h < FDB_HASH_SIZE; ++h)
                INIT_HLIST_HEAD(&vxlan->fdb_head[h]);
+       INIT_HLIST_HEAD(&vxlan->fdb_list);
 }
 
 static void vxlan_ether_setup(struct net_device *dev)
index 76a351a997d510f18de802dbf6fe8968485dbd25..078702ec604dfe19e162568eaac74b9a456c83bb 100644 (file)
@@ -36,6 +36,7 @@ struct vxlan_fdb {
        __be32            vni;
        u16               flags;        /* see ndm_flags and below */
        struct list_head  nh_list;
+       struct hlist_node fdb_node;
        struct nexthop __rcu *nh;
        struct vxlan_dev  __rcu *vdev;
 };
index 272e11708a33fbe6dd75f44236cb5a1008cbb674..96a6c6f45c2e94a394be8faec6b84b7a8170c9b6 100644 (file)
@@ -307,6 +307,7 @@ struct vxlan_dev {
        struct hlist_head fdb_head[FDB_HASH_SIZE];
 
        struct rhashtable mdb_tbl;
+       struct hlist_head fdb_list;
        struct hlist_head mdb_list;
        unsigned int mdb_seq;
 };