diff mbox

[01/22] netfilter: ipset: Correct rcu_dereference_bh_nfnl() usage

Message ID 1477255075-15255-2-git-send-email-kadlec@blackhole.kfki.hu
State Accepted
Delegated to: Pablo Neira
Headers show

Commit Message

Jozsef Kadlecsik Oct. 23, 2016, 8:37 p.m. UTC
When rcu_dereference_bh_nfnl() macro would be defined on the target
system it will accept pointer and subsystem id.

Check if rcu_dereference_bh_nfnl() is defined and make it accepting two
arguments.

Ported from a patch proposed by Sergey Popovich <popovich_sergei@mail.ua>.

Suggested-by: Sergey Popovich <popovich_sergei@mail.ua>
Signed-off-by: Jozsef Kadlecsik <kadlec@blackhole.kfki.hu>
---
 net/netfilter/ipset/ip_set_hash_gen.h | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

Comments

Pablo Neira Ayuso Nov. 1, 2016, 7:13 p.m. UTC | #1
On Sun, Oct 23, 2016 at 10:37:34PM +0200, Jozsef Kadlecsik wrote:
> When rcu_dereference_bh_nfnl() macro would be defined on the target
> system it will accept pointer and subsystem id.
> 
> Check if rcu_dereference_bh_nfnl() is defined and make it accepting two
> arguments.
> 
> Ported from a patch proposed by Sergey Popovich <popovich_sergei@mail.ua>.
> 
> Suggested-by: Sergey Popovich <popovich_sergei@mail.ua>
> Signed-off-by: Jozsef Kadlecsik <kadlec@blackhole.kfki.hu>
> ---
>  net/netfilter/ipset/ip_set_hash_gen.h | 10 ++++++----
>  1 file changed, 6 insertions(+), 4 deletions(-)
> 
> diff --git a/net/netfilter/ipset/ip_set_hash_gen.h b/net/netfilter/ipset/ip_set_hash_gen.h
> index d32fd6b..bc54be4 100644
> --- a/net/netfilter/ipset/ip_set_hash_gen.h
> +++ b/net/netfilter/ipset/ip_set_hash_gen.h
> @@ -17,7 +17,9 @@
>  #define ipset_dereference_protected(p, set) \
>  	__ipset_dereference_protected(p, spin_is_locked(&(set)->lock))
>  
> -#define rcu_dereference_bh_nfnl(p)	rcu_dereference_bh_check(p, 1)
> +#ifndef rcu_dereference_bh_nfnl

Why this new ifndef? I guess this has to be with the ipset bundle that
you release as standalone module.

> +#define rcu_dereference_bh_nfnl(p, ss)	rcu_dereference_bh_check(p, 1)

If you add this new subsystem parameter, then I think it makes sense
to use lockdep_nfnl_is_held() here. Otherwise, passing the subsystem
ID is not useful.
--
To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/net/netfilter/ipset/ip_set_hash_gen.h b/net/netfilter/ipset/ip_set_hash_gen.h
index d32fd6b..bc54be4 100644
--- a/net/netfilter/ipset/ip_set_hash_gen.h
+++ b/net/netfilter/ipset/ip_set_hash_gen.h
@@ -17,7 +17,9 @@ 
 #define ipset_dereference_protected(p, set) \
 	__ipset_dereference_protected(p, spin_is_locked(&(set)->lock))
 
-#define rcu_dereference_bh_nfnl(p)	rcu_dereference_bh_check(p, 1)
+#ifndef rcu_dereference_bh_nfnl
+#define rcu_dereference_bh_nfnl(p, ss)	rcu_dereference_bh_check(p, 1)
+#endif
 
 /* Hashing which uses arrays to resolve clashing. The hash table is resized
  * (doubled) when searching becomes too long.
@@ -580,7 +582,7 @@  struct htype {
 		return -ENOMEM;
 #endif
 	rcu_read_lock_bh();
-	orig = rcu_dereference_bh_nfnl(h->table);
+	orig = rcu_dereference_bh_nfnl(h->table, NFNL_SUBSYS_IPSET);
 	htable_bits = orig->htable_bits;
 	rcu_read_unlock_bh();
 
@@ -1061,7 +1063,7 @@  struct htype {
 	u8 htable_bits;
 
 	rcu_read_lock_bh();
-	t = rcu_dereference_bh_nfnl(h->table);
+	t = rcu_dereference_bh_nfnl(h->table, NFNL_SUBSYS_IPSET);
 	memsize = mtype_ahash_memsize(h, t, NLEN(set->family), set->dsize);
 	htable_bits = t->htable_bits;
 	rcu_read_unlock_bh();
@@ -1103,7 +1105,7 @@  struct htype {
 
 	if (start) {
 		rcu_read_lock_bh();
-		t = rcu_dereference_bh_nfnl(h->table);
+		t = rcu_dereference_bh_nfnl(h->table, NFNL_SUBSYS_IPSET);
 		atomic_inc(&t->uref);
 		cb->args[IPSET_CB_PRIVATE] = (unsigned long)t;
 		rcu_read_unlock_bh();