diff options
author | Nikolay Aleksandrov <nikolay@cumulusnetworks.com> | 2015-07-23 12:05:40 +0200 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-07-27 06:00:15 +0200 |
commit | caaecdd3d3f8ec0ea9906c54b1dd8ec8316d26b9 (patch) | |
tree | cd22b0388ba421fdc26eac2fc94987a2677df062 /net/ipv6/reassembly.c | |
parent | inet: frag: don't wait for timer deletion when evicting (diff) | |
download | linux-caaecdd3d3f8ec0ea9906c54b1dd8ec8316d26b9.tar.xz linux-caaecdd3d3f8ec0ea9906c54b1dd8ec8316d26b9.zip |
inet: frags: remove INET_FRAG_EVICTED and use list_evictor for the test
We can simply remove the INET_FRAG_EVICTED flag to avoid all the flags
race conditions with the evictor and use a participation test for the
evictor list, when we're at that point (after inet_frag_kill) in the
timer there're 2 possible cases:
1. The evictor added the entry to its evictor list while the timer was
waiting for the chainlock
or
2. The timer unchained the entry and the evictor won't see it
In both cases we should be able to see list_evictor correctly due
to the sync on the chainlock.
Joint work with Florian Westphal.
Tested-by: Frank Schreuder <fschreuder@transip.nl>
Signed-off-by: Nikolay Aleksandrov <nikolay@cumulusnetworks.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv6/reassembly.c')
-rw-r--r-- | net/ipv6/reassembly.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/net/ipv6/reassembly.c b/net/ipv6/reassembly.c index 5c3bbca6a150..f1159bb76e0a 100644 --- a/net/ipv6/reassembly.c +++ b/net/ipv6/reassembly.c @@ -144,7 +144,7 @@ void ip6_expire_frag_queue(struct net *net, struct frag_queue *fq, IP6_INC_STATS_BH(net, __in6_dev_get(dev), IPSTATS_MIB_REASMFAILS); - if (fq->q.flags & INET_FRAG_EVICTED) + if (inet_frag_evicting(&fq->q)) goto out_rcu_unlock; IP6_INC_STATS_BH(net, __in6_dev_get(dev), IPSTATS_MIB_REASMTIMEOUT); |