[PATCH 3/3] netfilter: ipvs: change method to fill lookup table based on weight.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



 Fill lookup table with dests based on their weight.
   - They are assigned by considering weight as the relative
     frequency of the backends’ turn.

Signed-off-by: Inju Song <inju.song@xxxxxxxxxxxxx>
---
 net/netfilter/ipvs/ip_vs_mh.c | 18 ++++++++++++------
 1 file changed, 12 insertions(+), 6 deletions(-)

diff --git a/net/netfilter/ipvs/ip_vs_mh.c b/net/netfilter/ipvs/ip_vs_mh.c
index bb20b96..d1bf50a 100644
--- a/net/netfilter/ipvs/ip_vs_mh.c
+++ b/net/netfilter/ipvs/ip_vs_mh.c
@@ -109,7 +109,7 @@ static inline int ip_vs_mh_permutate(struct ip_vs_mh_state *s,
 static inline int
 ip_vs_mh_populate(struct ip_vs_mh_state *s, struct ip_vs_service *svc)
 {
-	int i, ret;
+	int i, ret, dw_count;
 	unsigned int *next;
 	unsigned int **pmt;
 	struct ip_vs_mh_lookup *entry, *l;
@@ -134,18 +134,20 @@ static inline int ip_vs_mh_permutate(struct ip_vs_mh_state *s,
 	for (i = 0; i < IP_VS_MH_LOOKUP_SIZE; i++)
 		RCU_INIT_POINTER(entry[i].dest, NULL);
 
-	n = 0;
 	p = &svc->destinations;
 	empty = list_empty(p);
 	if (empty)
 		goto out;
 
+	n = 0;
+	dw_count = 0;
 	pmt = s->permutation;
 	while (n < IP_VS_MH_LOOKUP_SIZE) {
-		for (i = 0; i < svc->num_dests; i++) {
-			if (p == &svc->destinations)
-				p = p->next;
+		if (p == &svc->destinations)
+			p = p->next;
 
+		i = 0;
+		while (p != &svc->destinations) {
 			c = pmt[i][next[i]];
 
 			while (entry[c].dest) {
@@ -161,7 +163,11 @@ static inline int ip_vs_mh_permutate(struct ip_vs_mh_state *s,
 			if (n == IP_VS_MH_LOOKUP_SIZE)
 				break;
 
-			p = p->next;
+			if (++dw_count >= atomic_read(&dest->weight)) {
+				p = p->next;
+				dw_count = 0;
+				i++;
+			}
 		}
 	}
 
-- 
1.8.3.1


-- 
Inju Song
NAVER Corporation

--
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



[Index of Archives]     [Linux Filesystem Devel]     [Linux NFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux SCSI]     [X.Org]

  Powered by Linux