LVS
lvs-devel
Google
 
Web LinuxVirtualServer.org

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

To: lvs-devel@xxxxxxxxxxxxxxx
Subject: [PATCH 3/3] netfilter: ipvs: change method to fill lookup table based on weight.
Cc: Wensong Zhang <wensong@xxxxxxxxxxxx>, Simon Horman <horms@xxxxxxxxxxxx>, Julian Anastasov <ja@xxxxxx>
From: Inju Song <inju.song@xxxxxxxxxxxxx>
Date: Sun, 10 Dec 2017 16:35:13 +0900
 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

<Prev in Thread] Current Thread [Next in Thread>