net: xfrm: Use sequence counter with associated spinlock
authorAhmed S. Darwish <a.darwish@linutronix.de>
Tue, 16 Mar 2021 10:56:30 +0000 (11:56 +0100)
committerSteffen Klassert <steffen.klassert@secunet.com>
Mon, 22 Mar 2021 06:38:08 +0000 (07:38 +0100)
A sequence counter write section must be serialized or its internal
state can get corrupted. A plain seqcount_t does not contain the
information of which lock must be held to guaranteee write side
serialization.

For xfrm_state_hash_generation, use seqcount_spinlock_t instead of plain
seqcount_t.  This allows to associate the spinlock used for write
serialization with the sequence counter. It thus enables lockdep to
verify that the write serialization lock is indeed held before entering
the sequence counter write section.

If lockdep is disabled, this lock association is compiled out and has
neither storage size nor runtime overhead.

Signed-off-by: Ahmed S. Darwish <a.darwish@linutronix.de>
Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
include/net/netns/xfrm.h
net/xfrm/xfrm_state.c

index b59d73d529ba717c12b5b79d4f3b34c58ec4ecfb..e816b6a3ef2b0ef28ce9ffc0a6bbb8e6b419f567 100644 (file)
@@ -73,7 +73,7 @@ struct netns_xfrm {
        struct dst_ops          xfrm6_dst_ops;
 #endif
        spinlock_t              xfrm_state_lock;
-       seqcount_t              xfrm_state_hash_generation;
+       seqcount_spinlock_t     xfrm_state_hash_generation;
 
        spinlock_t xfrm_policy_lock;
        struct mutex xfrm_cfg_mutex;
index ffd315cff98467fe45b3f27f35ca87fd078a1645..4496f7efa220017b1c8d8a747e6be3aef65f07b3 100644 (file)
@@ -2665,7 +2665,8 @@ int __net_init xfrm_state_init(struct net *net)
        net->xfrm.state_num = 0;
        INIT_WORK(&net->xfrm.state_hash_work, xfrm_hash_resize);
        spin_lock_init(&net->xfrm.xfrm_state_lock);
-       seqcount_init(&net->xfrm.xfrm_state_hash_generation);
+       seqcount_spinlock_init(&net->xfrm.xfrm_state_hash_generation,
+                              &net->xfrm.xfrm_state_lock);
        return 0;
 
 out_byspi: