Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 103227
b: refs/heads/master
c: 32cb5b4
h: refs/heads/master
i:
  103225: ea5e150
  103223: 47b97ed
v: v3
  • Loading branch information
Denis V. Lunev authored and David S. Miller committed Jul 6, 2008
1 parent 3281d0e commit 1a89ed0
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 2 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: e84f84f276473dcc673f360e8ff3203148bdf0e2
refs/heads/master: 32cb5b4e035e3d7b52f1e9de87920645a00e5234
31 changes: 30 additions & 1 deletion trunk/net/ipv4/route.c
Original file line number Diff line number Diff line change
Expand Up @@ -699,6 +699,7 @@ static void rt_do_flush(int process_context)
{
unsigned int i;
struct rtable *rth, *next;
struct rtable * tail;

for (i = 0; i <= rt_hash_mask; i++) {
if (process_context && need_resched())
Expand All @@ -708,11 +709,39 @@ static void rt_do_flush(int process_context)
continue;

spin_lock_bh(rt_hash_lock_addr(i));
#ifdef CONFIG_NET_NS
{
struct rtable ** prev, * p;

rth = rt_hash_table[i].chain;

/* defer releasing the head of the list after spin_unlock */
for (tail = rth; tail; tail = tail->u.dst.rt_next)
if (!rt_is_expired(tail))
break;
if (rth != tail)
rt_hash_table[i].chain = tail;

/* call rt_free on entries after the tail requiring flush */
prev = &rt_hash_table[i].chain;
for (p = *prev; p; p = next) {
next = p->u.dst.rt_next;
if (!rt_is_expired(p)) {
prev = &p->u.dst.rt_next;
} else {
*prev = next;
rt_free(p);
}
}
}
#else
rth = rt_hash_table[i].chain;
rt_hash_table[i].chain = NULL;
tail = NULL;
#endif
spin_unlock_bh(rt_hash_lock_addr(i));

for (; rth; rth = next) {
for (; rth != tail; rth = next) {
next = rth->u.dst.rt_next;
rt_free(rth);
}
Expand Down

0 comments on commit 1a89ed0

Please sign in to comment.