Commit 54f45187 authored by Ido Schimmel's avatar Ido Schimmel Committed by Paolo Abeni
Browse files

vxlan: Convert FDB flushing to RCU



Instead of holding the FDB hash lock when traversing the FDB linked list
during flushing, use RCU and only acquire the lock for entries that need
to be flushed.

Reviewed-by: default avatarPetr Machata <petrm@nvidia.com>
Signed-off-by: default avatarIdo Schimmel <idosch@nvidia.com>
Link: https://patch.msgid.link/20250415121143.345227-11-idosch@nvidia.com


Reviewed-by: default avatarNikolay Aleksandrov <razor@blackwall.org>
Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parent a6d04f89
Loading
Loading
Loading
Loading
+10 −5
Original line number Diff line number Diff line
@@ -3037,14 +3037,17 @@ static void vxlan_flush(struct vxlan_dev *vxlan,
			const struct vxlan_fdb_flush_desc *desc)
{
	bool match_remotes = vxlan_fdb_flush_should_match_remotes(desc);
	struct hlist_node *n;
	struct vxlan_fdb *f;

	spin_lock_bh(&vxlan->hash_lock);
	hlist_for_each_entry_safe(f, n, &vxlan->fdb_list, fdb_node) {
	rcu_read_lock();
	hlist_for_each_entry_rcu(f, &vxlan->fdb_list, fdb_node) {
		if (!vxlan_fdb_flush_matches(f, vxlan, desc))
			continue;

		spin_lock_bh(&vxlan->hash_lock);
		if (hlist_unhashed(&f->fdb_node))
			goto unlock;

		if (match_remotes) {
			bool destroy_fdb = false;

@@ -3052,13 +3055,15 @@ static void vxlan_flush(struct vxlan_dev *vxlan,
						      &destroy_fdb);

			if (!destroy_fdb)
				continue;
				goto unlock;
		}

		vxlan_fdb_destroy(vxlan, f, true, true);
	}
unlock:
		spin_unlock_bh(&vxlan->hash_lock);
	}
	rcu_read_unlock();
}

static const struct nla_policy vxlan_del_bulk_policy[NDA_MAX + 1] = {
	[NDA_SRC_VNI]   = { .type = NLA_U32 },