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

ipv4: use READ_ONCE()/WRITE_ONCE() on net->ipv4.fib_seq



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

Writes are protected by RTNL.
We can use READ_ONCE() when reading it.

Constify 'struct net' argument of fib4_rules_seq_read()

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-3-edumazet@google.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent a716ff52
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -347,7 +347,7 @@ static inline int fib4_rules_dump(struct net *net, struct notifier_block *nb,
	return 0;
}

static inline unsigned int fib4_rules_seq_read(struct net *net)
static inline unsigned int fib4_rules_seq_read(const struct net *net)
{
	return 0;
}
@@ -411,7 +411,7 @@ static inline bool fib4_has_custom_rules(const struct net *net)
bool fib4_rule_default(const struct fib_rule *rule);
int fib4_rules_dump(struct net *net, struct notifier_block *nb,
		    struct netlink_ext_ack *extack);
unsigned int fib4_rules_seq_read(struct net *net);
unsigned int fib4_rules_seq_read(const struct net *net);

static inline bool fib4_rules_early_flow_dissect(struct net *net,
						 struct sk_buff *skb,
+1 −1
Original line number Diff line number Diff line
@@ -262,7 +262,7 @@ struct netns_ipv4 {
#endif

	struct fib_notifier_ops	*notifier_ops;
	unsigned int	fib_seq;	/* protected by rtnl_mutex */
	unsigned int	fib_seq;	/* writes protected by rtnl_mutex */

	struct fib_notifier_ops	*ipmr_notifier_ops;
	unsigned int	ipmr_seq;	/* protected by rtnl_mutex */
+4 −4
Original line number Diff line number Diff line
@@ -22,15 +22,15 @@ int call_fib4_notifiers(struct net *net, enum fib_event_type event_type,
	ASSERT_RTNL();

	info->family = AF_INET;
	net->ipv4.fib_seq++;
	/* Paired with READ_ONCE() in fib4_seq_read() */
	WRITE_ONCE(net->ipv4.fib_seq, net->ipv4.fib_seq + 1);
	return call_fib_notifiers(net, event_type, info);
}

static unsigned int fib4_seq_read(struct net *net)
{
	ASSERT_RTNL();

	return net->ipv4.fib_seq + fib4_rules_seq_read(net);
	/* Paired with WRITE_ONCE() in call_fib4_notifiers() */
	return READ_ONCE(net->ipv4.fib_seq) + fib4_rules_seq_read(net);
}

static int fib4_dump(struct net *net, struct notifier_block *nb,
+1 −1
Original line number Diff line number Diff line
@@ -74,7 +74,7 @@ int fib4_rules_dump(struct net *net, struct notifier_block *nb,
	return fib_rules_dump(net, nb, AF_INET, extack);
}

unsigned int fib4_rules_seq_read(struct net *net)
unsigned int fib4_rules_seq_read(const struct net *net)
{
	return fib_rules_seq_read(net, AF_INET);
}