diff options
author | Herbert Xu <herbert@gondor.apana.org.au> | 2006-02-22 17:47:13 -0500 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2006-02-23 19:10:53 -0500 |
commit | 21380b81ef8699179b535e197a95b891a7badac7 (patch) | |
tree | 1a6be9864cabbed59db6357b2f0244413acac4c4 | |
parent | 85259878499d6c428cba191bb4e415a250dcd75a (diff) |
[XFRM]: Eliminate refcounting confusion by creating __xfrm_state_put().
We often just do an atomic_dec(&x->refcnt) on an xfrm_state object
because we know there is more than 1 reference remaining and thus
we can elide the heavier xfrm_state_put() call.
Do this behind an inline function called __xfrm_state_put() so that is
more obvious and also to allow us to more cleanly add refcount
debugging later.
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | include/net/xfrm.h | 5 | ||||
-rw-r--r-- | net/key/af_key.c | 2 | ||||
-rw-r--r-- | net/xfrm/xfrm_state.c | 8 | ||||
-rw-r--r-- | net/xfrm/xfrm_user.c | 2 |
4 files changed, 11 insertions, 6 deletions
diff --git a/include/net/xfrm.h b/include/net/xfrm.h index d6111a2f0a2..004e645f3e1 100644 --- a/include/net/xfrm.h +++ b/include/net/xfrm.h | |||
@@ -403,6 +403,11 @@ unsigned xfrm_spi_hash(xfrm_address_t *addr, u32 spi, u8 proto, unsigned short f | |||
403 | 403 | ||
404 | extern void __xfrm_state_destroy(struct xfrm_state *); | 404 | extern void __xfrm_state_destroy(struct xfrm_state *); |
405 | 405 | ||
406 | static inline void __xfrm_state_put(struct xfrm_state *x) | ||
407 | { | ||
408 | atomic_dec(&x->refcnt); | ||
409 | } | ||
410 | |||
406 | static inline void xfrm_state_put(struct xfrm_state *x) | 411 | static inline void xfrm_state_put(struct xfrm_state *x) |
407 | { | 412 | { |
408 | if (atomic_dec_and_test(&x->refcnt)) | 413 | if (atomic_dec_and_test(&x->refcnt)) |
diff --git a/net/key/af_key.c b/net/key/af_key.c index ae86d237a45..b2d4d1dd211 100644 --- a/net/key/af_key.c +++ b/net/key/af_key.c | |||
@@ -1423,7 +1423,7 @@ static int pfkey_add(struct sock *sk, struct sk_buff *skb, struct sadb_msg *hdr, | |||
1423 | 1423 | ||
1424 | if (err < 0) { | 1424 | if (err < 0) { |
1425 | x->km.state = XFRM_STATE_DEAD; | 1425 | x->km.state = XFRM_STATE_DEAD; |
1426 | xfrm_state_put(x); | 1426 | __xfrm_state_put(x); |
1427 | goto out; | 1427 | goto out; |
1428 | } | 1428 | } |
1429 | 1429 | ||
diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c index e12d0be5f97..c656cbaf35e 100644 --- a/net/xfrm/xfrm_state.c +++ b/net/xfrm/xfrm_state.c | |||
@@ -220,14 +220,14 @@ static int __xfrm_state_delete(struct xfrm_state *x) | |||
220 | x->km.state = XFRM_STATE_DEAD; | 220 | x->km.state = XFRM_STATE_DEAD; |
221 | spin_lock(&xfrm_state_lock); | 221 | spin_lock(&xfrm_state_lock); |
222 | list_del(&x->bydst); | 222 | list_del(&x->bydst); |
223 | atomic_dec(&x->refcnt); | 223 | __xfrm_state_put(x); |
224 | if (x->id.spi) { | 224 | if (x->id.spi) { |
225 | list_del(&x->byspi); | 225 | list_del(&x->byspi); |
226 | atomic_dec(&x->refcnt); | 226 | __xfrm_state_put(x); |
227 | } | 227 | } |
228 | spin_unlock(&xfrm_state_lock); | 228 | spin_unlock(&xfrm_state_lock); |
229 | if (del_timer(&x->timer)) | 229 | if (del_timer(&x->timer)) |
230 | atomic_dec(&x->refcnt); | 230 | __xfrm_state_put(x); |
231 | 231 | ||
232 | /* The number two in this test is the reference | 232 | /* The number two in this test is the reference |
233 | * mentioned in the comment below plus the reference | 233 | * mentioned in the comment below plus the reference |
@@ -243,7 +243,7 @@ static int __xfrm_state_delete(struct xfrm_state *x) | |||
243 | * The xfrm_state_alloc call gives a reference, and that | 243 | * The xfrm_state_alloc call gives a reference, and that |
244 | * is what we are dropping here. | 244 | * is what we are dropping here. |
245 | */ | 245 | */ |
246 | atomic_dec(&x->refcnt); | 246 | __xfrm_state_put(x); |
247 | err = 0; | 247 | err = 0; |
248 | } | 248 | } |
249 | 249 | ||
diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c index ac87a09ba83..7de17559249 100644 --- a/net/xfrm/xfrm_user.c +++ b/net/xfrm/xfrm_user.c | |||
@@ -345,7 +345,7 @@ static int xfrm_add_sa(struct sk_buff *skb, struct nlmsghdr *nlh, void **xfrma) | |||
345 | 345 | ||
346 | if (err < 0) { | 346 | if (err < 0) { |
347 | x->km.state = XFRM_STATE_DEAD; | 347 | x->km.state = XFRM_STATE_DEAD; |
348 | xfrm_state_put(x); | 348 | __xfrm_state_put(x); |
349 | goto out; | 349 | goto out; |
350 | } | 350 | } |
351 | 351 | ||