All of lore.kernel.org
 help / color / mirror / Atom feed
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 --]

             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.