From: Daniel Stone <daniel@fooishbar.org>
To: netdev@oss.sgi.com
Subject: net/ipv4/route.c GC patch: is this insane?
Date: Mon, 31 May 2004 01:14:34 +1000 [thread overview]
Message-ID: <20040530151434.GE24955@fooishbar.org> (raw)
[-- Attachment #1.1: Type: text/plain, Size: 1090 bytes --]
Hi guys,
Attached is a patch to net/ipv4/route.c (against 2.4.23, sorry) to
combat the 'dst cache full' issue. Essentially, there's a machine that I
have access to (a router) that will report 'dst cache full', and
immediately cease dealing with any IPv4 traffic. I found the attached
patch against 2.0, and forward-ported it to 2.4. As this issue only
crops up randomly every couple of weeks, I can't tell you whether it's
worked or not. All I know is that it hasn't eaten my firstborn so far:
given a quick spin, it seemed to work OK, but whether or not it solves
the problem is a different matter.
I also have /proc/net dumps of the machine from before and after it
died, if anyone wants them.
So, is this patch at all sane?
Please CC me: I don't subscribe.
Cheers!
:) d (to borrow from Michael M: 'hacker, iterant idiot')
--
Daniel Stone <daniel@fooishbar.org>
"The programs are documented fully by _The Rise and Fall of a Fooish Bar_,
available by the Info system." -- debian/manpage.sgml.ex, dh_make template
[-- Attachment #1.2: route-fix-gc.diff --]
[-- Type: text/plain, Size: 2105 bytes --]
--- net/ipv4/route.c.orig 2004-05-11 23:56:10.000000000 +1000
+++ net/ipv4/route.c 2004-05-27 16:16:23.000000000 +1000
@@ -101,7 +101,7 @@
#define IP_MAX_MTU 0xFFF0
-#define RT_GC_TIMEOUT (300*HZ)
+#define RT_GC_TIMEOUT (120*HZ)
int ip_rt_min_delay = 2 * HZ;
int ip_rt_max_delay = 10 * HZ;
@@ -138,7 +138,8 @@
static struct dst_entry *ipv4_negative_advice(struct dst_entry *dst);
static void ipv4_link_failure(struct sk_buff *skb);
static int rt_garbage_collect(void);
-
+static int rt_garbage_docollect(void);
+static int rt_delete_now(void);
struct dst_ops ipv4_dst_ops = {
family: AF_INET,
@@ -526,7 +527,7 @@
and when load increases it reduces to limit cache size.
*/
-static int rt_garbage_collect(void)
+static int rt_garbage_docollect(void)
{
static unsigned long expire = RT_GC_TIMEOUT;
static unsigned long last_gc;
@@ -630,8 +631,11 @@
if (atomic_read(&ipv4_dst_ops.entries) < ip_rt_max_size)
goto out;
+ /*
+ * don't bitch, just silently attempt to correct
if (net_ratelimit())
printk(KERN_WARNING "dst cache overflow\n");
+ */
rt_cache_stat[smp_processor_id()].gc_dst_overflow++;
return 1;
@@ -646,6 +650,40 @@
#endif
out: return 0;
}
+static int rt_delete_now(void){
+ struct rtable *rth, **rthp;
+ int i = 0, ent1 = 0, ent2 = 0, c = 0;
+
+ ent1 = atomic_read(&ipv4_dst_ops.entries);
+ local_bh_disable();
+ while (i < rt_hash_mask) {
+ rthp = &(rt_hash_table[i].chain);
+ while ((rth = *rthp) != NULL) {
+ *rthp = rth->u.rt_next;
+ rth->u.rt_next = NULL;
+ c++;
+ rt_free(rth);
+ }
+ i++;
+ }
+
+ atomic_set(&ipv4_dst_ops.entries, 0);
+ local_bh_enable();
+ ent2 = atomic_read(&ipv4_dst_ops.entries);
+
+ if (net_ratelimit()){
+ printk("dst cache overflow\n");
+ printk("rt_delete_now(): s:%d e:%d t:%d\n", ent1, ent2, c);
+ }
+
+ return 0;
+}
+
+static int rt_garbage_collect(void){
+ if (rt_garbage_docollect())
+ rt_delete_now();
+ return 0;
+}
static int rt_intern_hash(unsigned hash, struct rtable *rt, struct rtable **rp)
{
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 189 bytes --]
next reply other threads:[~2004-05-30 15:14 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-05-30 15:14 Daniel Stone [this message]
2004-05-31 12:21 ` net/ipv4/route.c GC patch: is this insane? Robert Olsson
2004-05-31 12:26 ` net/ipv4/route.c GC patch: is this insane?b4Db3tL Daniel Stone
2004-05-31 12:43 ` Robert Olsson
2004-05-31 14:08 ` net/ipv4/route.c GC patch: is this insane? Daniel Stone
2004-05-31 15:06 ` Robert Olsson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20040530151434.GE24955@fooishbar.org \
--to=daniel@fooishbar.org \
--cc=netdev@oss.sgi.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.