Skip to content

Commit 05b8673

Browse files
qsnklassert
authored andcommitted
xfrm: state: silence sparse warnings during netns exit
Silence sparse warnings in xfrm_state_fini: net/xfrm/xfrm_state.c:3327:9: warning: incorrect type in argument 1 (different address spaces) net/xfrm/xfrm_state.c:3327:9: expected struct hlist_head const *h net/xfrm/xfrm_state.c:3327:9: got struct hlist_head [noderef] __rcu *state_byseq Add xfrm_state_deref_netexit() to wrap those calls. The netns is going away, we don't have to worry about the state_by* pointers being changed behind our backs. Signed-off-by: Sabrina Dubroca <[email protected]> Reviewed-by: Simon Horman <[email protected]> Signed-off-by: Steffen Klassert <[email protected]>
1 parent f468fdd commit 05b8673

1 file changed

Lines changed: 10 additions & 8 deletions

File tree

net/xfrm/xfrm_state.c

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3316,6 +3316,8 @@ int __net_init xfrm_state_init(struct net *net)
33163316
return -ENOMEM;
33173317
}
33183318

3319+
#define xfrm_state_deref_netexit(table) \
3320+
rcu_dereference_protected((table), true /* netns is going away */)
33193321
void xfrm_state_fini(struct net *net)
33203322
{
33213323
unsigned int sz;
@@ -3328,17 +3330,17 @@ void xfrm_state_fini(struct net *net)
33283330
WARN_ON(!list_empty(&net->xfrm.state_all));
33293331

33303332
for (i = 0; i <= net->xfrm.state_hmask; i++) {
3331-
WARN_ON(!hlist_empty(net->xfrm.state_byseq + i));
3332-
WARN_ON(!hlist_empty(net->xfrm.state_byspi + i));
3333-
WARN_ON(!hlist_empty(net->xfrm.state_bysrc + i));
3334-
WARN_ON(!hlist_empty(net->xfrm.state_bydst + i));
3333+
WARN_ON(!hlist_empty(xfrm_state_deref_netexit(net->xfrm.state_byseq) + i));
3334+
WARN_ON(!hlist_empty(xfrm_state_deref_netexit(net->xfrm.state_byspi) + i));
3335+
WARN_ON(!hlist_empty(xfrm_state_deref_netexit(net->xfrm.state_bysrc) + i));
3336+
WARN_ON(!hlist_empty(xfrm_state_deref_netexit(net->xfrm.state_bydst) + i));
33353337
}
33363338

33373339
sz = (net->xfrm.state_hmask + 1) * sizeof(struct hlist_head);
3338-
xfrm_hash_free(net->xfrm.state_byseq, sz);
3339-
xfrm_hash_free(net->xfrm.state_byspi, sz);
3340-
xfrm_hash_free(net->xfrm.state_bysrc, sz);
3341-
xfrm_hash_free(net->xfrm.state_bydst, sz);
3340+
xfrm_hash_free(xfrm_state_deref_netexit(net->xfrm.state_byseq), sz);
3341+
xfrm_hash_free(xfrm_state_deref_netexit(net->xfrm.state_byspi), sz);
3342+
xfrm_hash_free(xfrm_state_deref_netexit(net->xfrm.state_bysrc), sz);
3343+
xfrm_hash_free(xfrm_state_deref_netexit(net->xfrm.state_bydst), sz);
33423344
free_percpu(net->xfrm.state_cache_input);
33433345
}
33443346

0 commit comments

Comments
 (0)