Commit a716ff52 authored by Eric Dumazet's avatar Eric Dumazet Committed by Jakub Kicinski
Browse files

fib: rules: use READ_ONCE()/WRITE_ONCE() on ops->fib_rules_seq



Using RTNL to protect ops->fib_rules_seq reads seems a big hammer.

Writes are protected by RTNL.
We can use READ_ONCE() on readers.

Constify 'struct net' argument of fib_rules_seq_read()
and lookup_rules_ops().

Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
Reviewed-by: default avatarKuniyuki Iwashima <kuniyu@amazon.com>
Reviewed-by: default avatarDavid Ahern <dsahern@kernel.org>
Link: https://patch.msgid.link/20241009184405.3752829-2-edumazet@google.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent d677aebd
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -176,7 +176,7 @@ int fib_default_rule_add(struct fib_rules_ops *, u32 pref, u32 table);
bool fib_rule_matchall(const struct fib_rule *rule);
int fib_rules_dump(struct net *net, struct notifier_block *nb, int family,
		   struct netlink_ext_ack *extack);
unsigned int fib_rules_seq_read(struct net *net, int family);
unsigned int fib_rules_seq_read(const struct net *net, int family);

int fib_nl_newrule(struct sk_buff *skb, struct nlmsghdr *nlh,
		   struct netlink_ext_ack *extack);
+8 −6
Original line number Diff line number Diff line
@@ -101,7 +101,8 @@ static void notify_rule_change(int event, struct fib_rule *rule,
			       struct fib_rules_ops *ops, struct nlmsghdr *nlh,
			       u32 pid);

static struct fib_rules_ops *lookup_rules_ops(struct net *net, int family)
static struct fib_rules_ops *lookup_rules_ops(const struct net *net,
					      int family)
{
	struct fib_rules_ops *ops;

@@ -370,7 +371,9 @@ static int call_fib_rule_notifiers(struct net *net,
		.rule = rule,
	};

	ops->fib_rules_seq++;
	ASSERT_RTNL();
	/* Paired with READ_ONCE() in fib_rules_seq() */
	WRITE_ONCE(ops->fib_rules_seq, ops->fib_rules_seq + 1);
	return call_fib_notifiers(net, event_type, &info.info);
}

@@ -397,17 +400,16 @@ int fib_rules_dump(struct net *net, struct notifier_block *nb, int family,
}
EXPORT_SYMBOL_GPL(fib_rules_dump);

unsigned int fib_rules_seq_read(struct net *net, int family)
unsigned int fib_rules_seq_read(const struct net *net, int family)
{
	unsigned int fib_rules_seq;
	struct fib_rules_ops *ops;

	ASSERT_RTNL();

	ops = lookup_rules_ops(net, family);
	if (!ops)
		return 0;
	fib_rules_seq = ops->fib_rules_seq;
	/* Paired with WRITE_ONCE() in call_fib_rule_notifiers() */
	fib_rules_seq = READ_ONCE(ops->fib_rules_seq);
	rules_ops_put(ops);

	return fib_rules_seq;