Skip to content

Commit

Permalink
[IPSEC]: Move x->outer_mode->output out of locked section
Browse files Browse the repository at this point in the history
RO mode is the only one that requires a locked output function.  So
it's easier to move the lock into that function rather than requiring
everyone else to run under the lock.

In particular, this allows us to move the size check into the output
function without causing a potential dead-lock should the ICMP error
somehow hit the same SA on transmission.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Herbert Xu authored and David S. Miller committed Jan 28, 2008
1 parent e40b328 commit a2deb6d
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 4 deletions.
3 changes: 3 additions & 0 deletions net/ipv6/xfrm6_mode_ro.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/skbuff.h>
#include <linux/spinlock.h>
#include <linux/stringify.h>
#include <linux/time.h>
#include <net/ipv6.h>
Expand All @@ -53,7 +54,9 @@ static int xfrm6_ro_output(struct xfrm_state *x, struct sk_buff *skb)
__skb_pull(skb, hdr_len);
memmove(ipv6_hdr(skb), iph, hdr_len);

spin_lock_bh(&x->lock);
x->lastused = get_seconds();
spin_unlock_bh(&x->lock);

return 0;
}
Expand Down
8 changes: 4 additions & 4 deletions net/xfrm/xfrm_output.c
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,10 @@ int xfrm_output(struct sk_buff *skb)
}

do {
err = x->outer_mode->output(x, skb);
if (err)
goto error;

spin_lock_bh(&x->lock);
err = xfrm_state_check(x, skb);
if (err)
Expand All @@ -64,10 +68,6 @@ int xfrm_output(struct sk_buff *skb)
xfrm_replay_notify(x, XFRM_REPLAY_UPDATE);
}

err = x->outer_mode->output(x, skb);
if (err)
goto error;

x->curlft.bytes += skb->len;
x->curlft.packets++;

Expand Down

0 comments on commit a2deb6d

Please sign in to comment.