Message ID | 1507594969-8347-14-git-send-email-paulmck@linux.vnet.ibm.com |
---|---|
State | Not Applicable, archived |
Delegated to: | David Miller |
Headers | show |
Series | None | expand |
On Mon, Oct 09, 2017 at 05:22:48PM -0700, Paul E. McKenney wrote: > READ_ONCE() now implies smp_read_barrier_depends(), which means that > the instances in arpt_do_table(), ipt_do_table(), and ip6t_do_table() > are now redundant. This commit removes them and adjusts the comments. Similar to the previous patch, the lack of READ_ONCE() in the original code is a pre-existing bug. It would allow the compiler to tear the load and observe a composite of two difference pointer values, or reload the private pointer and result in table_base and jumpstacl being part of different objects. It would be good to point out this actually fixes a bug in the code.
On Tue, Oct 10, 2017 at 10:43:34AM +0200, Peter Zijlstra wrote: > On Mon, Oct 09, 2017 at 05:22:48PM -0700, Paul E. McKenney wrote: > > READ_ONCE() now implies smp_read_barrier_depends(), which means that > > the instances in arpt_do_table(), ipt_do_table(), and ip6t_do_table() > > are now redundant. This commit removes them and adjusts the comments. > > Similar to the previous patch, the lack of READ_ONCE() in the original > code is a pre-existing bug. It would allow the compiler to tear the load > and observe a composite of two difference pointer values, or reload the > private pointer and result in table_base and jumpstacl being part of > different objects. > > It would be good to point out this actually fixes a bug in the code. Assuming that these changes actually fixed something, agreed. ;-) Thanx, Paul
diff --git a/net/ipv4/netfilter/arp_tables.c b/net/ipv4/netfilter/arp_tables.c index 9e2770fd00be..d555b3b31c49 100644 --- a/net/ipv4/netfilter/arp_tables.c +++ b/net/ipv4/netfilter/arp_tables.c @@ -202,13 +202,8 @@ unsigned int arpt_do_table(struct sk_buff *skb, local_bh_disable(); addend = xt_write_recseq_begin(); - private = table->private; + private = READ_ONCE(table->private); /* Address dependency. */ cpu = smp_processor_id(); - /* - * Ensure we load private-> members after we've fetched the base - * pointer. - */ - smp_read_barrier_depends(); table_base = private->entries; jumpstack = (struct arpt_entry **)private->jumpstack[cpu]; diff --git a/net/ipv4/netfilter/ip_tables.c b/net/ipv4/netfilter/ip_tables.c index 39286e543ee6..f63752bec442 100644 --- a/net/ipv4/netfilter/ip_tables.c +++ b/net/ipv4/netfilter/ip_tables.c @@ -260,13 +260,8 @@ ipt_do_table(struct sk_buff *skb, WARN_ON(!(table->valid_hooks & (1 << hook))); local_bh_disable(); addend = xt_write_recseq_begin(); - private = table->private; + private = READ_ONCE(table->private); /* Address dependency. */ cpu = smp_processor_id(); - /* - * Ensure we load private-> members after we've fetched the base - * pointer. - */ - smp_read_barrier_depends(); table_base = private->entries; jumpstack = (struct ipt_entry **)private->jumpstack[cpu]; diff --git a/net/ipv6/netfilter/ip6_tables.c b/net/ipv6/netfilter/ip6_tables.c index 01bd3ee5ebc6..52afcab9b0d6 100644 --- a/net/ipv6/netfilter/ip6_tables.c +++ b/net/ipv6/netfilter/ip6_tables.c @@ -282,12 +282,7 @@ ip6t_do_table(struct sk_buff *skb, local_bh_disable(); addend = xt_write_recseq_begin(); - private = table->private; - /* - * Ensure we load private-> members after we've fetched the base - * pointer. - */ - smp_read_barrier_depends(); + private = READ_ONCE(table->private); /* Address dependency. */ cpu = smp_processor_id(); table_base = private->entries; jumpstack = (struct ip6t_entry **)private->jumpstack[cpu];
READ_ONCE() now implies smp_read_barrier_depends(), which means that the instances in arpt_do_table(), ipt_do_table(), and ip6t_do_table() are now redundant. This commit removes them and adjusts the comments. Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com> Cc: Pablo Neira Ayuso <pablo@netfilter.org> Cc: Jozsef Kadlecsik <kadlec@blackhole.kfki.hu> Cc: Florian Westphal <fw@strlen.de> Cc: "David S. Miller" <davem@davemloft.net> Cc: <netfilter-devel@vger.kernel.org> Cc: <coreteam@netfilter.org> Cc: <netdev@vger.kernel.org> --- net/ipv4/netfilter/arp_tables.c | 7 +------ net/ipv4/netfilter/ip_tables.c | 7 +------ net/ipv6/netfilter/ip6_tables.c | 7 +------ 3 files changed, 3 insertions(+), 18 deletions(-)