aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/netfilter/ipvs/Kconfig15
-rw-r--r--net/netfilter/ipvs/ip_vs_sh.c18
2 files changed, 32 insertions, 1 deletions
diff --git a/net/netfilter/ipvs/Kconfig b/net/netfilter/ipvs/Kconfig
index 70bd1d0774c6..af4c0b8c5275 100644
--- a/net/netfilter/ipvs/Kconfig
+++ b/net/netfilter/ipvs/Kconfig
@@ -232,6 +232,21 @@ config IP_VS_NQ
232 If you want to compile it in kernel, say Y. To compile it as a 232 If you want to compile it in kernel, say Y. To compile it as a
233 module, choose M here. If unsure, say N. 233 module, choose M here. If unsure, say N.
234 234
235comment 'IPVS SH scheduler'
236
237config IP_VS_SH_TAB_BITS
238 int "IPVS source hashing table size (the Nth power of 2)"
239 range 4 20
240 default 8
241 ---help---
242 The source hashing scheduler maps source IPs to destinations
243 stored in a hash table. This table is tiled by each destination
244 until all slots in the table are filled. When using weights to
245 allow destinations to receive more connections, the table is
246 tiled an amount proportional to the weights specified. The table
247 needs to be large enough to effectively fit all the destinations
248 multiplied by their respective weights.
249
235comment 'IPVS application helper' 250comment 'IPVS application helper'
236 251
237config IP_VS_FTP 252config IP_VS_FTP
diff --git a/net/netfilter/ipvs/ip_vs_sh.c b/net/netfilter/ipvs/ip_vs_sh.c
index 33815f4fb451..069e8d4d5c01 100644
--- a/net/netfilter/ipvs/ip_vs_sh.c
+++ b/net/netfilter/ipvs/ip_vs_sh.c
@@ -30,6 +30,11 @@
30 * server is dead or overloaded, the load balancer can bypass the cache 30 * server is dead or overloaded, the load balancer can bypass the cache
31 * server and send requests to the original server directly. 31 * server and send requests to the original server directly.
32 * 32 *
33 * The weight destination attribute can be used to control the
34 * distribution of connections to the destinations in servernode. The
35 * greater the weight, the more connections the destination
36 * will receive.
37 *
33 */ 38 */
34 39
35#define KMSG_COMPONENT "IPVS" 40#define KMSG_COMPONENT "IPVS"
@@ -99,9 +104,11 @@ ip_vs_sh_assign(struct ip_vs_sh_bucket *tbl, struct ip_vs_service *svc)
99 struct ip_vs_sh_bucket *b; 104 struct ip_vs_sh_bucket *b;
100 struct list_head *p; 105 struct list_head *p;
101 struct ip_vs_dest *dest; 106 struct ip_vs_dest *dest;
107 int d_count;
102 108
103 b = tbl; 109 b = tbl;
104 p = &svc->destinations; 110 p = &svc->destinations;
111 d_count = 0;
105 for (i=0; i<IP_VS_SH_TAB_SIZE; i++) { 112 for (i=0; i<IP_VS_SH_TAB_SIZE; i++) {
106 if (list_empty(p)) { 113 if (list_empty(p)) {
107 b->dest = NULL; 114 b->dest = NULL;
@@ -113,7 +120,16 @@ ip_vs_sh_assign(struct ip_vs_sh_bucket *tbl, struct ip_vs_service *svc)
113 atomic_inc(&dest->refcnt); 120 atomic_inc(&dest->refcnt);
114 b->dest = dest; 121 b->dest = dest;
115 122
116 p = p->next; 123 IP_VS_DBG_BUF(6, "assigned i: %d dest: %s weight: %d\n",
124 i, IP_VS_DBG_ADDR(svc->af, &dest->addr),
125 atomic_read(&dest->weight));
126
127 /* Don't move to next dest until filling weight */
128 if (++d_count >= atomic_read(&dest->weight)) {
129 p = p->next;
130 d_count = 0;
131 }
132
117 } 133 }
118 b++; 134 b++;
119 } 135 }