diff options
| -rw-r--r-- | net/netfilter/ipvs/Kconfig | 15 | ||||
| -rw-r--r-- | net/netfilter/ipvs/ip_vs_sh.c | 18 |
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 | ||
| 235 | comment 'IPVS SH scheduler' | ||
| 236 | |||
| 237 | config 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 | |||
| 235 | comment 'IPVS application helper' | 250 | comment 'IPVS application helper' |
| 236 | 251 | ||
| 237 | config IP_VS_FTP | 252 | config 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 | } |
