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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).