[Devel] [PATCH RHEL7 COMMIT] Revert "ms/ipvs: drop conn templates under attack"

Konstantin Khorenko khorenko at virtuozzo.com
Fri Jun 14 19:20:01 MSK 2024


The commit is pushed to "branch-rh7-3.10.0-1160.114.2.vz7.222.x-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh7-3.10.0-1160.114.2.vz7.222.2
------>
commit de8058eaa157af0d1133899ca1026424fa9e1fb6
Author: Konstantin Khorenko <khorenko at virtuozzo.com>
Date:   Fri Jun 14 19:18:36 2024 +0300

    Revert "ms/ipvs: drop conn templates under attack"
    
    This reverts commit c9f04a125c5422268548b5682ee3aacf91a22ce5.
    
    Technical revert, the patch should have couple preparation commits.
    
    https://virtuozzo.atlassian.net/browse/PSBM-156080
    
    Signed-off-by: Konstantin Khorenko <khorenko at virtuozzo.com>
---
 net/netfilter/ipvs/ip_vs_conn.c | 59 ++++++++++++++---------------------------
 1 file changed, 20 insertions(+), 39 deletions(-)

diff --git a/net/netfilter/ipvs/ip_vs_conn.c b/net/netfilter/ipvs/ip_vs_conn.c
index dec5800a2769..d71661bf1641 100644
--- a/net/netfilter/ipvs/ip_vs_conn.c
+++ b/net/netfilter/ipvs/ip_vs_conn.c
@@ -807,23 +807,12 @@ static void ip_vs_conn_expire(unsigned long data)
 
 	/* Unlink conn if not referenced anymore */
 	if (likely(ip_vs_conn_unlink(cp))) {
-		struct ip_vs_conn *ct = cp->control;
-
 		/* delete the timer if it is activated by other users */
 		del_timer(&cp->timer);
 
 		/* does anybody control me? */
-		if (ct) {
+		if (cp->control)
 			ip_vs_control_del(cp);
-			/* Drop CTL or non-assured TPL if not used anymore */
-			if (!cp->timeout && !atomic_read(&ct->n_control) &&
-			    (!(ct->flags & IP_VS_CONN_F_TEMPLATE) ||
-			     !(ct->state & IP_VS_CTPL_S_ASSURED))) {
-				IP_VS_DBG(4, "drop controlling connection\n");
-				ct->timeout = 0;
-				ip_vs_conn_expire_now(ct);
-			}
-		}
 
 		if ((cp->flags & IP_VS_CONN_F_NFCT) &&
 		    !(cp->flags & IP_VS_CONN_F_ONE_PACKET)) {
@@ -866,10 +855,6 @@ static void ip_vs_conn_expire(unsigned long data)
 
 /* Modify timer, so that it expires as soon as possible.
  * Can be called without reference only if under RCU lock.
- * We can have such chain of conns linked with ->control: DATA->CTL->TPL
- * - DATA (eg. FTP) and TPL (persistence) can be present depending on setup
- * - cp->timeout=0 indicates all conns from chain should be dropped but
- * TPL is not dropped if in assured state
  */
 void ip_vs_conn_expire_now(struct ip_vs_conn *cp)
 {
@@ -1206,11 +1191,8 @@ static const struct file_operations ip_vs_conn_sync_fops = {
 #endif
 
 
-/* Randomly drop connection entries before running out of memory
- * Can be used for DATA and CTL conns. For TPL conns there are exceptions:
- * - traffic for services in OPS mode increases ct->in_pkts, so it is supported
- * - traffic for services not in OPS mode does not increase ct->in_pkts in
- * all cases, so it is not supported
+/*
+ *      Randomly drop connection entries before running out of memory
  */
 static inline int todrop_entry(struct ip_vs_conn *cp)
 {
@@ -1254,7 +1236,7 @@ static inline bool ip_vs_conn_ops_mode(struct ip_vs_conn *cp)
 void ip_vs_random_dropentry(struct net *net)
 {
 	int idx;
-	struct ip_vs_conn *cp;
+	struct ip_vs_conn *cp, *cp_c;
 
 	/*
 	 * Randomly scan 1/32 of the whole table every second
@@ -1270,15 +1252,13 @@ void ip_vs_random_dropentry(struct net *net)
 		hlist_for_each_entry_rcu(cp, &ip_vs_conn_tab[hash], c_list) {
 			if (!ip_vs_conn_net_eq(cp, net))
 				continue;
-			if (atomic_read(&cp->n_control))
-				continue;
 			if (cp->flags & IP_VS_CONN_F_TEMPLATE) {
-				/* connection template of OPS */
-				if (ip_vs_conn_ops_mode(cp))
+				if (atomic_read(&cp->n_control) ||
+				    !ip_vs_conn_ops_mode(cp))
+					continue;
+				else
+					/* connection template of OPS */
 					goto try_drop;
-				if (!(cp->state & IP_VS_CTPL_S_ASSURED))
-					goto drop;
-				continue;
 			}
 			if (cp->protocol == IPPROTO_TCP) {
 				switch(cp->state) {
@@ -1300,10 +1280,15 @@ void ip_vs_random_dropentry(struct net *net)
 					continue;
 			}
 
-drop:
-			IP_VS_DBG(4, "drop connection\n");
-			cp->timeout = 0;
+			IP_VS_DBG(4, "del connection\n");
 			ip_vs_conn_expire_now(cp);
+			cp_c = cp->control;
+			/* cp->control is valid only with reference to cp */
+			if (cp_c && __ip_vs_conn_get(cp)) {
+				IP_VS_DBG(4, "del conn template\n");
+				ip_vs_conn_expire_now(cp_c);
+				__ip_vs_conn_put(cp);
+			}
 		}
 		rcu_read_unlock();
 	}
@@ -1329,19 +1314,15 @@ static void ip_vs_conn_flush(struct net *net)
 		hlist_for_each_entry_rcu(cp, &ip_vs_conn_tab[idx], c_list) {
 			if (!ip_vs_conn_net_eq(cp, net))
 				continue;
-			/* As timers are expired in LIFO order, restart
-			 * the timer of controlling connection first, so
-			 * that it is expired after us.
-			 */
+			IP_VS_DBG(4, "del connection\n");
+			ip_vs_conn_expire_now(cp);
 			cp_c = cp->control;
 			/* cp->control is valid only with reference to cp */
 			if (cp_c && __ip_vs_conn_get(cp)) {
-				IP_VS_DBG(4, "del controlling connection\n");
+				IP_VS_DBG(4, "del conn template\n");
 				ip_vs_conn_expire_now(cp_c);
 				__ip_vs_conn_put(cp);
 			}
-			IP_VS_DBG(4, "del connection\n");
-			ip_vs_conn_expire_now(cp);
 		}
 		rcu_read_unlock();
 	}


More information about the Devel mailing list