From a8c6d3c3690d139ed2e4f74b2ef74dc0203badee Mon Sep 17 00:00:00 2001 From: Michael Maxim Date: Thu, 8 Dec 2011 10:55:09 -0500 Subject: [PATCH] --- yaml --- r: 279063 b: refs/heads/master c: 76ad94fc5df865e34e09406614f29951a046394a h: refs/heads/master i: 279061: b1177061401e751240c23f3f38a097b4d04d751a 279059: 662024e8f7813f8b2ad0fad96f3e36728df26ffe 279055: 9b22168fc03c27267e9f9ff404ce0ca9a8da203f v: v3 --- [refs] | 2 +- trunk/net/netfilter/ipvs/Kconfig | 15 +++++++++++++++ trunk/net/netfilter/ipvs/ip_vs_sh.c | 18 +++++++++++++++++- 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index 098696d74751..01360d77a0cb 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: e26f9a480fb6c1b614660e824d69a74e2ce990f3 +refs/heads/master: 76ad94fc5df865e34e09406614f29951a046394a diff --git a/trunk/net/netfilter/ipvs/Kconfig b/trunk/net/netfilter/ipvs/Kconfig index 70bd1d0774c6..af4c0b8c5275 100644 --- a/trunk/net/netfilter/ipvs/Kconfig +++ b/trunk/net/netfilter/ipvs/Kconfig @@ -232,6 +232,21 @@ config IP_VS_NQ If you want to compile it in kernel, say Y. To compile it as a module, choose M here. If unsure, say N. +comment 'IPVS SH scheduler' + +config IP_VS_SH_TAB_BITS + int "IPVS source hashing table size (the Nth power of 2)" + range 4 20 + default 8 + ---help--- + The source hashing scheduler maps source IPs to destinations + stored in a hash table. This table is tiled by each destination + until all slots in the table are filled. When using weights to + allow destinations to receive more connections, the table is + tiled an amount proportional to the weights specified. The table + needs to be large enough to effectively fit all the destinations + multiplied by their respective weights. + comment 'IPVS application helper' config IP_VS_FTP diff --git a/trunk/net/netfilter/ipvs/ip_vs_sh.c b/trunk/net/netfilter/ipvs/ip_vs_sh.c index 33815f4fb451..069e8d4d5c01 100644 --- a/trunk/net/netfilter/ipvs/ip_vs_sh.c +++ b/trunk/net/netfilter/ipvs/ip_vs_sh.c @@ -30,6 +30,11 @@ * server is dead or overloaded, the load balancer can bypass the cache * server and send requests to the original server directly. * + * The weight destination attribute can be used to control the + * distribution of connections to the destinations in servernode. The + * greater the weight, the more connections the destination + * will receive. + * */ #define KMSG_COMPONENT "IPVS" @@ -99,9 +104,11 @@ ip_vs_sh_assign(struct ip_vs_sh_bucket *tbl, struct ip_vs_service *svc) struct ip_vs_sh_bucket *b; struct list_head *p; struct ip_vs_dest *dest; + int d_count; b = tbl; p = &svc->destinations; + d_count = 0; for (i=0; idest = NULL; @@ -113,7 +120,16 @@ ip_vs_sh_assign(struct ip_vs_sh_bucket *tbl, struct ip_vs_service *svc) atomic_inc(&dest->refcnt); b->dest = dest; - p = p->next; + IP_VS_DBG_BUF(6, "assigned i: %d dest: %s weight: %d\n", + i, IP_VS_DBG_ADDR(svc->af, &dest->addr), + atomic_read(&dest->weight)); + + /* Don't move to next dest until filling weight */ + if (++d_count >= atomic_read(&dest->weight)) { + p = p->next; + d_count = 0; + } + } b++; }