diff options
author | jamal <hadi@cyberus.ca> | 2010-02-15 21:01:22 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-02-16 23:20:24 -0500 |
commit | 6836b9bdd98e3b500cd49512484df68f46e14659 (patch) | |
tree | 39eb8e910213e71ab707ad5d3e0b1606fa844f54 /net | |
parent | e06d41d09f314a1664ad60e46934b0ac131c6fa2 (diff) |
xfrm: avoid spinlock in get_acqseq() used by xfrm user
Eric's version fixed it for pfkey. This one is for xfrm user.
I thought about amortizing those two get_acqseq()s but it seems
reasonable to have two of these sequence spaces for the two different
interfaces.
cheers,
jamal
commit d5168d5addbc999c94aacda8f28a4a173756a72b
Author: Jamal Hadi Salim <hadi@cyberus.ca>
Date: Tue Feb 16 06:51:22 2010 -0500
xfrm: avoid spinlock in get_acqseq() used by xfrm user
This is in the same spirit as commit 28aecb9d7728dc26bf03ce7925fe622023a83a2a
by Eric Dumazet.
Use atomic_inc_return() in get_acqseq() to avoid taking a spinlock
Signed-off-by: Jamal Hadi Salim <hadi@cyberus.ca>
Acked-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r-- | net/xfrm/xfrm_state.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c index f50ee9badf47..96f2088e7448 100644 --- a/net/xfrm/xfrm_state.c +++ b/net/xfrm/xfrm_state.c | |||
@@ -1462,12 +1462,12 @@ EXPORT_SYMBOL(xfrm_find_acq_byseq); | |||
1462 | u32 xfrm_get_acqseq(void) | 1462 | u32 xfrm_get_acqseq(void) |
1463 | { | 1463 | { |
1464 | u32 res; | 1464 | u32 res; |
1465 | static u32 acqseq; | 1465 | static atomic_t acqseq; |
1466 | static DEFINE_SPINLOCK(acqseq_lock); | 1466 | |
1467 | do { | ||
1468 | res = atomic_inc_return(&acqseq); | ||
1469 | } while (!res); | ||
1467 | 1470 | ||
1468 | spin_lock_bh(&acqseq_lock); | ||
1469 | res = (++acqseq ? : ++acqseq); | ||
1470 | spin_unlock_bh(&acqseq_lock); | ||
1471 | return res; | 1471 | return res; |
1472 | } | 1472 | } |
1473 | EXPORT_SYMBOL(xfrm_get_acqseq); | 1473 | EXPORT_SYMBOL(xfrm_get_acqseq); |