From: Hideo AOKI <haoki@redhat.com>
To: David Miller <davem@davemloft.net>, netdev <netdev@vger.kernel.org>
Cc: Satoshi Oshima <satoshi.oshima.fk@hitachi.com>,
Herbert Xu <herbert@gondor.apana.org.au>,
Andi Kleen <andi@firstfloor.org>,
Stephen Hemminger <shemminger@linux-foundation.org>,
Evgeniy Polyakov <johnpol@2ka.mipt.ru>,
yoshfuji@linux-ipv6.org,
Yumiko Sugita <yumiko.sugita.yf@hitachi.com>
Subject: [PATCH 5/5] introduce udp_rmem and udp_wmem
Date: Mon, 29 Oct 2007 17:23:43 -0400 [thread overview]
Message-ID: <47264F5F.6040905@redhat.com> (raw)
In-Reply-To: <47264E2D.4080109@redhat.com>
[-- Attachment #1: Type: text/plain, Size: 262 bytes --]
This patch added /proc/sys/net/udp_rmem and /proc/sys/net/udp_rmem.
Each UDP packet is drooped when the number of pages for socket buffer
is beyond the limit and the socket already consumes minimum buffer.
--
Hideo Aoki
Hitachi Computer Products (America) Inc.
[-- Attachment #2: add_udp_rmem_wmem.patch --]
[-- Type: text/x-patch, Size: 5434 bytes --]
Cc: Satoshi Oshima <satoshi.oshima.fk@hitachi.com>
Signed-off-by: Hideo Aoki <haoki@redhat.com>
Documentation/networking/ip-sysctl.txt | 12 ++++++++++++
include/net/udp.h | 4 ++++
net/ipv4/ip_output.c | 4 +++-
net/ipv4/sysctl_net_ipv4.c | 20 ++++++++++++++++++++
net/ipv4/udp.c | 13 +++++++++++--
5 files changed, 50 insertions(+), 3 deletions(-)
diff -pruN linux-2.6.24-rc1-mem003-ipv4-dev-p4/Documentation/networking/ip-sysctl.txt linux-2.6.24-rc1-mem003-ipv4-dev-p5/Documentation/networking/ip-sysctl.txt
--- linux-2.6.24-rc1-mem003-ipv4-dev-p4/Documentation/networking/ip-sysctl.txt 2007-10-26 20:35:52.000000000 -0400
+++ linux-2.6.24-rc1-mem003-ipv4-dev-p5/Documentation/networking/ip-sysctl.txt 2007-10-29 09:44:05.000000000 -0400
@@ -452,6 +452,18 @@ udp_mem - INTEGER
Number of pages allowed for queueing by all UDP sockets.
Default is calculated at boot time from amount of available memory.
+udp_rmem - INTEGER
+ Minimal size of receive buffer used by UDP sockets. Each UDP socket
+ is able to use the size for receiving data, even if total pages of UDP
+ sockets exceed udp_mem. The unit is byte.
+ Default: 4096
+
+udp_wmem - INTEGER
+ Minimal size of send buffer used by UDP sockets. Each UDP socket is
+ able to use the size for sending data, even if total pages of UDP
+ sockets exceed udp_mem. The unit is byte.
+ Default: 4096
+
CIPSOv4 Variables:
cipso_cache_enable - BOOLEAN
diff -pruN linux-2.6.24-rc1-mem003-ipv4-dev-p4/include/net/udp.h linux-2.6.24-rc1-mem003-ipv4-dev-p5/include/net/udp.h
--- linux-2.6.24-rc1-mem003-ipv4-dev-p4/include/net/udp.h 2007-10-26 20:35:52.000000000 -0400
+++ linux-2.6.24-rc1-mem003-ipv4-dev-p5/include/net/udp.h 2007-10-29 09:44:05.000000000 -0400
@@ -66,7 +66,11 @@ extern rwlock_t udp_hash_lock;
extern struct proto udp_prot;
extern atomic_t udp_memory_allocated;
+
+/* sysctl variables for udp */
extern int sysctl_udp_mem;
+extern int sysctl_udp_rmem;
+extern int sysctl_udp_wmem;
struct sk_buff;
diff -pruN linux-2.6.24-rc1-mem003-ipv4-dev-p4/net/ipv4/ip_output.c linux-2.6.24-rc1-mem003-ipv4-dev-p5/net/ipv4/ip_output.c
--- linux-2.6.24-rc1-mem003-ipv4-dev-p4/net/ipv4/ip_output.c 2007-10-29 09:36:32.000000000 -0400
+++ linux-2.6.24-rc1-mem003-ipv4-dev-p5/net/ipv4/ip_output.c 2007-10-29 09:44:05.000000000 -0400
@@ -705,7 +705,9 @@ static inline int __ip_check_max_skb_pag
switch(sk->sk_protocol) {
case IPPROTO_UDP:
if (atomic_read(sk->sk_prot->memory_allocated) + size
- > sk->sk_prot->sysctl_mem[0])
+ > sk->sk_prot->sysctl_mem[0] &&
+ atomic_read(&sk->sk_wmem_alloc) + size
+ > sk->sk_prot->sysctl_wmem[0])
return -ENOBUFS;
/* Fall through */
default:
diff -pruN linux-2.6.24-rc1-mem003-ipv4-dev-p4/net/ipv4/sysctl_net_ipv4.c linux-2.6.24-rc1-mem003-ipv4-dev-p5/net/ipv4/sysctl_net_ipv4.c
--- linux-2.6.24-rc1-mem003-ipv4-dev-p4/net/ipv4/sysctl_net_ipv4.c 2007-10-26 20:35:52.000000000 -0400
+++ linux-2.6.24-rc1-mem003-ipv4-dev-p5/net/ipv4/sysctl_net_ipv4.c 2007-10-29 09:44:05.000000000 -0400
@@ -896,6 +896,26 @@ ctl_table ipv4_table[] = {
.strategy = &sysctl_intvec,
.extra1 = &zero
},
+ {
+ .ctl_name = CTL_UNNUMBERED,
+ .procname = "udp_rmem",
+ .data = &sysctl_udp_rmem,
+ .maxlen = sizeof(sysctl_udp_rmem),
+ .mode = 0644,
+ .proc_handler = &proc_dointvec_minmax,
+ .strategy = &sysctl_intvec,
+ .extra1 = &zero
+ },
+ {
+ .ctl_name = CTL_UNNUMBERED,
+ .procname = "udp_wmem",
+ .data = &sysctl_udp_wmem,
+ .maxlen = sizeof(sysctl_udp_wmem),
+ .mode = 0644,
+ .proc_handler = &proc_dointvec_minmax,
+ .strategy = &sysctl_intvec,
+ .extra1 = &zero
+ },
{ .ctl_name = 0 }
};
diff -pruN linux-2.6.24-rc1-mem003-ipv4-dev-p4/net/ipv4/udp.c linux-2.6.24-rc1-mem003-ipv4-dev-p5/net/ipv4/udp.c
--- linux-2.6.24-rc1-mem003-ipv4-dev-p4/net/ipv4/udp.c 2007-10-26 20:35:52.000000000 -0400
+++ linux-2.6.24-rc1-mem003-ipv4-dev-p5/net/ipv4/udp.c 2007-10-29 09:44:05.000000000 -0400
@@ -117,6 +117,8 @@ DEFINE_RWLOCK(udp_hash_lock);
atomic_t udp_memory_allocated;
int sysctl_udp_mem __read_mostly;
+int sysctl_udp_rmem __read_mostly;
+int sysctl_udp_wmem __read_mostly;
static inline int __udp_lib_lport_inuse(__u16 num,
const struct hlist_head udptable[])
@@ -1026,8 +1028,10 @@ int udp_queue_rcv_skb(struct sock * sk,
}
if ((atomic_read(sk->sk_prot->memory_allocated)
- + sk_datagram_pages(skb->truesize))
- > sk->sk_prot->sysctl_mem[0]) {
+ + sk_datagram_pages(skb->truesize))
+ > sk->sk_prot->sysctl_mem[0] &&
+ atomic_read(&sk->sk_rmem_alloc) + skb->truesize
+ > sk->sk_prot->sysctl_rmem[0]) {
UDP_INC_STATS_BH(UDP_MIB_RCVBUFERRORS, up->pcflag);
goto drop;
}
@@ -1468,6 +1472,8 @@ struct proto udp_prot = {
.get_port = udp_v4_get_port,
.memory_allocated = &udp_memory_allocated,
.sysctl_mem = &sysctl_udp_mem,
+ .sysctl_wmem = &sysctl_udp_wmem,
+ .sysctl_rmem = &sysctl_udp_rmem,
.obj_size = sizeof(struct udp_sock),
#ifdef CONFIG_COMPAT
.compat_setsockopt = compat_udp_setsockopt,
@@ -1674,6 +1680,9 @@ void __init udp_init(void)
limit = (limit * (nr_all_pages >> (20-PAGE_SHIFT))) >> (PAGE_SHIFT-11);
limit = max(limit, 128UL);
sysctl_udp_mem = limit / 2 * 3;
+
+ sysctl_udp_rmem = SK_DATAGRAM_MEM_QUANTUM;
+ sysctl_udp_wmem = SK_DATAGRAM_MEM_QUANTUM;
}
EXPORT_SYMBOL(udp_disconnect);
next prev parent reply other threads:[~2007-10-29 21:28 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-10-29 21:18 [PATCH 0/5] UDP memory accounting and limitation (take 6) Hideo AOKI
2007-10-29 21:22 ` [PATCH 1/5] fix send buffer check Hideo AOKI
2007-11-09 12:24 ` Herbert Xu
2007-11-14 3:25 ` Hideo AOKI
2007-10-29 21:23 ` [PATCH 2/5] accounting unit and variable Hideo AOKI
2007-11-09 12:34 ` Herbert Xu
2007-11-14 3:27 ` Hideo AOKI
2007-11-14 3:45 ` Herbert Xu
2007-11-14 3:55 ` David Miller
2007-11-14 15:32 ` Hideo AOKI
2007-11-14 23:30 ` Hideo AOKI
2007-11-15 1:09 ` Herbert Xu
2007-11-15 21:37 ` Hideo AOKI
2007-10-29 21:23 ` [PATCH 3/5] memory accounting Hideo AOKI
2007-11-09 13:07 ` Herbert Xu
2007-10-29 21:23 ` [PATCH 4/5] memory limitation by using udp_mem Hideo AOKI
2007-10-29 21:23 ` Hideo AOKI [this message]
2007-10-30 4:52 ` [PATCH 5/5] introduce udp_rmem and udp_wmem Bill Fink
2007-11-02 15:42 ` Hideo AOKI
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=47264F5F.6040905@redhat.com \
--to=haoki@redhat.com \
--cc=andi@firstfloor.org \
--cc=davem@davemloft.net \
--cc=herbert@gondor.apana.org.au \
--cc=johnpol@2ka.mipt.ru \
--cc=netdev@vger.kernel.org \
--cc=satoshi.oshima.fk@hitachi.com \
--cc=shemminger@linux-foundation.org \
--cc=yoshfuji@linux-ipv6.org \
--cc=yumiko.sugita.yf@hitachi.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).