From: Vlad Yasevich <vladislav.yasevich@hp.com>
To: Ben Woodard <woodard@redhat.com>
Cc: David Miller <davem@davemloft.net>,
netdev@vger.kernel.org, mgrondona@llnl.gov, behlendorf1@llnl.gov
Subject: Re: [PATCH] Customizable TCP backoff patch
Date: Wed, 11 Oct 2006 10:01:47 -0400 [thread overview]
Message-ID: <452CF94B.9000309@hp.com> (raw)
In-Reply-To: <452C4D12.9060102@redhat.com>
Ben Woodard wrote:
------------------------------------------------------------------------
> diff -ru linux-2.6.18/include/net/tcp.h linux-2.6.18.new/include/net/tcp.h
> --- linux-2.6.18/include/net/tcp.h 2006-09-19 20:42:06.000000000 -0700
> +++ linux-2.6.18.new/include/net/tcp.h 2006-10-10 18:42:00.000000000 -0700
> @@ -227,11 +227,23 @@
> extern int sysctl_tcp_base_mss;
> extern int sysctl_tcp_workaround_signed_windows;
> extern int sysctl_tcp_slow_start_after_idle;
> +extern unsigned long sysctl_tcp_rto_max;
> +extern unsigned long sysctl_tcp_rto_init;
>
> extern atomic_t tcp_memory_allocated;
> extern atomic_t tcp_sockets_allocated;
> extern int tcp_memory_pressure;
>
> +static inline unsigned long tcp_rto_max(struct tcp_sock *tp)
> +{
> + return tp->rto_max ? tp->rto_max*HZ/1000 : sysctl_tcp_rto_max;
^^^^^^^^^^^^^^^^^^^
That should probably be msecs_to_jiffies(tp->rto_max)
> +}
> +
> +static inline unsigned long tcp_rto_init(struct tcp_sock *tp)
> +{
> + return tp->rto_init ? tp->rto_init*HZ/1000 : sysctl_tcp_rto_init;
Ditto.
> +}
> +
> /*
> * The next routines deal with comparing 32 bit unsigned ints
> * and worry about wraparound (automatic with unsigned arithmetic).
> diff -ru linux-2.6.18/net/ipv4/sysctl_net_ipv4.c linux-2.6.18.new/net/ipv4/sysctl_net_ipv4.c
> --- linux-2.6.18/net/ipv4/sysctl_net_ipv4.c 2006-09-19 20:42:06.000000000 -0700
> +++ linux-2.6.18.new/net/ipv4/sysctl_net_ipv4.c 2006-10-10 16:32:08.000000000 -0700
> @@ -128,6 +128,8 @@
> return ret;
> }
>
> +static unsigned long tcp_rto_min=0;
> +static unsigned long tcp_rto_max=65535;
>
> ctl_table ipv4_table[] = {
> {
> @@ -697,6 +699,26 @@
> .mode = 0644,
> .proc_handler = &proc_dointvec
> },
> + {
> + .ctl_name = NET_TCP_RTO_MAX,
> + .procname = "tcp_rto_max",
> + .data = &sysctl_tcp_rto_max,
> + .maxlen = sizeof(unsigned),
> + .mode = 0644,
> + .proc_handler = &proc_doulongvec_ms_jiffies,
> + .extra1 = &tcp_rto_min_constant,
> + .extra2 = &tcp_rto_max_constant,
> + },
> + {
> + .ctl_name = NET_TCP_RTO_INIT,
> + .procname = "tcp_rto_init",
> + .data = &sysctl_tcp_rto_init,
> + .maxlen = sizeof(unsigned),
> + .mode = 0644,
> + .proc_handler = &proc_doulongvec_ms_jiffies,
> + .extra1 = &tcp_rto_min_constant,
> + .extra2 = &tcp_rto_max_constant,
> + },
> { .ctl_name = 0 }
> };
Try as I might, I can't find proc_doulongvec_ms_jiffies() anywhere. I think
you meant proc_doulongvec_ms_jiffies_minmax()?
Also, this function has a bug in that it doesn't do corrections for potentially different
HZ values. Look at the msecs_to_jiffies... When I've used proc_doulongvec_ms_jiffies_minmax()
before, I would seen rather interesting truncation errors such that sysctl input didn't match
sysctl output.
>
> diff -ru linux-2.6.18/net/ipv4/tcp.c linux-2.6.18.new/net/ipv4/tcp.c
> --- linux-2.6.18/net/ipv4/tcp.c 2006-09-19 20:42:06.000000000 -0700
> +++ linux-2.6.18.new/net/ipv4/tcp.c 2006-10-10 18:37:40.000000000 -0700
> @@ -1764,6 +1764,8 @@
> return err;
> }
>
> +#define TCP_BACKOFF_MAXVAL 65535
> +
> /*
> * Socket option code for TCP.
> */
> @@ -1939,6 +1941,21 @@
> }
> break;
>
> + case TCP_BACKOFF_MAX:
> + if (val < 1 || val > TCP_BACKOFF_MAXVAL)
> + err = -EINVAL;
> + else
> + tp->rto_max = val;
> + break;
> +
> + case TCP_BACKOFF_INIT:
> + if (val < 1 || val > TCP_BACKOFF_MAXVAL)
> + err = -EINVAL;
> + else
> + tp->rto_init = val;
> + break;
> +
> +
> default:
> err = -ENOPROTOOPT;
> break;
> @@ -2110,6 +2127,12 @@
> if (copy_to_user(optval, icsk->icsk_ca_ops->name, len))
> return -EFAULT;
> return 0;
> + case TCP_BACKOFF_MAX:
> + val = tcp_rto_max(tp)*1000/HZ;
> + break;
> + case TCP_BACKOFF_INIT:
> + val = tcp_rto_init(tp)*1000/HZ;
The two divisions above introduce truncation errors such the input doesn't
match the output. Better to use jiffies_to_msecs().
Regards
-vlad
next prev parent reply other threads:[~2006-10-11 14:01 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-09-27 18:52 [PATCH] Customizable TCP backoff patch Ben Woodard
2006-09-27 23:16 ` David Miller
2006-09-27 23:00 ` Stephen Hemminger
2006-09-28 2:06 ` David Miller
2006-10-03 18:14 ` Ben Woodard
2006-10-04 7:07 ` David Miller
2006-10-04 8:56 ` Ingo Oeser
2006-10-04 9:08 ` David Miller
2006-10-04 17:17 ` Stephen Hemminger
2006-10-11 1:46 ` Ben Woodard
2006-10-11 1:59 ` YOSHIFUJI Hideaki / 吉藤英明
2006-10-11 2:53 ` David Miller
2006-10-11 2:54 ` David Miller
2006-10-11 14:01 ` Vlad Yasevich [this message]
2006-10-12 0:51 ` Ben Woodard
2006-10-12 1:06 ` YOSHIFUJI Hideaki / 吉藤英明
2006-10-12 15:49 ` Ben Woodard
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=452CF94B.9000309@hp.com \
--to=vladislav.yasevich@hp.com \
--cc=behlendorf1@llnl.gov \
--cc=davem@davemloft.net \
--cc=mgrondona@llnl.gov \
--cc=netdev@vger.kernel.org \
--cc=woodard@redhat.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).