On Wed, Dec 07, 2011 at 05:07:03PM +0900, Simon Horman wrote: > From: Michael Maxim <mike@xxxxxxxxxxx> > > Modify the algorithm to build the source hashing hash table to add > extra slots for destinations with higher weight. This has the effect > of allowing an IPVS SH user to give more connections to hosts that > have been configured to have a higher weight. > > Signed-off-by: Michael Maxim <mike@xxxxxxxxxxx> > Signed-off-by: Simon Horman <horms@xxxxxxxxxxxx> > --- > net/netfilter/ipvs/Kconfig | 15 +++++++++++++++ > net/netfilter/ipvs/ip_vs_sh.c | 20 ++++++++++++++++++-- > 2 files changed, 33 insertions(+), 2 deletions(-) > > diff --git a/net/netfilter/ipvs/Kconfig b/net/netfilter/ipvs/Kconfig > index 70bd1d0..af4c0b8 100644 > --- a/net/netfilter/ipvs/Kconfig > +++ b/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. Hm, does this really belong to this patch? > + > comment 'IPVS application helper' > > config IP_VS_FTP > diff --git a/net/netfilter/ipvs/ip_vs_sh.c b/net/netfilter/ipvs/ip_vs_sh.c > index 33815f4..e0ca520 100644 > --- a/net/netfilter/ipvs/ip_vs_sh.c > +++ b/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; i<IP_VS_SH_TAB_SIZE; i++) { > if (list_empty(p)) { > b->dest = NULL; > @@ -113,14 +120,23 @@ 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++; > } > + > return 0; > } > > - While at it, would you remove this unnecessary deletions/additions. Thanks! -- To unsubscribe from this list: send the line "unsubscribe lvs-devel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html