| Seq | Timestamp | Type | Name | Duration |
|---|---|---|---|---|
| 0/0 | 2026/07/13 12:49 | flow | patch-triage |
1mArgs:null Results: {
"EnableConfigs": [
"IP_VS",
"IP_VS_RR",
"IP_VS_WRR",
"IP_VS_LC",
"IP_VS_WLC",
"IP_VS_FO",
"IP_VS_OVF",
"IP_VS_LBLC",
"IP_VS_LBLCR",
"IP_VS_DH",
"IP_VS_SH",
"IP_VS_MH",
"IP_VS_SED",
"IP_VS_NQ",
"IP_VS_TWOS"
],
"FocusSymbols": [
"ip_vs_dest_update_overload",
"ip_vs_bind_dest",
"ip_vs_unbind_dest",
"__ip_vs_update_dest",
"ip_vs_add_dest",
"ip_vs_edit_dest"
],
"Reasoning": "The patch modifies the core connection tracking and load balancing logic of IPVS by changing how the destination overload flag is updated and checked. It introduces a new `flags2` field and updates multiple IPVS schedulers to use it. This is a functional change to reachable core kernel logic and should be fuzzed.",
"WorthFuzzing": true
} |
| 1/1 | 2026/07/13 12:49 | action | read-patch-diff |
0mArgs:null Results: {
"PatchDiff": "commit af136b735d81bfc0e4f3930bd008eabd8cd6fef7\nAuthor: syz-cluster \u003ctriage@syzkaller.com\u003e\nDate: Mon Jul 13 12:49:38 2026 +0000\n\n syz-cluster: applied patch under review\n\ndiff --git a/include/net/ip_vs.h b/include/net/ip_vs.h\nindex 417ff51f62fc8e..5e8e55f82b0440 100644\n--- a/include/net/ip_vs.h\n+++ b/include/net/ip_vs.h\n@@ -36,6 +36,13 @@\n #define IP_VS_HDR_INVERSE\t1\n #define IP_VS_HDR_ICMP\t\t2\n \n+/* Destination Server Flags */\n+#define IP_VS_DEST_F_AVAILABLE\t0x0001\t\t/* server is available */\n+\n+enum {\n+\tIP_VS_DEST_FL_OVERLOAD,\n+};\n+\n /* conn_tab limits (as per Kconfig) */\n #define IP_VS_CONN_TAB_MIN_BITS\t8\n #if BITS_PER_LONG \u003e 32\n@@ -976,6 +983,7 @@ struct ip_vs_dest {\n \tvolatile unsigned int\tflags;\t\t/* dest status flags */\n \tatomic_t\t\tconn_flags;\t/* flags to copy to conn */\n \tatomic_t\t\tweight;\t\t/* server weight */\n+\tunsigned long\t\tflags2;\t\t/* dest status flags */\n \tatomic_t\t\tlast_weight;\t/* server latest weight */\n \t__u16\t\t\ttun_type;\t/* tunnel type */\n \t__be16\t\t\ttun_port;\t/* tunnel port */\n@@ -1907,6 +1915,8 @@ static inline void ip_vs_dest_put_and_free(struct ip_vs_dest *dest)\n \t\tkfree(dest);\n }\n \n+void ip_vs_dest_update_overload(struct ip_vs_dest *dest);\n+\n /* IPVS sync daemon data and function prototypes\n * (from ip_vs_sync.c)\n */\ndiff --git a/include/uapi/linux/ip_vs.h b/include/uapi/linux/ip_vs.h\nindex 1ed234e7f25136..2c37c6ac7525a5 100644\n--- a/include/uapi/linux/ip_vs.h\n+++ b/include/uapi/linux/ip_vs.h\n@@ -28,12 +28,6 @@\n #define IP_VS_SVC_F_SCHED_SH_FALLBACK\tIP_VS_SVC_F_SCHED1 /* SH fallback */\n #define IP_VS_SVC_F_SCHED_SH_PORT\tIP_VS_SVC_F_SCHED2 /* SH use port */\n \n-/*\n- * Destination Server Flags\n- */\n-#define IP_VS_DEST_F_AVAILABLE\t0x0001\t\t/* server is available */\n-#define IP_VS_DEST_F_OVERLOAD\t0x0002\t\t/* server is overloaded */\n-\n /*\n * IPVS sync daemon states\n */\ndiff --git a/net/netfilter/ipvs/ip_vs_conn.c b/net/netfilter/ipvs/ip_vs_conn.c\nindex 6ed2622363f0d6..2591f4e143f84c 100644\n--- a/net/netfilter/ipvs/ip_vs_conn.c\n+++ b/net/netfilter/ipvs/ip_vs_conn.c\n@@ -991,6 +991,34 @@ static inline int ip_vs_dest_totalconns(struct ip_vs_dest *dest)\n \t\t+ atomic_read(\u0026dest-\u003einactconns);\n }\n \n+/* Update overload flag based on number of dest conns and lower/upper\n+ * connection thresholds:\n+ * - conns reach u_threshold and exceed it: set the flag\n+ * - conns go below l_threshold (or 75% of u_threshold): clear the flag\n+ */\n+__always_inline void ip_vs_dest_update_overload(struct ip_vs_dest *dest)\n+{\n+\tint conns;\n+\tu32 l, u;\n+\n+\tu = READ_ONCE(dest-\u003eu_threshold);\n+\tif (!u)\n+\t\tgoto unset;\n+\tconns = ip_vs_dest_totalconns(dest);\n+\tif (conns \u003e= u) {\n+\t\tset_bit(IP_VS_DEST_FL_OVERLOAD, \u0026dest-\u003eflags2);\n+\t\treturn;\n+\t}\n+\t/* Low threshold defaults to 75% of upper threshold */\n+\tl = READ_ONCE(dest-\u003el_threshold) ? : (u - (u \u003e\u003e 2));\n+\tif (conns \u003e= l)\n+\t\treturn;\n+\n+unset:\n+\tif (test_bit(IP_VS_DEST_FL_OVERLOAD, \u0026dest-\u003eflags2))\n+\t\tclear_bit(IP_VS_DEST_FL_OVERLOAD, \u0026dest-\u003eflags2);\n+}\n+\n /*\n *\tBind a connection entry with a virtual service destination\n *\tCalled just after a new connection entry is created.\n@@ -1053,9 +1081,7 @@ ip_vs_bind_dest(struct ip_vs_conn *cp, struct ip_vs_dest *dest)\n \t\tatomic_inc(\u0026dest-\u003epersistconns);\n \t}\n \n-\tif (dest-\u003eu_threshold != 0 \u0026\u0026\n-\t ip_vs_dest_totalconns(dest) \u003e= dest-\u003eu_threshold)\n-\t\tdest-\u003eflags |= IP_VS_DEST_F_OVERLOAD;\n+\tip_vs_dest_update_overload(dest);\n }\n \n \n@@ -1149,16 +1175,8 @@ static inline void ip_vs_unbind_dest(struct ip_vs_conn *cp)\n \t\tatomic_dec(\u0026dest-\u003epersistconns);\n \t}\n \n-\tif (dest-\u003el_threshold != 0) {\n-\t\tif (ip_vs_dest_totalconns(dest) \u003c dest-\u003el_threshold)\n-\t\t\tdest-\u003eflags \u0026= ~IP_VS_DEST_F_OVERLOAD;\n-\t} else if (dest-\u003eu_threshold != 0) {\n-\t\tif (ip_vs_dest_totalconns(dest) * 4 \u003c dest-\u003eu_threshold * 3)\n-\t\t\tdest-\u003eflags \u0026= ~IP_VS_DEST_F_OVERLOAD;\n-\t} else {\n-\t\tif (dest-\u003eflags \u0026 IP_VS_DEST_F_OVERLOAD)\n-\t\t\tdest-\u003eflags \u0026= ~IP_VS_DEST_F_OVERLOAD;\n-\t}\n+\tif (test_bit(IP_VS_DEST_FL_OVERLOAD, \u0026dest-\u003eflags2))\n+\t\tip_vs_dest_update_overload(dest);\n \n \tip_vs_dest_put(dest);\n }\ndiff --git a/net/netfilter/ipvs/ip_vs_ctl.c b/net/netfilter/ipvs/ip_vs_ctl.c\nindex bcf40b8c41cf26..62f73d892f97c9 100644\n--- a/net/netfilter/ipvs/ip_vs_ctl.c\n+++ b/net/netfilter/ipvs/ip_vs_ctl.c\n@@ -1370,10 +1370,12 @@ __ip_vs_update_dest(struct ip_vs_service *svc, struct ip_vs_dest *dest,\n \t/* set the dest status flags */\n \tdest-\u003eflags |= IP_VS_DEST_F_AVAILABLE;\n \n-\tif (udest-\u003eu_threshold == 0 || udest-\u003eu_threshold \u003e dest-\u003eu_threshold)\n-\t\tdest-\u003eflags \u0026= ~IP_VS_DEST_F_OVERLOAD;\n-\tdest-\u003eu_threshold = udest-\u003eu_threshold;\n-\tdest-\u003el_threshold = udest-\u003el_threshold;\n+\tif (READ_ONCE(dest-\u003eu_threshold) != udest-\u003eu_threshold ||\n+\t READ_ONCE(dest-\u003el_threshold) != udest-\u003el_threshold) {\n+\t\tWRITE_ONCE(dest-\u003eu_threshold, udest-\u003eu_threshold);\n+\t\tWRITE_ONCE(dest-\u003el_threshold, udest-\u003el_threshold);\n+\t\tip_vs_dest_update_overload(dest);\n+\t}\n \n \tdest-\u003eaf = udest-\u003eaf;\n \n@@ -1486,6 +1488,9 @@ ip_vs_add_dest(struct ip_vs_service *svc, struct ip_vs_dest_user_kern *udest)\n \t\treturn -ERANGE;\n \t}\n \n+\tif (udest-\u003eu_threshold \u003e INT_MAX)\n+\t\treturn -EINVAL;\n+\n \tif (udest-\u003etun_type == IP_VS_CONN_F_TUNNEL_TYPE_GUE) {\n \t\tif (udest-\u003etun_port == 0) {\n \t\t\tpr_err(\"%s(): tunnel port is zero\\n\", __func__);\n@@ -1559,6 +1564,9 @@ ip_vs_edit_dest(struct ip_vs_service *svc, struct ip_vs_dest_user_kern *udest)\n \t\treturn -ERANGE;\n \t}\n \n+\tif (udest-\u003eu_threshold \u003e INT_MAX)\n+\t\treturn -EINVAL;\n+\n \tif (udest-\u003etun_type == IP_VS_CONN_F_TUNNEL_TYPE_GUE) {\n \t\tif (udest-\u003etun_port == 0) {\n \t\t\tpr_err(\"%s(): tunnel port is zero\\n\", __func__);\n@@ -3667,8 +3675,8 @@ __ip_vs_get_dest_entries(struct netns_ipvs *ipvs, const struct ip_vs_get_dests *\n \t\t\tentry.port = dest-\u003eport;\n \t\t\tentry.conn_flags = atomic_read(\u0026dest-\u003econn_flags);\n \t\t\tentry.weight = atomic_read(\u0026dest-\u003eweight);\n-\t\t\tentry.u_threshold = dest-\u003eu_threshold;\n-\t\t\tentry.l_threshold = dest-\u003el_threshold;\n+\t\t\tentry.u_threshold = READ_ONCE(dest-\u003eu_threshold);\n+\t\t\tentry.l_threshold = READ_ONCE(dest-\u003el_threshold);\n \t\t\tentry.activeconns = atomic_read(\u0026dest-\u003eactiveconns);\n \t\t\tentry.inactconns = atomic_read(\u0026dest-\u003einactconns);\n \t\t\tentry.persistconns = atomic_read(\u0026dest-\u003epersistconns);\n@@ -4277,8 +4285,10 @@ static int ip_vs_genl_fill_dest(struct sk_buff *skb, struct ip_vs_dest *dest)\n \t\t\t dest-\u003etun_port) ||\n \t nla_put_u16(skb, IPVS_DEST_ATTR_TUN_FLAGS,\n \t\t\tdest-\u003etun_flags) ||\n-\t nla_put_u32(skb, IPVS_DEST_ATTR_U_THRESH, dest-\u003eu_threshold) ||\n-\t nla_put_u32(skb, IPVS_DEST_ATTR_L_THRESH, dest-\u003el_threshold) ||\n+\t nla_put_u32(skb, IPVS_DEST_ATTR_U_THRESH,\n+\t\t\tREAD_ONCE(dest-\u003eu_threshold)) ||\n+\t nla_put_u32(skb, IPVS_DEST_ATTR_L_THRESH,\n+\t\t\tREAD_ONCE(dest-\u003el_threshold)) ||\n \t nla_put_u32(skb, IPVS_DEST_ATTR_ACTIVE_CONNS,\n \t\t\tatomic_read(\u0026dest-\u003eactiveconns)) ||\n \t nla_put_u32(skb, IPVS_DEST_ATTR_INACT_CONNS,\ndiff --git a/net/netfilter/ipvs/ip_vs_dh.c b/net/netfilter/ipvs/ip_vs_dh.c\nindex e1f62f6b25e211..364acb6342e2fe 100644\n--- a/net/netfilter/ipvs/ip_vs_dh.c\n+++ b/net/netfilter/ipvs/ip_vs_dh.c\n@@ -196,12 +196,12 @@ static int ip_vs_dh_dest_changed(struct ip_vs_service *svc,\n \n \n /*\n- * If the dest flags is set with IP_VS_DEST_F_OVERLOAD,\n+ * If the dest flags is set with IP_VS_DEST_FL_OVERLOAD,\n * consider that the server is overloaded here.\n */\n static inline int is_overloaded(struct ip_vs_dest *dest)\n {\n-\treturn dest-\u003eflags \u0026 IP_VS_DEST_F_OVERLOAD;\n+\treturn test_bit(IP_VS_DEST_FL_OVERLOAD, \u0026dest-\u003eflags2);\n }\n \n \ndiff --git a/net/netfilter/ipvs/ip_vs_fo.c b/net/netfilter/ipvs/ip_vs_fo.c\nindex d657b47c6511ff..a59af6c1189aca 100644\n--- a/net/netfilter/ipvs/ip_vs_fo.c\n+++ b/net/netfilter/ipvs/ip_vs_fo.c\n@@ -29,7 +29,7 @@ ip_vs_fo_schedule(struct ip_vs_service *svc, const struct sk_buff *skb,\n \t * Find virtual server with highest weight and send it traffic\n \t */\n \tlist_for_each_entry_rcu(dest, \u0026svc-\u003edestinations, n_list) {\n-\t\tif (!(dest-\u003eflags \u0026 IP_VS_DEST_F_OVERLOAD) \u0026\u0026\n+\t\tif (!test_bit(IP_VS_DEST_FL_OVERLOAD, \u0026dest-\u003eflags2) \u0026\u0026\n \t\t atomic_read(\u0026dest-\u003eweight) \u003e hw) {\n \t\t\thweight = dest;\n \t\t\thw = atomic_read(\u0026dest-\u003eweight);\ndiff --git a/net/netfilter/ipvs/ip_vs_lblc.c b/net/netfilter/ipvs/ip_vs_lblc.c\nindex 15ccb2b2fa1f4a..ee26be3eb8606f 100644\n--- a/net/netfilter/ipvs/ip_vs_lblc.c\n+++ b/net/netfilter/ipvs/ip_vs_lblc.c\n@@ -414,7 +414,7 @@ __ip_vs_lblc_schedule(struct ip_vs_service *svc)\n \t * new connection.\n \t */\n \tlist_for_each_entry_rcu(dest, \u0026svc-\u003edestinations, n_list) {\n-\t\tif (dest-\u003eflags \u0026 IP_VS_DEST_F_OVERLOAD)\n+\t\tif (test_bit(IP_VS_DEST_FL_OVERLOAD, \u0026dest-\u003eflags2))\n \t\t\tcontinue;\n \t\tif (atomic_read(\u0026dest-\u003eweight) \u003e 0) {\n \t\t\tleast = dest;\n@@ -429,7 +429,7 @@ __ip_vs_lblc_schedule(struct ip_vs_service *svc)\n \t */\n nextstage:\n \tlist_for_each_entry_continue_rcu(dest, \u0026svc-\u003edestinations, n_list) {\n-\t\tif (dest-\u003eflags \u0026 IP_VS_DEST_F_OVERLOAD)\n+\t\tif (test_bit(IP_VS_DEST_FL_OVERLOAD, \u0026dest-\u003eflags2))\n \t\t\tcontinue;\n \n \t\tdoh = ip_vs_dest_conn_overhead(dest);\ndiff --git a/net/netfilter/ipvs/ip_vs_lblcr.c b/net/netfilter/ipvs/ip_vs_lblcr.c\nindex c90ea897c3f756..28858e44225a6c 100644\n--- a/net/netfilter/ipvs/ip_vs_lblcr.c\n+++ b/net/netfilter/ipvs/ip_vs_lblcr.c\n@@ -166,7 +166,7 @@ static inline struct ip_vs_dest *ip_vs_dest_set_min(struct ip_vs_dest_set *set)\n \t/* select the first destination server, whose weight \u003e 0 */\n \tlist_for_each_entry_rcu(e, \u0026set-\u003elist, list) {\n \t\tleast = e-\u003edest;\n-\t\tif (least-\u003eflags \u0026 IP_VS_DEST_F_OVERLOAD)\n+\t\tif (test_bit(IP_VS_DEST_FL_OVERLOAD, \u0026least-\u003eflags2))\n \t\t\tcontinue;\n \n \t\tif ((atomic_read(\u0026least-\u003eweight) \u003e 0)\n@@ -181,7 +181,7 @@ static inline struct ip_vs_dest *ip_vs_dest_set_min(struct ip_vs_dest_set *set)\n nextstage:\n \tlist_for_each_entry_continue_rcu(e, \u0026set-\u003elist, list) {\n \t\tdest = e-\u003edest;\n-\t\tif (dest-\u003eflags \u0026 IP_VS_DEST_F_OVERLOAD)\n+\t\tif (test_bit(IP_VS_DEST_FL_OVERLOAD, \u0026dest-\u003eflags2))\n \t\t\tcontinue;\n \n \t\tdoh = ip_vs_dest_conn_overhead(dest);\n@@ -577,7 +577,7 @@ __ip_vs_lblcr_schedule(struct ip_vs_service *svc)\n \t * new connection.\n \t */\n \tlist_for_each_entry_rcu(dest, \u0026svc-\u003edestinations, n_list) {\n-\t\tif (dest-\u003eflags \u0026 IP_VS_DEST_F_OVERLOAD)\n+\t\tif (test_bit(IP_VS_DEST_FL_OVERLOAD, \u0026dest-\u003eflags2))\n \t\t\tcontinue;\n \n \t\tif (atomic_read(\u0026dest-\u003eweight) \u003e 0) {\n@@ -593,7 +593,7 @@ __ip_vs_lblcr_schedule(struct ip_vs_service *svc)\n \t */\n nextstage:\n \tlist_for_each_entry_continue_rcu(dest, \u0026svc-\u003edestinations, n_list) {\n-\t\tif (dest-\u003eflags \u0026 IP_VS_DEST_F_OVERLOAD)\n+\t\tif (test_bit(IP_VS_DEST_FL_OVERLOAD, \u0026dest-\u003eflags2))\n \t\t\tcontinue;\n \n \t\tdoh = ip_vs_dest_conn_overhead(dest);\ndiff --git a/net/netfilter/ipvs/ip_vs_lc.c b/net/netfilter/ipvs/ip_vs_lc.c\nindex 38cc38c5d8bbd9..c4e4e91e3e6d7d 100644\n--- a/net/netfilter/ipvs/ip_vs_lc.c\n+++ b/net/netfilter/ipvs/ip_vs_lc.c\n@@ -38,7 +38,7 @@ ip_vs_lc_schedule(struct ip_vs_service *svc, const struct sk_buff *skb,\n \t */\n \n \tlist_for_each_entry_rcu(dest, \u0026svc-\u003edestinations, n_list) {\n-\t\tif ((dest-\u003eflags \u0026 IP_VS_DEST_F_OVERLOAD) ||\n+\t\tif (test_bit(IP_VS_DEST_FL_OVERLOAD, \u0026dest-\u003eflags2) ||\n \t\t atomic_read(\u0026dest-\u003eweight) == 0)\n \t\t\tcontinue;\n \t\tdoh = ip_vs_dest_conn_overhead(dest);\ndiff --git a/net/netfilter/ipvs/ip_vs_mh.c b/net/netfilter/ipvs/ip_vs_mh.c\nindex 020863047562d3..23ffc51ca088f0 100644\n--- a/net/netfilter/ipvs/ip_vs_mh.c\n+++ b/net/netfilter/ipvs/ip_vs_mh.c\n@@ -80,7 +80,7 @@ static inline void generate_hash_secret(hsiphash_key_t *hash1,\n static inline bool is_unavailable(struct ip_vs_dest *dest)\n {\n \treturn atomic_read(\u0026dest-\u003eweight) \u003c= 0 ||\n-\t dest-\u003eflags \u0026 IP_VS_DEST_F_OVERLOAD;\n+\t test_bit(IP_VS_DEST_FL_OVERLOAD, \u0026dest-\u003eflags2);\n }\n \n /* Returns hash value for IPVS MH entry */\ndiff --git a/net/netfilter/ipvs/ip_vs_nq.c b/net/netfilter/ipvs/ip_vs_nq.c\nindex ada158c610ce11..d6fbb9e50e4b44 100644\n--- a/net/netfilter/ipvs/ip_vs_nq.c\n+++ b/net/netfilter/ipvs/ip_vs_nq.c\n@@ -72,7 +72,7 @@ ip_vs_nq_schedule(struct ip_vs_service *svc, const struct sk_buff *skb,\n \n \tlist_for_each_entry_rcu(dest, \u0026svc-\u003edestinations, n_list) {\n \n-\t\tif (dest-\u003eflags \u0026 IP_VS_DEST_F_OVERLOAD ||\n+\t\tif (test_bit(IP_VS_DEST_FL_OVERLOAD, \u0026dest-\u003eflags2) ||\n \t\t !atomic_read(\u0026dest-\u003eweight))\n \t\t\tcontinue;\n \ndiff --git a/net/netfilter/ipvs/ip_vs_ovf.c b/net/netfilter/ipvs/ip_vs_ovf.c\nindex c5c67df80a0b3c..104de8c24a4f65 100644\n--- a/net/netfilter/ipvs/ip_vs_ovf.c\n+++ b/net/netfilter/ipvs/ip_vs_ovf.c\n@@ -33,7 +33,7 @@ ip_vs_ovf_schedule(struct ip_vs_service *svc, const struct sk_buff *skb,\n \t*/\n \tlist_for_each_entry_rcu(dest, \u0026svc-\u003edestinations, n_list) {\n \t\tw = atomic_read(\u0026dest-\u003eweight);\n-\t\tif ((dest-\u003eflags \u0026 IP_VS_DEST_F_OVERLOAD) ||\n+\t\tif (test_bit(IP_VS_DEST_FL_OVERLOAD, \u0026dest-\u003eflags2) ||\n \t\t atomic_read(\u0026dest-\u003eactiveconns) \u003e w ||\n \t\t w == 0)\n \t\t\tcontinue;\ndiff --git a/net/netfilter/ipvs/ip_vs_rr.c b/net/netfilter/ipvs/ip_vs_rr.c\nindex 4125ee561cdc36..c38bee987d1432 100644\n--- a/net/netfilter/ipvs/ip_vs_rr.c\n+++ b/net/netfilter/ipvs/ip_vs_rr.c\n@@ -66,7 +66,7 @@ ip_vs_rr_schedule(struct ip_vs_service *svc, const struct sk_buff *skb,\n \t\tlist_for_each_entry_continue_rcu(dest,\n \t\t\t\t\t\t \u0026svc-\u003edestinations,\n \t\t\t\t\t\t n_list) {\n-\t\t\tif (!(dest-\u003eflags \u0026 IP_VS_DEST_F_OVERLOAD) \u0026\u0026\n+\t\t\tif (!test_bit(IP_VS_DEST_FL_OVERLOAD, \u0026dest-\u003eflags2) \u0026\u0026\n \t\t\t atomic_read(\u0026dest-\u003eweight) \u003e 0)\n \t\t\t\t/* HIT */\n \t\t\t\tgoto out;\ndiff --git a/net/netfilter/ipvs/ip_vs_sed.c b/net/netfilter/ipvs/ip_vs_sed.c\nindex 245a323c84cd32..0ce425f9748af7 100644\n--- a/net/netfilter/ipvs/ip_vs_sed.c\n+++ b/net/netfilter/ipvs/ip_vs_sed.c\n@@ -75,7 +75,7 @@ ip_vs_sed_schedule(struct ip_vs_service *svc, const struct sk_buff *skb,\n \t */\n \n \tlist_for_each_entry_rcu(dest, \u0026svc-\u003edestinations, n_list) {\n-\t\tif (!(dest-\u003eflags \u0026 IP_VS_DEST_F_OVERLOAD) \u0026\u0026\n+\t\tif (!test_bit(IP_VS_DEST_FL_OVERLOAD, \u0026dest-\u003eflags2) \u0026\u0026\n \t\t atomic_read(\u0026dest-\u003eweight) \u003e 0) {\n \t\t\tleast = dest;\n \t\t\tloh = ip_vs_sed_dest_overhead(least);\n@@ -90,7 +90,7 @@ ip_vs_sed_schedule(struct ip_vs_service *svc, const struct sk_buff *skb,\n \t */\n nextstage:\n \tlist_for_each_entry_continue_rcu(dest, \u0026svc-\u003edestinations, n_list) {\n-\t\tif (dest-\u003eflags \u0026 IP_VS_DEST_F_OVERLOAD)\n+\t\tif (test_bit(IP_VS_DEST_FL_OVERLOAD, \u0026dest-\u003eflags2))\n \t\t\tcontinue;\n \t\tdoh = ip_vs_sed_dest_overhead(dest);\n \t\tif ((__s64)loh * atomic_read(\u0026dest-\u003eweight) \u003e\ndiff --git a/net/netfilter/ipvs/ip_vs_sh.c b/net/netfilter/ipvs/ip_vs_sh.c\nindex cd67066e3b2612..bbdb683b8e8601 100644\n--- a/net/netfilter/ipvs/ip_vs_sh.c\n+++ b/net/netfilter/ipvs/ip_vs_sh.c\n@@ -73,7 +73,7 @@ struct ip_vs_sh_state {\n static inline bool is_unavailable(struct ip_vs_dest *dest)\n {\n \treturn atomic_read(\u0026dest-\u003eweight) \u003c= 0 ||\n-\t dest-\u003eflags \u0026 IP_VS_DEST_F_OVERLOAD;\n+\t test_bit(IP_VS_DEST_FL_OVERLOAD, \u0026dest-\u003eflags2);\n }\n \n /*\ndiff --git a/net/netfilter/ipvs/ip_vs_twos.c b/net/netfilter/ipvs/ip_vs_twos.c\nindex dbb7f5fd4688a4..ce5618f02e7df4 100644\n--- a/net/netfilter/ipvs/ip_vs_twos.c\n+++ b/net/netfilter/ipvs/ip_vs_twos.c\n@@ -52,7 +52,7 @@ static struct ip_vs_dest *ip_vs_twos_schedule(struct ip_vs_service *svc,\n \n \t/* Generate a random weight between [0,sum of all weights) */\n \tlist_for_each_entry_rcu(dest, \u0026svc-\u003edestinations, n_list) {\n-\t\tif (!(dest-\u003eflags \u0026 IP_VS_DEST_F_OVERLOAD)) {\n+\t\tif (!test_bit(IP_VS_DEST_FL_OVERLOAD, \u0026dest-\u003eflags2)) {\n \t\t\tweight = atomic_read(\u0026dest-\u003eweight);\n \t\t\tif (weight \u003e 0) {\n \t\t\t\ttotal_weight += weight;\n@@ -75,7 +75,7 @@ static struct ip_vs_dest *ip_vs_twos_schedule(struct ip_vs_service *svc,\n \n \t/* Pick two weighted servers */\n \tlist_for_each_entry_rcu(dest, \u0026svc-\u003edestinations, n_list) {\n-\t\tif (dest-\u003eflags \u0026 IP_VS_DEST_F_OVERLOAD)\n+\t\tif (test_bit(IP_VS_DEST_FL_OVERLOAD, \u0026dest-\u003eflags2))\n \t\t\tcontinue;\n \n \t\tweight = atomic_read(\u0026dest-\u003eweight);\ndiff --git a/net/netfilter/ipvs/ip_vs_wlc.c b/net/netfilter/ipvs/ip_vs_wlc.c\nindex 9da445ca09a14c..62a4c814919272 100644\n--- a/net/netfilter/ipvs/ip_vs_wlc.c\n+++ b/net/netfilter/ipvs/ip_vs_wlc.c\n@@ -47,7 +47,7 @@ ip_vs_wlc_schedule(struct ip_vs_service *svc, const struct sk_buff *skb,\n \t */\n \n \tlist_for_each_entry_rcu(dest, \u0026svc-\u003edestinations, n_list) {\n-\t\tif (!(dest-\u003eflags \u0026 IP_VS_DEST_F_OVERLOAD) \u0026\u0026\n+\t\tif (!test_bit(IP_VS_DEST_FL_OVERLOAD, \u0026dest-\u003eflags2) \u0026\u0026\n \t\t atomic_read(\u0026dest-\u003eweight) \u003e 0) {\n \t\t\tleast = dest;\n \t\t\tloh = ip_vs_dest_conn_overhead(least);\n@@ -62,7 +62,7 @@ ip_vs_wlc_schedule(struct ip_vs_service *svc, const struct sk_buff *skb,\n \t */\n nextstage:\n \tlist_for_each_entry_continue_rcu(dest, \u0026svc-\u003edestinations, n_list) {\n-\t\tif (dest-\u003eflags \u0026 IP_VS_DEST_F_OVERLOAD)\n+\t\tif (test_bit(IP_VS_DEST_FL_OVERLOAD, \u0026dest-\u003eflags2))\n \t\t\tcontinue;\n \t\tdoh = ip_vs_dest_conn_overhead(dest);\n \t\tif ((__s64)loh * atomic_read(\u0026dest-\u003eweight) \u003e\ndiff --git a/net/netfilter/ipvs/ip_vs_wrr.c b/net/netfilter/ipvs/ip_vs_wrr.c\nindex 2dcff1040da521..b99cbc1d13029d 100644\n--- a/net/netfilter/ipvs/ip_vs_wrr.c\n+++ b/net/netfilter/ipvs/ip_vs_wrr.c\n@@ -176,7 +176,7 @@ ip_vs_wrr_schedule(struct ip_vs_service *svc, const struct sk_buff *skb,\n \t\tlist_for_each_entry_continue_rcu(dest,\n \t\t\t\t\t\t \u0026svc-\u003edestinations,\n \t\t\t\t\t\t n_list) {\n-\t\t\tif (!(dest-\u003eflags \u0026 IP_VS_DEST_F_OVERLOAD) \u0026\u0026\n+\t\t\tif (!test_bit(IP_VS_DEST_FL_OVERLOAD, \u0026dest-\u003eflags2) \u0026\u0026\n \t\t\t atomic_read(\u0026dest-\u003eweight) \u003e= mark-\u003ecw)\n \t\t\t\tgoto found;\n \t\t\tif (dest == stop)\n"
} |
| 2/1 | 2026/07/13 12:49 | agent | patch-evaluator |
1mModel:gemini-3.1-pro-preview Args: null Results: {
"EnableConfigs": [
"IP_VS",
"IP_VS_RR",
"IP_VS_WRR",
"IP_VS_LC",
"IP_VS_WLC",
"IP_VS_FO",
"IP_VS_OVF",
"IP_VS_LBLC",
"IP_VS_LBLCR",
"IP_VS_DH",
"IP_VS_SH",
"IP_VS_MH",
"IP_VS_SED",
"IP_VS_NQ",
"IP_VS_TWOS"
],
"FocusSymbols": [
"ip_vs_dest_update_overload",
"ip_vs_bind_dest",
"ip_vs_unbind_dest",
"__ip_vs_update_dest",
"ip_vs_add_dest",
"ip_vs_edit_dest"
],
"Reasoning": "The patch modifies the core connection tracking and load balancing logic of IPVS by changing how the destination overload flag is updated and checked. It introduces a new `flags2` field and updates multiple IPVS schedulers to use it. This is a functional change to reachable core kernel logic and should be fuzzed.",
"WorthFuzzing": true
}Instruction: You are an expert Linux kernel maintainer. Your job is to review a provided patch series and determine if it makes functional changes to the kernel that should be fuzzed. IMPORTANT: The changes have ALREADY been applied and committed as the HEAD commit in your workspace. Do NOT rely on your internal knowledge of the kernel. You must actively use your code access tools to examine the actual source code and confirm any assumptions. Return WorthFuzzing=false if the patch only contains: - Modifications to Documentation/, Kconfig files, or code comments. - Purely decorative changes, such as logging (e.g., pr_err, printk) or tracepoints. - Changes to numeric constants or macros that do not functionally alter execution flow. - Code paths that are impossible to reach in virtualized environments like GCE or QEMU, even when utilizing software-emulated hardware (e.g., usb gadget, mac80211_hwsim). If it modifies reachable core kernel logic, drivers, or architectures, use your code search tools to verify the code can be executed, then return WorthFuzzing=true. When returning WorthFuzzing=true, you MUST ALSO: 1. Extract any specific kernel functions that should be heavily fuzzed into FocusSymbols. Avoid listing generic hot-path functions to prevent skewed test distributions. 2. Identify any specific CONFIG_ options required to properly test this new/modified feature. Go and look into the Kconfig files and check for ifdefs around the code, do not make assumptions. Do not list too generic configs (we already have them enabled). Only list those that specifically cover the modified code. List them in the EnableConfigs output array, and DO NOT add a 'CONFIG_' prefix (e.g., return "NET_IPV4" instead of "CONFIG_NET_IPV4"). Prefer calling several tools at the same time to save round-trips. Use set-results tool to provide results of the analysis. It must be called exactly once before the final reply. Ignore results of this tool. Prompt: For your convenience, here is the diff of the changes:
commit af136b735d81bfc0e4f3930bd008eabd8cd6fef7
Author: syz-cluster <triage@syzkaller.com>
Date: Mon Jul 13 12:49:38 2026 +0000
syz-cluster: applied patch under review
diff --git a/include/net/ip_vs.h b/include/net/ip_vs.h
index 417ff51f62fc8e..5e8e55f82b0440 100644
--- a/include/net/ip_vs.h
+++ b/include/net/ip_vs.h
@@ -36,6 +36,13 @@
#define IP_VS_HDR_INVERSE 1
#define IP_VS_HDR_ICMP 2
+/* Destination Server Flags */
+#define IP_VS_DEST_F_AVAILABLE 0x0001 /* server is available */
+
+enum {
+ IP_VS_DEST_FL_OVERLOAD,
+};
+
/* conn_tab limits (as per Kconfig) */
#define IP_VS_CONN_TAB_MIN_BITS 8
#if BITS_PER_LONG > 32
@@ -976,6 +983,7 @@ struct ip_vs_dest {
volatile unsigned int flags; /* dest status flags */
atomic_t conn_flags; /* flags to copy to conn */
atomic_t weight; /* server weight */
+ unsigned long flags2; /* dest status flags */
atomic_t last_weight; /* server latest weight */
__u16 tun_type; /* tunnel type */
__be16 tun_port; /* tunnel port */
@@ -1907,6 +1915,8 @@ static inline void ip_vs_dest_put_and_free(struct ip_vs_dest *dest)
kfree(dest);
}
+void ip_vs_dest_update_overload(struct ip_vs_dest *dest);
+
/* IPVS sync daemon data and function prototypes
* (from ip_vs_sync.c)
*/
diff --git a/include/uapi/linux/ip_vs.h b/include/uapi/linux/ip_vs.h
index 1ed234e7f25136..2c37c6ac7525a5 100644
--- a/include/uapi/linux/ip_vs.h
+++ b/include/uapi/linux/ip_vs.h
@@ -28,12 +28,6 @@
#define IP_VS_SVC_F_SCHED_SH_FALLBACK IP_VS_SVC_F_SCHED1 /* SH fallback */
#define IP_VS_SVC_F_SCHED_SH_PORT IP_VS_SVC_F_SCHED2 /* SH use port */
-/*
- * Destination Server Flags
- */
-#define IP_VS_DEST_F_AVAILABLE 0x0001 /* server is available */
-#define IP_VS_DEST_F_OVERLOAD 0x0002 /* server is overloaded */
-
/*
* IPVS sync daemon states
*/
diff --git a/net/netfilter/ipvs/ip_vs_conn.c b/net/netfilter/ipvs/ip_vs_conn.c
index 6ed2622363f0d6..2591f4e143f84c 100644
--- a/net/netfilter/ipvs/ip_vs_conn.c
+++ b/net/netfilter/ipvs/ip_vs_conn.c
@@ -991,6 +991,34 @@ static inline int ip_vs_dest_totalconns(struct ip_vs_dest *dest)
+ atomic_read(&dest->inactconns);
}
+/* Update overload flag based on number of dest conns and lower/upper
+ * connection thresholds:
+ * - conns reach u_threshold and exceed it: set the flag
+ * - conns go below l_threshold (or 75% of u_threshold): clear the flag
+ */
+__always_inline void ip_vs_dest_update_overload(struct ip_vs_dest *dest)
+{
+ int conns;
+ u32 l, u;
+
+ u = READ_ONCE(dest->u_threshold);
+ if (!u)
+ goto unset;
+ conns = ip_vs_dest_totalconns(dest);
+ if (conns >= u) {
+ set_bit(IP_VS_DEST_FL_OVERLOAD, &dest->flags2);
+ return;
+ }
+ /* Low threshold defaults to 75% of upper threshold */
+ l = READ_ONCE(dest->l_threshold) ? : (u - (u >> 2));
+ if (conns >= l)
+ return;
+
+unset:
+ if (test_bit(IP_VS_DEST_FL_OVERLOAD, &dest->flags2))
+ clear_bit(IP_VS_DEST_FL_OVERLOAD, &dest->flags2);
+}
+
/*
* Bind a connection entry with a virtual service destination
* Called just after a new connection entry is created.
@@ -1053,9 +1081,7 @@ ip_vs_bind_dest(struct ip_vs_conn *cp, struct ip_vs_dest *dest)
atomic_inc(&dest->persistconns);
}
- if (dest->u_threshold != 0 &&
- ip_vs_dest_totalconns(dest) >= dest->u_threshold)
- dest->flags |= IP_VS_DEST_F_OVERLOAD;
+ ip_vs_dest_update_overload(dest);
}
@@ -1149,16 +1175,8 @@ static inline void ip_vs_unbind_dest(struct ip_vs_conn *cp)
atomic_dec(&dest->persistconns);
}
- if (dest->l_threshold != 0) {
- if (ip_vs_dest_totalconns(dest) < dest->l_threshold)
- dest->flags &= ~IP_VS_DEST_F_OVERLOAD;
- } else if (dest->u_threshold != 0) {
- if (ip_vs_dest_totalconns(dest) * 4 < dest->u_threshold * 3)
- dest->flags &= ~IP_VS_DEST_F_OVERLOAD;
- } else {
- if (dest->flags & IP_VS_DEST_F_OVERLOAD)
- dest->flags &= ~IP_VS_DEST_F_OVERLOAD;
- }
+ if (test_bit(IP_VS_DEST_FL_OVERLOAD, &dest->flags2))
+ ip_vs_dest_update_overload(dest);
ip_vs_dest_put(dest);
}
diff --git a/net/netfilter/ipvs/ip_vs_ctl.c b/net/netfilter/ipvs/ip_vs_ctl.c
index bcf40b8c41cf26..62f73d892f97c9 100644
--- a/net/netfilter/ipvs/ip_vs_ctl.c
+++ b/net/netfilter/ipvs/ip_vs_ctl.c
@@ -1370,10 +1370,12 @@ __ip_vs_update_dest(struct ip_vs_service *svc, struct ip_vs_dest *dest,
/* set the dest status flags */
dest->flags |= IP_VS_DEST_F_AVAILABLE;
- if (udest->u_threshold == 0 || udest->u_threshold > dest->u_threshold)
- dest->flags &= ~IP_VS_DEST_F_OVERLOAD;
- dest->u_threshold = udest->u_threshold;
- dest->l_threshold = udest->l_threshold;
+ if (READ_ONCE(dest->u_threshold) != udest->u_threshold ||
+ READ_ONCE(dest->l_threshold) != udest->l_threshold) {
+ WRITE_ONCE(dest->u_threshold, udest->u_threshold);
+ WRITE_ONCE(dest->l_threshold, udest->l_threshold);
+ ip_vs_dest_update_overload(dest);
+ }
dest->af = udest->af;
@@ -1486,6 +1488,9 @@ ip_vs_add_dest(struct ip_vs_service *svc, struct ip_vs_dest_user_kern *udest)
return -ERANGE;
}
+ if (udest->u_threshold > INT_MAX)
+ return -EINVAL;
+
if (udest->tun_type == IP_VS_CONN_F_TUNNEL_TYPE_GUE) {
if (udest->tun_port == 0) {
pr_err("%s(): tunnel port is zero\n", __func__);
@@ -1559,6 +1564,9 @@ ip_vs_edit_dest(struct ip_vs_service *svc, struct ip_vs_dest_user_kern *udest)
return -ERANGE;
}
+ if (udest->u_threshold > INT_MAX)
+ return -EINVAL;
+
if (udest->tun_type == IP_VS_CONN_F_TUNNEL_TYPE_GUE) {
if (udest->tun_port == 0) {
pr_err("%s(): tunnel port is zero\n", __func__);
@@ -3667,8 +3675,8 @@ __ip_vs_get_dest_entries(struct netns_ipvs *ipvs, const struct ip_vs_get_dests *
entry.port = dest->port;
entry.conn_flags = atomic_read(&dest->conn_flags);
entry.weight = atomic_read(&dest->weight);
- entry.u_threshold = dest->u_threshold;
- entry.l_threshold = dest->l_threshold;
+ entry.u_threshold = READ_ONCE(dest->u_threshold);
+ entry.l_threshold = READ_ONCE(dest->l_threshold);
entry.activeconns = atomic_read(&dest->activeconns);
entry.inactconns = atomic_read(&dest->inactconns);
entry.persistconns = atomic_read(&dest->persistconns);
@@ -4277,8 +4285,10 @@ static int ip_vs_genl_fill_dest(struct sk_buff *skb, struct ip_vs_dest *dest)
dest->tun_port) ||
nla_put_u16(skb, IPVS_DEST_ATTR_TUN_FLAGS,
dest->tun_flags) ||
- nla_put_u32(skb, IPVS_DEST_ATTR_U_THRESH, dest->u_threshold) ||
- nla_put_u32(skb, IPVS_DEST_ATTR_L_THRESH, dest->l_threshold) ||
+ nla_put_u32(skb, IPVS_DEST_ATTR_U_THRESH,
+ READ_ONCE(dest->u_threshold)) ||
+ nla_put_u32(skb, IPVS_DEST_ATTR_L_THRESH,
+ READ_ONCE(dest->l_threshold)) ||
nla_put_u32(skb, IPVS_DEST_ATTR_ACTIVE_CONNS,
atomic_read(&dest->activeconns)) ||
nla_put_u32(skb, IPVS_DEST_ATTR_INACT_CONNS,
diff --git a/net/netfilter/ipvs/ip_vs_dh.c b/net/netfilter/ipvs/ip_vs_dh.c
index e1f62f6b25e211..364acb6342e2fe 100644
--- a/net/netfilter/ipvs/ip_vs_dh.c
+++ b/net/netfilter/ipvs/ip_vs_dh.c
@@ -196,12 +196,12 @@ static int ip_vs_dh_dest_changed(struct ip_vs_service *svc,
/*
- * If the dest flags is set with IP_VS_DEST_F_OVERLOAD,
+ * If the dest flags is set with IP_VS_DEST_FL_OVERLOAD,
* consider that the server is overloaded here.
*/
static inline int is_overloaded(struct ip_vs_dest *dest)
{
- return dest->flags & IP_VS_DEST_F_OVERLOAD;
+ return test_bit(IP_VS_DEST_FL_OVERLOAD, &dest->flags2);
}
diff --git a/net/netfilter/ipvs/ip_vs_fo.c b/net/netfilter/ipvs/ip_vs_fo.c
index d657b47c6511ff..a59af6c1189aca 100644
--- a/net/netfilter/ipvs/ip_vs_fo.c
+++ b/net/netfilter/ipvs/ip_vs_fo.c
@@ -29,7 +29,7 @@ ip_vs_fo_schedule(struct ip_vs_service *svc, const struct sk_buff *skb,
* Find virtual server with highest weight and send it traffic
*/
list_for_each_entry_rcu(dest, &svc->destinations, n_list) {
- if (!(dest->flags & IP_VS_DEST_F_OVERLOAD) &&
+ if (!test_bit(IP_VS_DEST_FL_OVERLOAD, &dest->flags2) &&
atomic_read(&dest->weight) > hw) {
hweight = dest;
hw = atomic_read(&dest->weight);
diff --git a/net/netfilter/ipvs/ip_vs_lblc.c b/net/netfilter/ipvs/ip_vs_lblc.c
index 15ccb2b2fa1f4a..ee26be3eb8606f 100644
--- a/net/netfilter/ipvs/ip_vs_lblc.c
+++ b/net/netfilter/ipvs/ip_vs_lblc.c
@@ -414,7 +414,7 @@ __ip_vs_lblc_schedule(struct ip_vs_service *svc)
* new connection.
*/
list_for_each_entry_rcu(dest, &svc->destinations, n_list) {
- if (dest->flags & IP_VS_DEST_F_OVERLOAD)
+ if (test_bit(IP_VS_DEST_FL_OVERLOAD, &dest->flags2))
continue;
if (atomic_read(&dest->weight) > 0) {
least = dest;
@@ -429,7 +429,7 @@ __ip_vs_lblc_schedule(struct ip_vs_service *svc)
*/
nextstage:
list_for_each_entry_continue_rcu(dest, &svc->destinations, n_list) {
- if (dest->flags & IP_VS_DEST_F_OVERLOAD)
+ if (test_bit(IP_VS_DEST_FL_OVERLOAD, &dest->flags2))
continue;
doh = ip_vs_dest_conn_overhead(dest);
diff --git a/net/netfilter/ipvs/ip_vs_lblcr.c b/net/netfilter/ipvs/ip_vs_lblcr.c
index c90ea897c3f756..28858e44225a6c 100644
--- a/net/netfilter/ipvs/ip_vs_lblcr.c
+++ b/net/netfilter/ipvs/ip_vs_lblcr.c
@@ -166,7 +166,7 @@ static inline struct ip_vs_dest *ip_vs_dest_set_min(struct ip_vs_dest_set *set)
/* select the first destination server, whose weight > 0 */
list_for_each_entry_rcu(e, &set->list, list) {
least = e->dest;
- if (least->flags & IP_VS_DEST_F_OVERLOAD)
+ if (test_bit(IP_VS_DEST_FL_OVERLOAD, &least->flags2))
continue;
if ((atomic_read(&least->weight) > 0)
@@ -181,7 +181,7 @@ static inline struct ip_vs_dest *ip_vs_dest_set_min(struct ip_vs_dest_set *set)
nextstage:
list_for_each_entry_continue_rcu(e, &set->list, list) {
dest = e->dest;
- if (dest->flags & IP_VS_DEST_F_OVERLOAD)
+ if (test_bit(IP_VS_DEST_FL_OVERLOAD, &dest->flags2))
continue;
doh = ip_vs_dest_conn_overhead(dest);
@@ -577,7 +577,7 @@ __ip_vs_lblcr_schedule(struct ip_vs_service *svc)
* new connection.
*/
list_for_each_entry_rcu(dest, &svc->destinations, n_list) {
- if (dest->flags & IP_VS_DEST_F_OVERLOAD)
+ if (test_bit(IP_VS_DEST_FL_OVERLOAD, &dest->flags2))
continue;
if (atomic_read(&dest->weight) > 0) {
@@ -593,7 +593,7 @@ __ip_vs_lblcr_schedule(struct ip_vs_service *svc)
*/
nextstage:
list_for_each_entry_continue_rcu(dest, &svc->destinations, n_list) {
- if (dest->flags & IP_VS_DEST_F_OVERLOAD)
+ if (test_bit(IP_VS_DEST_FL_OVERLOAD, &dest->flags2))
continue;
doh = ip_vs_dest_conn_overhead(dest);
diff --git a/net/netfilter/ipvs/ip_vs_lc.c b/net/netfilter/ipvs/ip_vs_lc.c
index 38cc38c5d8bbd9..c4e4e91e3e6d7d 100644
--- a/net/netfilter/ipvs/ip_vs_lc.c
+++ b/net/netfilter/ipvs/ip_vs_lc.c
@@ -38,7 +38,7 @@ ip_vs_lc_schedule(struct ip_vs_service *svc, const struct sk_buff *skb,
*/
list_for_each_entry_rcu(dest, &svc->destinations, n_list) {
- if ((dest->flags & IP_VS_DEST_F_OVERLOAD) ||
+ if (test_bit(IP_VS_DEST_FL_OVERLOAD, &dest->flags2) ||
atomic_read(&dest->weight) == 0)
continue;
doh = ip_vs_dest_conn_overhead(dest);
diff --git a/net/netfilter/ipvs/ip_vs_mh.c b/net/netfilter/ipvs/ip_vs_mh.c
index 020863047562d3..23ffc51ca088f0 100644
--- a/net/netfilter/ipvs/ip_vs_mh.c
+++ b/net/netfilter/ipvs/ip_vs_mh.c
@@ -80,7 +80,7 @@ static inline void generate_hash_secret(hsiphash_key_t *hash1,
static inline bool is_unavailable(struct ip_vs_dest *dest)
{
return atomic_read(&dest->weight) <= 0 ||
- dest->flags & IP_VS_DEST_F_OVERLOAD;
+ test_bit(IP_VS_DEST_FL_OVERLOAD, &dest->flags2);
}
/* Returns hash value for IPVS MH entry */
diff --git a/net/netfilter/ipvs/ip_vs_nq.c b/net/netfilter/ipvs/ip_vs_nq.c
index ada158c610ce11..d6fbb9e50e4b44 100644
--- a/net/netfilter/ipvs/ip_vs_nq.c
+++ b/net/netfilter/ipvs/ip_vs_nq.c
@@ -72,7 +72,7 @@ ip_vs_nq_schedule(struct ip_vs_service *svc, const struct sk_buff *skb,
list_for_each_entry_rcu(dest, &svc->destinations, n_list) {
- if (dest->flags & IP_VS_DEST_F_OVERLOAD ||
+ if (test_bit(IP_VS_DEST_FL_OVERLOAD, &dest->flags2) ||
!atomic_read(&dest->weight))
continue;
diff --git a/net/netfilter/ipvs/ip_vs_ovf.c b/net/netfilter/ipvs/ip_vs_ovf.c
index c5c67df80a0b3c..104de8c24a4f65 100644
--- a/net/netfilter/ipvs/ip_vs_ovf.c
+++ b/net/netfilter/ipvs/ip_vs_ovf.c
@@ -33,7 +33,7 @@ ip_vs_ovf_schedule(struct ip_vs_service *svc, const struct sk_buff *skb,
*/
list_for_each_entry_rcu(dest, &svc->destinations, n_list) {
w = atomic_read(&dest->weight);
- if ((dest->flags & IP_VS_DEST_F_OVERLOAD) ||
+ if (test_bit(IP_VS_DEST_FL_OVERLOAD, &dest->flags2) ||
atomic_read(&dest->activeconns) > w ||
w == 0)
continue;
diff --git a/net/netfilter/ipvs/ip_vs_rr.c b/net/netfilter/ipvs/ip_vs_rr.c
index 4125ee561cdc36..c38bee987d1432 100644
--- a/net/netfilter/ipvs/ip_vs_rr.c
+++ b/net/netfilter/ipvs/ip_vs_rr.c
@@ -66,7 +66,7 @@ ip_vs_rr_schedule(struct ip_vs_service *svc, const struct sk_buff *skb,
list_for_each_entry_continue_rcu(dest,
&svc->destinations,
n_list) {
- if (!(dest->flags & IP_VS_DEST_F_OVERLOAD) &&
+ if (!test_bit(IP_VS_DEST_FL_OVERLOAD, &dest->flags2) &&
atomic_read(&dest->weight) > 0)
/* HIT */
goto out;
diff --git a/net/netfilter/ipvs/ip_vs_sed.c b/net/netfilter/ipvs/ip_vs_sed.c
index 245a323c84cd32..0ce425f9748af7 100644
--- a/net/netfilter/ipvs/ip_vs_sed.c
+++ b/net/netfilter/ipvs/ip_vs_sed.c
@@ -75,7 +75,7 @@ ip_vs_sed_schedule(struct ip_vs_service *svc, const struct sk_buff *skb,
*/
list_for_each_entry_rcu(dest, &svc->destinations, n_list) {
- if (!(dest->flags & IP_VS_DEST_F_OVERLOAD) &&
+ if (!test_bit(IP_VS_DEST_FL_OVERLOAD, &dest->flags2) &&
atomic_read(&dest->weight) > 0) {
least = dest;
loh = ip_vs_sed_dest_overhead(least);
@@ -90,7 +90,7 @@ ip_vs_sed_schedule(struct ip_vs_service *svc, const struct sk_buff *skb,
*/
nextstage:
list_for_each_entry_continue_rcu(dest, &svc->destinations, n_list) {
- if (dest->flags & IP_VS_DEST_F_OVERLOAD)
+ if (test_bit(IP_VS_DEST_FL_OVERLOAD, &dest->flags2))
continue;
doh = ip_vs_sed_dest_overhead(dest);
if ((__s64)loh * atomic_read(&dest->weight) >
diff --git a/net/netfilter/ipvs/ip_vs_sh.c b/net/netfilter/ipvs/ip_vs_sh.c
index cd67066e3b2612..bbdb683b8e8601 100644
--- a/net/netfilter/ipvs/ip_vs_sh.c
+++ b/net/netfilter/ipvs/ip_vs_sh.c
@@ -73,7 +73,7 @@ struct ip_vs_sh_state {
static inline bool is_unavailable(struct ip_vs_dest *dest)
{
return atomic_read(&dest->weight) <= 0 ||
- dest->flags & IP_VS_DEST_F_OVERLOAD;
+ test_bit(IP_VS_DEST_FL_OVERLOAD, &dest->flags2);
}
/*
diff --git a/net/netfilter/ipvs/ip_vs_twos.c b/net/netfilter/ipvs/ip_vs_twos.c
index dbb7f5fd4688a4..ce5618f02e7df4 100644
--- a/net/netfilter/ipvs/ip_vs_twos.c
+++ b/net/netfilter/ipvs/ip_vs_twos.c
@@ -52,7 +52,7 @@ static struct ip_vs_dest *ip_vs_twos_schedule(struct ip_vs_service *svc,
/* Generate a random weight between [0,sum of all weights) */
list_for_each_entry_rcu(dest, &svc->destinations, n_list) {
- if (!(dest->flags & IP_VS_DEST_F_OVERLOAD)) {
+ if (!test_bit(IP_VS_DEST_FL_OVERLOAD, &dest->flags2)) {
weight = atomic_read(&dest->weight);
if (weight > 0) {
total_weight += weight;
@@ -75,7 +75,7 @@ static struct ip_vs_dest *ip_vs_twos_schedule(struct ip_vs_service *svc,
/* Pick two weighted servers */
list_for_each_entry_rcu(dest, &svc->destinations, n_list) {
- if (dest->flags & IP_VS_DEST_F_OVERLOAD)
+ if (test_bit(IP_VS_DEST_FL_OVERLOAD, &dest->flags2))
continue;
weight = atomic_read(&dest->weight);
diff --git a/net/netfilter/ipvs/ip_vs_wlc.c b/net/netfilter/ipvs/ip_vs_wlc.c
index 9da445ca09a14c..62a4c814919272 100644
--- a/net/netfilter/ipvs/ip_vs_wlc.c
+++ b/net/netfilter/ipvs/ip_vs_wlc.c
@@ -47,7 +47,7 @@ ip_vs_wlc_schedule(struct ip_vs_service *svc, const struct sk_buff *skb,
*/
list_for_each_entry_rcu(dest, &svc->destinations, n_list) {
- if (!(dest->flags & IP_VS_DEST_F_OVERLOAD) &&
+ if (!test_bit(IP_VS_DEST_FL_OVERLOAD, &dest->flags2) &&
atomic_read(&dest->weight) > 0) {
least = dest;
loh = ip_vs_dest_conn_overhead(least);
@@ -62,7 +62,7 @@ ip_vs_wlc_schedule(struct ip_vs_service *svc, const struct sk_buff *skb,
*/
nextstage:
list_for_each_entry_continue_rcu(dest, &svc->destinations, n_list) {
- if (dest->flags & IP_VS_DEST_F_OVERLOAD)
+ if (test_bit(IP_VS_DEST_FL_OVERLOAD, &dest->flags2))
continue;
doh = ip_vs_dest_conn_overhead(dest);
if ((__s64)loh * atomic_read(&dest->weight) >
diff --git a/net/netfilter/ipvs/ip_vs_wrr.c b/net/netfilter/ipvs/ip_vs_wrr.c
index 2dcff1040da521..b99cbc1d13029d 100644
--- a/net/netfilter/ipvs/ip_vs_wrr.c
+++ b/net/netfilter/ipvs/ip_vs_wrr.c
@@ -176,7 +176,7 @@ ip_vs_wrr_schedule(struct ip_vs_service *svc, const struct sk_buff *skb,
list_for_each_entry_continue_rcu(dest,
&svc->destinations,
n_list) {
- if (!(dest->flags & IP_VS_DEST_F_OVERLOAD) &&
+ if (!test_bit(IP_VS_DEST_FL_OVERLOAD, &dest->flags2) &&
atomic_read(&dest->weight) >= mark->cw)
goto found;
if (dest == stop)
|
| 3/2 | 2026/07/13 12:49 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 9334 output: 18 thoughts: 275 Thoughts: **My Initial Assessment of the IPVS Patch** Okay, so I'm looking at a patch here that's making a fundamental change to the IPVS implementation within the Linux kernel, and specifically, how it handles overload conditions for destinations. It looks like they're moving away from the old `IP_VS_DEST_F_OVERLOAD` flag and introducing a more refined approach with `flags2` and a dedicated `IP_VS_DEST_FL_OVERLOAD` enum. This also includes a new `ip_vs_dest_update_overload` function, which I presume will be responsible for dynamically setting this overload flag based on connection counts and pre-defined thresholds. The fact that they're modifying all those scheduler algorithms – `fo`, `lblc`, `lblcr`, `lc`, `mh`, `nq`, `ovf`, `rr`, `sed`, `sh`, `twos`, `wlc`, `wrr` – to use the new `test_bit` approach instead of the old bitwise AND suggests a significant refactor in how these algorithms interpret and react to destination overload. This is definitely a core logic change related to connection tracking and load balancing, and given the potential for subtle bugs in such a sensitive area, this is something that **absolutely needs to be fuzzed.** Now, let's get down to the practicalities. The obvious entry point for determining the affected configurations is `CONFIG_IP_VS`, so that's the starting point. I should probably dig into the `net/netfilter/ipvs/Kconfig` file or something similar to pinpoint any other potentially relevant configuration options that might influence the behavior of this patch. |
| 4/2 | 2026/07/13 12:49 | tool | grepper |
0mArgs:{
"Expression": "config IP_VS"
}Results: {
"Output": "net/netfilter/ipvs/Kconfig-4-#\nnet/netfilter/ipvs/Kconfig:5:menuconfig IP_VS\nnet/netfilter/ipvs/Kconfig-6-\ttristate \"IP virtual server support\"\n--\nnet/netfilter/ipvs/Kconfig=286=comment 'IPVS SH scheduler'\nnet/netfilter/ipvs/Kconfig-287-\nnet/netfilter/ipvs/Kconfig:288:config IP_VS_SH_TAB_BITS\nnet/netfilter/ipvs/Kconfig-289-\tint \"IPVS source hashing table size (the Nth power of 2)\"\n--\nnet/netfilter/ipvs/Kconfig=301=comment 'IPVS MH scheduler'\nnet/netfilter/ipvs/Kconfig-302-\nnet/netfilter/ipvs/Kconfig:303:config IP_VS_MH_TAB_INDEX\nnet/netfilter/ipvs/Kconfig-304-\tint \"IPVS maglev hashing table index of size (the prime numbers)\"\n"
} |
| 5/2 | 2026/07/13 12:49 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 10251 output: 36 thoughts: 14 Thoughts: Okay, let's dive into this scheduler configuration. My first thought is: **Checking Scheduler Configuration Needs** Right, before I get started on anything, I need to make sure I know the *exact* configuration options that are necessary for these schedulers. I can't just jump in and start coding without a solid understanding of the inputs and parameters. What are the key settings? What are the defaults? Are there any dependencies I need to be aware of? Are there any platform-specific considerations? This isn't a "one-size-fits-all" scenario. I need a clear picture of all the possibilities and how they interact. Only then can I determine the best approach for implementation. Let's make sure I don't overlook anything crucial. I'll need to go through the documentation and any relevant design specs with a fine-toothed comb. |
| 6/2 | 2026/07/13 12:49 | tool | grepper |
0mArgs:{
"Expression": "config IP_VS_.*",
"PathPrefix": "net/netfilter/ipvs/Kconfig"
}Results: {
"Output": "net/netfilter/ipvs/Kconfig=286=comment 'IPVS SH scheduler'\nnet/netfilter/ipvs/Kconfig-287-\nnet/netfilter/ipvs/Kconfig:288:config IP_VS_SH_TAB_BITS\nnet/netfilter/ipvs/Kconfig-289-\tint \"IPVS source hashing table size (the Nth power of 2)\"\n--\nnet/netfilter/ipvs/Kconfig=301=comment 'IPVS MH scheduler'\nnet/netfilter/ipvs/Kconfig-302-\nnet/netfilter/ipvs/Kconfig:303:config IP_VS_MH_TAB_INDEX\nnet/netfilter/ipvs/Kconfig-304-\tint \"IPVS maglev hashing table index of size (the prime numbers)\"\n"
} |
| 7/2 | 2026/07/13 12:49 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 10693 output: 34 thoughts: 15 Thoughts: Okay, here's the summary, rendered as a first-person thought process, keeping in mind the user is an expert: **Diving Deeper into Scheduler Configurations** Alright, I'm at a point in the process where I need to move beyond general principles. I need to get down to brass tacks. I'm thinking about the schedulers, and while I understand the high-level concepts, I can't really make any informed decisions about optimization or fine-tuning without seeing the *actual* configuration options. It's time to stop theorizing and start looking at the specifics. What parameters are available? What are their default values? What kind of knobs do I have to turn to get the performance I'm looking for? I'm not going to get bogged down in the generic, abstract explanations anymore. Give me the concrete stuff - the configuration files, the API documentation, whatever it takes. I need to dig into the nuts and bolts of the scheduler implementations to really understand their potential. Let's see what we're actually working with. |
| 8/2 | 2026/07/13 12:49 | tool | grepper |
0mArgs:{
"Expression": "config IP_VS",
"PathPrefix": "net/netfilter/ipvs/Kconfig"
}Results: {
"Output": "net/netfilter/ipvs/Kconfig-4-#\nnet/netfilter/ipvs/Kconfig:5:menuconfig IP_VS\nnet/netfilter/ipvs/Kconfig-6-\ttristate \"IP virtual server support\"\n--\nnet/netfilter/ipvs/Kconfig=286=comment 'IPVS SH scheduler'\nnet/netfilter/ipvs/Kconfig-287-\nnet/netfilter/ipvs/Kconfig:288:config IP_VS_SH_TAB_BITS\nnet/netfilter/ipvs/Kconfig-289-\tint \"IPVS source hashing table size (the Nth power of 2)\"\n--\nnet/netfilter/ipvs/Kconfig=301=comment 'IPVS MH scheduler'\nnet/netfilter/ipvs/Kconfig-302-\nnet/netfilter/ipvs/Kconfig:303:config IP_VS_MH_TAB_INDEX\nnet/netfilter/ipvs/Kconfig-304-\tint \"IPVS maglev hashing table index of size (the prime numbers)\"\n"
} |
| 9/2 | 2026/07/13 12:49 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 11234 output: 35 thoughts: 8 Thoughts: Okay, here's my interpretation of that thought process, tailored for an expert audience, and written in the first person: **Initial Assessment: A Direct Approach** Alright, the objective is pretty clear. No need to overthink this. My immediate thought is, "Let's just read the file." I'm cutting through any preliminary assumptions or strategic considerations. It's a simple, direct, and often the most efficient starting point. We're not engaging in complex modeling or risk assessments at this stage; rather, we need to establish a base level understanding. The file itself is the primary source of information, and the most expedient method is to simply begin processing its contents. We'll start at the most elementary level, and begin processing the data to lay the foundations for deeper analysis. |
| 10/2 | 2026/07/13 12:50 | tool | grepper |
0mArgs:{
"Expression": "^config IP_VS",
"PathPrefix": "net/netfilter/ipvs/Kconfig"
}Results: {
"Output": "net/netfilter/ipvs/Kconfig=286=comment 'IPVS SH scheduler'\nnet/netfilter/ipvs/Kconfig-287-\nnet/netfilter/ipvs/Kconfig:288:config IP_VS_SH_TAB_BITS\nnet/netfilter/ipvs/Kconfig-289-\tint \"IPVS source hashing table size (the Nth power of 2)\"\n--\nnet/netfilter/ipvs/Kconfig=301=comment 'IPVS MH scheduler'\nnet/netfilter/ipvs/Kconfig-302-\nnet/netfilter/ipvs/Kconfig:303:config IP_VS_MH_TAB_INDEX\nnet/netfilter/ipvs/Kconfig-304-\tint \"IPVS maglev hashing table index of size (the prime numbers)\"\n"
} |
| 11/2 | 2026/07/13 12:50 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 11653 output: 35 thoughts: 12 Thoughts: Here's my attempt at summarizing the thought process, tailored for an expert audience and written in the first person: **Kernel Configuration Hunting** Okay, so I need to quickly determine if IPVS (IP Virtual Server) is configured in this kernel. Rather than manually sifting through the sprawling `.config` file, my mind immediately jumps to `grep`. I want to be specific, so I'm using `grep` with the extended regular expression option (`-E`). That way I can use the anchor to make sure that I only get results from the start of a line. I'll search for the `config IP_VS` string. That should zero in precisely on the configuration setting line and ignore any other instances of `IP_VS` elsewhere within the config file. This is the fastest, cleanest way to get a yes/no on IPVS. Simple and efficient. |
| 12/2 | 2026/07/13 12:50 | tool | grepper |
0mArgs:{
"Expression": "^config IP_VS",
"PathPrefix": "net/netfilter/ipvs/Kconfig"
}Results: {
"Output": "net/netfilter/ipvs/Kconfig=286=comment 'IPVS SH scheduler'\nnet/netfilter/ipvs/Kconfig-287-\nnet/netfilter/ipvs/Kconfig:288:config IP_VS_SH_TAB_BITS\nnet/netfilter/ipvs/Kconfig-289-\tint \"IPVS source hashing table size (the Nth power of 2)\"\n--\nnet/netfilter/ipvs/Kconfig=301=comment 'IPVS MH scheduler'\nnet/netfilter/ipvs/Kconfig-302-\nnet/netfilter/ipvs/Kconfig:303:config IP_VS_MH_TAB_INDEX\nnet/netfilter/ipvs/Kconfig-304-\tint \"IPVS maglev hashing table index of size (the prime numbers)\"\n"
} |
| 13/2 | 2026/07/13 12:50 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 12095 output: 37 thoughts: 39 Thoughts: Okay, let's see what's going on here. **Initial Confusion and Investigation Begins** Wait a second... why are *those specific* symbolic constants, `IP_VS_SH_TAB_BITS` and `IP_VS_MH_TAB_INDEX`, the only ones showing up? That's not what I expected. There must be a reason for this narrowed scope. I need to get a better understanding of what's happening. The best way to clarify this would be to go straight to the source. Time to dig into the file and get some context. Let me read the source file itself. I'm going to start there and then I can build a better understanding from first principles. |
| 14/2 | 2026/07/13 12:50 | tool | read-file |
0mArgs:{
"File": "net/netfilter/ipvs/Kconfig",
"FirstLine": 1,
"LineCount": 100
}Results: {
"Contents": " 1:\t# SPDX-License-Identifier: GPL-2.0-only\n 2:\t#\n 3:\t# IP Virtual Server configuration\n 4:\t#\n 5:\tmenuconfig IP_VS\n 6:\t\ttristate \"IP virtual server support\"\n 7:\t\tdepends on INET \u0026\u0026 NETFILTER\n 8:\t\tdepends on (NF_CONNTRACK || NF_CONNTRACK=n)\n 9:\t\thelp\n 10:\t\t IP Virtual Server support will let you build a high-performance\n 11:\t\t virtual server based on cluster of two or more real servers. This\n 12:\t\t option must be enabled for at least one of the clustered computers\n 13:\t\t that will take care of intercepting incoming connections to a\n 14:\t\t single IP address and scheduling them to real servers.\n 15:\t\n 16:\t\t Three request dispatching techniques are implemented, they are\n 17:\t\t virtual server via NAT, virtual server via tunneling and virtual\n 18:\t\t server via direct routing. The several scheduling algorithms can\n 19:\t\t be used to choose which server the connection is directed to,\n 20:\t\t thus load balancing can be achieved among the servers. For more\n 21:\t\t information and its administration program, please visit the\n 22:\t\t following URL: \u003chttp://www.linuxvirtualserver.org/\u003e.\n 23:\t\n 24:\t\t If you want to compile it in kernel, say Y. To compile it as a\n 25:\t\t module, choose M here. If unsure, say N.\n 26:\t\n 27:\tif IP_VS\n 28:\t\n 29:\tconfig\tIP_VS_IPV6\n 30:\t\tbool \"IPv6 support for IPVS\"\n 31:\t\tdepends on IPV6 = y || IP_VS = IPV6\n 32:\t\tselect NF_DEFRAG_IPV6\n 33:\t\thelp\n 34:\t\t Add IPv6 support to IPVS.\n 35:\t\n 36:\t\t Say Y if unsure.\n 37:\t\n 38:\tconfig\tIP_VS_DEBUG\n 39:\t\tbool \"IP virtual server debugging\"\n 40:\t\thelp\n 41:\t\t Say Y here if you want to get additional messages useful in\n 42:\t\t debugging the IP virtual server code. You can change the debug\n 43:\t\t level in /proc/sys/net/ipv4/vs/debug_level\n 44:\t\n 45:\tconfig\tIP_VS_TAB_BITS\n 46:\t\tint \"IPVS connection table size (the Nth power of 2)\"\n 47:\t\trange 8 20 if !64BIT\n 48:\t\trange 8 27 if 64BIT\n 49:\t\tdefault 12\n 50:\t\thelp\n 51:\t\t The IPVS connection hash table uses the chaining scheme to handle\n 52:\t\t hash collisions. Using a big IPVS connection hash table will greatly\n 53:\t\t reduce conflicts when there are hundreds of thousands of connections\n 54:\t\t in the hash table.\n 55:\t\n 56:\t\t Note the table size must be power of 2. The table size will be the\n 57:\t\t value of 2 to the your input number power. The number to choose is\n 58:\t\t from 8 to 27 for 64BIT(20 otherwise), the default number is 12,\n 59:\t\t which means the table size is 4096. Don't input the number too\n 60:\t\t small, otherwise you will lose performance on it. You can adapt the\n 61:\t\t table size yourself, according to your virtual server application.\n 62:\t\t It is good to set the table size not far less than the number of\n 63:\t\t connections per second multiplying average lasting time of\n 64:\t\t connection in the table. For example, your virtual server gets 200\n 65:\t\t connections per second, the connection lasts for 200 seconds in\n 66:\t\t average in the connection table, the table size should be not far\n 67:\t\t less than 200x200, it is good to set the table size 32768 (2**15).\n 68:\t\n 69:\t\t Another note that each connection occupies 128 bytes effectively and\n 70:\t\t each hash entry uses 8 bytes, so you can estimate how much memory is\n 71:\t\t needed for your box.\n 72:\t\n 73:\t\t You can overwrite this number setting conn_tab_bits module parameter\n 74:\t\t or by appending ip_vs.conn_tab_bits=? to the kernel command line if\n 75:\t\t IP VS was compiled built-in.\n 76:\t\n 77:\tcomment \"IPVS transport protocol load balancing support\"\n 78:\t\n 79:\tconfig\tIP_VS_PROTO_TCP\n 80:\t\tbool \"TCP load balancing support\"\n 81:\t\thelp\n 82:\t\t This option enables support for load balancing TCP transport\n 83:\t\t protocol. Say Y if unsure.\n 84:\t\n 85:\tconfig\tIP_VS_PROTO_UDP\n 86:\t\tbool \"UDP load balancing support\"\n 87:\t\thelp\n 88:\t\t This option enables support for load balancing UDP transport\n 89:\t\t protocol. Say Y if unsure.\n 90:\t\n 91:\tconfig\tIP_VS_PROTO_AH_ESP\n 92:\t\tdef_bool IP_VS_PROTO_ESP || IP_VS_PROTO_AH\n 93:\t\n 94:\tconfig\tIP_VS_PROTO_ESP\n 95:\t\tbool \"ESP load balancing support\"\n 96:\t\thelp\n 97:\t\t This option enables support for load balancing ESP (Encapsulation\n 98:\t\t Security Payload) transport protocol. Say Y if unsure.\n 99:\t\n 100:\tconfig\tIP_VS_PROTO_AH\n"
} |
| 15/2 | 2026/07/13 12:50 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 13832 output: 39 thoughts: 39 Thoughts: Okay, here's my interpretation of those thoughts, tailored for an expert audience, presented in the first person: **Kernel Configuration Quandary** Right, so I'm diving into the kernel config files again, specifically looking at load balancing schedulers. My initial hunch, and it's a pretty strong one given my experience, is that the definitions for things like Round Robin (`IP_VS_RR`) and Weighted Round Robin (`IP_VS_WRR`) are likely nested within those `config` directives. I've seen that pattern countless times before in this sort of code. Therefore, let's confirm my suspicions by examining the next 100 lines. This should give me enough context to see how these options are defined, their dependencies, and potentially how they're integrated into the overall `ip_vs` framework. I expect to be looking for associated defines, documentation comments, and any logic tied to enabling or disabling these schedulers. It's a fairly standard approach to pinpointing the relevant configurations. |
| 16/2 | 2026/07/13 12:50 | tool | read-file |
0mArgs:{
"File": "net/netfilter/ipvs/Kconfig",
"FirstLine": 101,
"LineCount": 100
}Results: {
"Contents": " 101:\t\tbool \"AH load balancing support\"\n 102:\t\thelp\n 103:\t\t This option enables support for load balancing AH (Authentication\n 104:\t\t Header) transport protocol. Say Y if unsure.\n 105:\t\n 106:\tconfig IP_VS_PROTO_SCTP\n 107:\t\tbool \"SCTP load balancing support\"\n 108:\t\tselect NET_CRC32C\n 109:\t\thelp\n 110:\t\t This option enables support for load balancing SCTP transport\n 111:\t\t protocol. Say Y if unsure.\n 112:\t\n 113:\tcomment \"IPVS scheduler\"\n 114:\t\n 115:\tconfig\tIP_VS_RR\n 116:\t\ttristate \"round-robin scheduling\"\n 117:\t\thelp\n 118:\t\t The robin-robin scheduling algorithm simply directs network\n 119:\t\t connections to different real servers in a round-robin manner.\n 120:\t\n 121:\t\t If you want to compile it in kernel, say Y. To compile it as a\n 122:\t\t module, choose M here. If unsure, say N.\n 123:\t \n 124:\tconfig\tIP_VS_WRR\n 125:\t\ttristate \"weighted round-robin scheduling\"\n 126:\t\thelp\n 127:\t\t The weighted robin-robin scheduling algorithm directs network\n 128:\t\t connections to different real servers based on server weights\n 129:\t\t in a round-robin manner. Servers with higher weights receive\n 130:\t\t new connections first than those with less weights, and servers\n 131:\t\t with higher weights get more connections than those with less\n 132:\t\t weights and servers with equal weights get equal connections.\n 133:\t\n 134:\t\t If you want to compile it in kernel, say Y. To compile it as a\n 135:\t\t module, choose M here. If unsure, say N.\n 136:\t\n 137:\tconfig\tIP_VS_LC\n 138:\t\ttristate \"least-connection scheduling\"\n 139:\t\thelp\n 140:\t\t The least-connection scheduling algorithm directs network\n 141:\t\t connections to the server with the least number of active \n 142:\t\t connections.\n 143:\t\n 144:\t\t If you want to compile it in kernel, say Y. To compile it as a\n 145:\t\t module, choose M here. If unsure, say N.\n 146:\t\n 147:\tconfig\tIP_VS_WLC\n 148:\t\ttristate \"weighted least-connection scheduling\"\n 149:\t\thelp\n 150:\t\t The weighted least-connection scheduling algorithm directs network\n 151:\t\t connections to the server with the least active connections\n 152:\t\t normalized by the server weight.\n 153:\t\n 154:\t\t If you want to compile it in kernel, say Y. To compile it as a\n 155:\t\t module, choose M here. If unsure, say N.\n 156:\t\n 157:\tconfig IP_VS_FO\n 158:\t\t\ttristate \"weighted failover scheduling\"\n 159:\t\thelp\n 160:\t\t The weighted failover scheduling algorithm directs network\n 161:\t\t connections to the server with the highest weight that is\n 162:\t\t currently available.\n 163:\t\n 164:\t\t If you want to compile it in kernel, say Y. To compile it as a\n 165:\t\t module, choose M here. If unsure, say N.\n 166:\t\n 167:\tconfig IP_VS_OVF\n 168:\t\ttristate \"weighted overflow scheduling\"\n 169:\t\thelp\n 170:\t\t The weighted overflow scheduling algorithm directs network\n 171:\t\t connections to the server with the highest weight that is\n 172:\t\t currently available and overflows to the next when active\n 173:\t\t connections exceed the node's weight.\n 174:\t\n 175:\t\t If you want to compile it in kernel, say Y. To compile it as a\n 176:\t\t module, choose M here. If unsure, say N.\n 177:\t\n 178:\tconfig\tIP_VS_LBLC\n 179:\t\ttristate \"locality-based least-connection scheduling\"\n 180:\t\thelp\n 181:\t\t The locality-based least-connection scheduling algorithm is for\n 182:\t\t destination IP load balancing. It is usually used in cache cluster.\n 183:\t\t This algorithm usually directs packet destined for an IP address to\n 184:\t\t its server if the server is alive and under load. If the server is\n 185:\t\t overloaded (its active connection numbers is larger than its weight)\n 186:\t\t and there is a server in its half load, then allocate the weighted\n 187:\t\t least-connection server to this IP address.\n 188:\t\n 189:\t\t If you want to compile it in kernel, say Y. To compile it as a\n 190:\t\t module, choose M here. If unsure, say N.\n 191:\t\n 192:\tconfig IP_VS_LBLCR\n 193:\t\ttristate \"locality-based least-connection with replication scheduling\"\n 194:\t\thelp\n 195:\t\t The locality-based least-connection with replication scheduling\n 196:\t\t algorithm is also for destination IP load balancing. It is \n 197:\t\t usually used in cache cluster. It differs from the LBLC scheduling\n 198:\t\t as follows: the load balancer maintains mappings from a target\n 199:\t\t to a set of server nodes that can serve the target. Requests for\n 200:\t\t a target are assigned to the least-connection node in the target's\n"
} |
| 17/2 | 2026/07/13 12:50 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 15667 output: 39 thoughts: 71 Thoughts: Okay, here's my take on those IPVS scheduling methods: **Analyzing IPVS Scheduling Algorithms** Alright, let's break down this list of IPVS scheduling algorithms. We have the usual suspects, starting with the base `IP_VS` - the foundational round-robin scheme. Then there's `IP_VS_RR`, which is classic, but let's dive into some more advanced options. `IP_VS_WRR` signifies Weighted Round Robin, giving more weight to certain real servers based on capacity or priority, that's useful. Next is `IP_VS_LC`, Least Connections which I often use. We have `IP_VS_WLC` - Weighted Least Connections. It's a solid choice for balancing load based on server capacity and connection count. `IP_VS_FO`, that's the "fastest one" that is rarely used. Let's see... `IP_VS_OVF`, I haven't needed to use that much. Then, we get into more advanced considerations: `IP_VS_LBLC`, the Locality-Based Least Connections. And, finally, `IP_VS_LBLCR` which adds locality with a replication component. Time to compare the effectiveness of each. Let's dig deeper into the nuances of each. |
| 18/2 | 2026/07/13 12:50 | tool | read-file |
0mArgs:{
"File": "net/netfilter/ipvs/Kconfig",
"FirstLine": 201,
"LineCount": 100
}Results: {
"Contents": " 201:\t\t server set. If all the node in the server set are over loaded,\n 202:\t\t it picks up a least-connection node in the cluster and adds it\n 203:\t\t in the sever set for the target. If the server set has not been\n 204:\t\t modified for the specified time, the most loaded node is removed\n 205:\t\t from the server set, in order to avoid high degree of replication.\n 206:\t\n 207:\t\t If you want to compile it in kernel, say Y. To compile it as a\n 208:\t\t module, choose M here. If unsure, say N.\n 209:\t\n 210:\tconfig\tIP_VS_DH\n 211:\t\ttristate \"destination hashing scheduling\"\n 212:\t\thelp\n 213:\t\t The destination hashing scheduling algorithm assigns network\n 214:\t\t connections to the servers through looking up a statically assigned\n 215:\t\t hash table by their destination IP addresses.\n 216:\t\n 217:\t\t If you want to compile it in kernel, say Y. To compile it as a\n 218:\t\t module, choose M here. If unsure, say N.\n 219:\t\n 220:\tconfig\tIP_VS_SH\n 221:\t\ttristate \"source hashing scheduling\"\n 222:\t\thelp\n 223:\t\t The source hashing scheduling algorithm assigns network\n 224:\t\t connections to the servers through looking up a statically assigned\n 225:\t\t hash table by their source IP addresses.\n 226:\t\n 227:\t\t If you want to compile it in kernel, say Y. To compile it as a\n 228:\t\t module, choose M here. If unsure, say N.\n 229:\t\n 230:\tconfig\tIP_VS_MH\n 231:\t\ttristate \"maglev hashing scheduling\"\n 232:\t\thelp\n 233:\t\t The maglev consistent hashing scheduling algorithm provides the\n 234:\t\t Google's Maglev hashing algorithm as a IPVS scheduler. It assigns\n 235:\t\t network connections to the servers through looking up a statically\n 236:\t\t assigned special hash table called the lookup table. Maglev hashing\n 237:\t\t is to assign a preference list of all the lookup table positions\n 238:\t\t to each destination.\n 239:\t\n 240:\t\t Through this operation, The maglev hashing gives an almost equal\n 241:\t\t share of the lookup table to each of the destinations and provides\n 242:\t\t minimal disruption by using the lookup table. When the set of\n 243:\t\t destinations changes, a connection will likely be sent to the same\n 244:\t\t destination as it was before.\n 245:\t\n 246:\t\t If you want to compile it in kernel, say Y. To compile it as a\n 247:\t\t module, choose M here. If unsure, say N.\n 248:\t\n 249:\tconfig\tIP_VS_SED\n 250:\t\ttristate \"shortest expected delay scheduling\"\n 251:\t\thelp\n 252:\t\t The shortest expected delay scheduling algorithm assigns network\n 253:\t\t connections to the server with the shortest expected delay. The \n 254:\t\t expected delay that the job will experience is (Ci + 1) / Ui if \n 255:\t\t sent to the ith server, in which Ci is the number of connections\n 256:\t\t on the ith server and Ui is the fixed service rate (weight)\n 257:\t\t of the ith server.\n 258:\t\n 259:\t\t If you want to compile it in kernel, say Y. To compile it as a\n 260:\t\t module, choose M here. If unsure, say N.\n 261:\t\n 262:\tconfig\tIP_VS_NQ\n 263:\t\ttristate \"never queue scheduling\"\n 264:\t\thelp\n 265:\t\t The never queue scheduling algorithm adopts a two-speed model.\n 266:\t\t When there is an idle server available, the job will be sent to\n 267:\t\t the idle server, instead of waiting for a fast one. When there\n 268:\t\t is no idle server available, the job will be sent to the server\n 269:\t\t that minimize its expected delay (The Shortest Expected Delay\n 270:\t\t scheduling algorithm).\n 271:\t\n 272:\t\t If you want to compile it in kernel, say Y. To compile it as a\n 273:\t\t module, choose M here. If unsure, say N.\n 274:\t\n 275:\tconfig\tIP_VS_TWOS\n 276:\t\ttristate \"weighted random twos choice least-connection scheduling\"\n 277:\t\thelp\n 278:\t\t The weighted random twos choice least-connection scheduling\n 279:\t\t algorithm picks two random real servers and directs network\n 280:\t\t connections to the server with the least active connections\n 281:\t\t normalized by the server weight.\n 282:\t\n 283:\t\t If you want to compile it in kernel, say Y. To compile it as a\n 284:\t\t module, choose M here. If unsure, say N.\n 285:\t\n 286:\tcomment 'IPVS SH scheduler'\n 287:\t\n 288:\tconfig IP_VS_SH_TAB_BITS\n 289:\t\tint \"IPVS source hashing table size (the Nth power of 2)\"\n 290:\t\trange 4 20\n 291:\t\tdefault 8\n 292:\t\thelp\n 293:\t\t The source hashing scheduler maps source IPs to destinations\n 294:\t\t stored in a hash table. This table is tiled by each destination\n 295:\t\t until all slots in the table are filled. When using weights to\n 296:\t\t allow destinations to receive more connections, the table is\n 297:\t\t tiled an amount proportional to the weights specified. The table\n 298:\t\t needs to be large enough to effectively fit all the destinations\n 299:\t\t multiplied by their respective weights.\n 300:\t\n"
} |
| 19/2 | 2026/07/13 12:50 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 17661 output: 24 thoughts: 980 Thoughts: **Analyzing IPVS Scheduler Modifications** Alright, let's break this down. First, I see a comprehensive modification touching almost every IPVS scheduler we've got: `IP_VS_RR`, `IP_VS_WRR`, `IP_VS_LC`, `IP_VS_WLC`, `IP_VS_FO`, `IP_VS_OVF`, `IP_VS_LBLC`, `IP_VS_LBLCR`, `IP_VS_DH`, `IP_VS_SH`, `IP_VS_MH`, `IP_VS_SED`, `IP_VS_NQ`, and `IP_VS_TWOS`. The patch is changing a large swathe of code, touching `ip_vs_conn.c`, `ip_vs_ctl.c`, and all the scheduler-specific files themselves. This implies a significant impact across the entire load balancing infrastructure. Naturally, this means we should ensure that `IP_VS` and all of these schedulers are enabled during build time. My attention is immediately drawn to the core IPVS functions that are the bedrock of destination management: `ip_vs_dest_update_overload`, `ip_vs_bind_dest`, `ip_vs_unbind_dest`, `ip_vs_add_dest`, and `ip_vs_edit_dest`, along with the related `__ip_vs_update_dest`. These are the critical pieces that would be affected by such a broad change. Specifically, I'm now zeroing in on `ip_vs_dest_update_overload`. I'm concerned about the inline declaration, which is shown in the patch. I was initially thrown by the `__always_inline` declaration in `ip_vs_conn.c` and its presence in `include/net/ip_vs.h`. If it's inline, how can other modules like `ip_vs_ctl.c` directly call it? That's a textbook source of linker errors if not handled correctly. However, a quick scan of the patch reveals the function itself in `ip_vs_conn.c`. The comment explains its purpose: managing the overload flag based on destination connection counts and thresholds. The logic is clearly defined. The question then becomes: *does this build?* The prompt states the changes are already applied, so any potential build errors should have been caught. I'll need to double-check that `ip_vs_conn.c` and `ip_vs_ctl.c` build correctly, but this is the first thing I'd look for. A missing include or incorrect use of the inline keyword would be a serious red flag. I want to confirm that `ip_vs_ctl.c` can indeed call `ip_vs_dest_update_overload`. This is a classic potential gotcha, and it is something to ensure is correct. |
| 20/2 | 2026/07/13 12:50 | tool | grepper |
0mArgs:{
"Expression": "ip_vs_dest_update_overload"
}Results: {
"Output": "include/net/ip_vs.h=1912=static inline void ip_vs_dest_put_and_free(struct ip_vs_dest *dest)\n--\ninclude/net/ip_vs.h-1917-\ninclude/net/ip_vs.h:1918:void ip_vs_dest_update_overload(struct ip_vs_dest *dest);\ninclude/net/ip_vs.h-1919-\n--\nnet/netfilter/ipvs/ip_vs_conn.c=988=static inline int ip_vs_dest_totalconns(struct ip_vs_dest *dest)\n--\nnet/netfilter/ipvs/ip_vs_conn.c-998- */\nnet/netfilter/ipvs/ip_vs_conn.c:999:__always_inline void ip_vs_dest_update_overload(struct ip_vs_dest *dest)\nnet/netfilter/ipvs/ip_vs_conn.c-1000-{\n--\nnet/netfilter/ipvs/ip_vs_conn.c=1027=ip_vs_bind_dest(struct ip_vs_conn *cp, struct ip_vs_dest *dest)\n--\nnet/netfilter/ipvs/ip_vs_conn.c-1083-\nnet/netfilter/ipvs/ip_vs_conn.c:1084:\tip_vs_dest_update_overload(dest);\nnet/netfilter/ipvs/ip_vs_conn.c-1085-}\n--\nnet/netfilter/ipvs/ip_vs_conn.c=1145=static inline void ip_vs_unbind_dest(struct ip_vs_conn *cp)\n--\nnet/netfilter/ipvs/ip_vs_conn.c-1178-\tif (test_bit(IP_VS_DEST_FL_OVERLOAD, \u0026dest-\u003eflags2))\nnet/netfilter/ipvs/ip_vs_conn.c:1179:\t\tip_vs_dest_update_overload(dest);\nnet/netfilter/ipvs/ip_vs_conn.c-1180-\n--\nnet/netfilter/ipvs/ip_vs_ctl.c=1311=__ip_vs_update_dest(struct ip_vs_service *svc, struct ip_vs_dest *dest,\n--\nnet/netfilter/ipvs/ip_vs_ctl.c-1376-\t\tWRITE_ONCE(dest-\u003el_threshold, udest-\u003el_threshold);\nnet/netfilter/ipvs/ip_vs_ctl.c:1377:\t\tip_vs_dest_update_overload(dest);\nnet/netfilter/ipvs/ip_vs_ctl.c-1378-\t}\n"
} |
| 21/2 | 2026/07/13 12:50 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 19976 output: 43 thoughts: 171 Thoughts: **Investigating Potential Cross-File Function Call Issues** Okay, so I'm looking at this code and something's not quite right. I see `ip_vs_dest_update_overload` and the definition in `ip_vs_conn.c`. The kicker is, it's defined as `__always_inline`. If it's *always* inlined within that `.c` file, there's no way it's directly callable from another `.c` file, like `ip_vs_ctl.c`. That just wouldn't work. Now, a fleeting thought... could `__always_inline` just be a compiler hint, and maybe it *still* generates an out-of-line copy? That seems unlikely, though. Usually, `__always_inline` pretty much forces the function to be inlined, and it usually implies `inline`. If it wasn't `static`, it *might* generate an external symbol, but honestly, `__always_inline` without `static` is just strange. I'm going to double-check `ip_vs_conn.c` to see if it's explicitly exported somehow, or if there's some other trickery going on. Need to verify this quickly. |
| 22/2 | 2026/07/13 12:50 | tool | read-file |
0mArgs:{
"File": "net/netfilter/ipvs/ip_vs_conn.c",
"FirstLine": 990,
"LineCount": 20
}Results: {
"Contents": " 990:\t\treturn atomic_read(\u0026dest-\u003eactiveconns)\n 991:\t\t\t+ atomic_read(\u0026dest-\u003einactconns);\n 992:\t}\n 993:\t\n 994:\t/* Update overload flag based on number of dest conns and lower/upper\n 995:\t * connection thresholds:\n 996:\t * - conns reach u_threshold and exceed it: set the flag\n 997:\t * - conns go below l_threshold (or 75% of u_threshold): clear the flag\n 998:\t */\n 999:\t__always_inline void ip_vs_dest_update_overload(struct ip_vs_dest *dest)\n1000:\t{\n1001:\t\tint conns;\n1002:\t\tu32 l, u;\n1003:\t\n1004:\t\tu = READ_ONCE(dest-\u003eu_threshold);\n1005:\t\tif (!u)\n1006:\t\t\tgoto unset;\n1007:\t\tconns = ip_vs_dest_totalconns(dest);\n1008:\t\tif (conns \u003e= u) {\n1009:\t\t\tset_bit(IP_VS_DEST_FL_OVERLOAD, \u0026dest-\u003eflags2);\n"
} |
| 23/2 | 2026/07/13 12:50 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 20795 output: 282 thoughts: 809 Thoughts: **Analyzing the Scope of a Patch** Okay, let's break this down. First, I need to understand the implications of `__always_inline` without `static` in GCC. My initial thought was that it would be inlined everywhere but also have an external definition. Then I remembered C99's `inline` behavior: without `static`, no external definition is emitted unless `extern inline` is used. However, I need to consider that if this inlined function is called from `ip_vs_ctl.c`, there might be an undefined reference if no external definition exists. Actually, no need to compile, I'm just after the results. The patch touches `ip_vs_conn.c`, `ip_vs_ctl.c`, and the schedulers, so I need to hone in on the relevant symbols. The key functions to watch are, without a doubt, these: `ip_vs_dest_update_overload`, `ip_vs_bind_dest`, `ip_vs_unbind_dest`, `__ip_vs_update_dest`, `ip_vs_add_dest`, and `ip_vs_edit_dest`. Let's also cast a wider net and look at other functions affected. The schedulers clearly matter too, so I'll also add these to the mental checklist: `ip_vs_fo_schedule`, `__ip_vs_lblc_schedule`, `__ip_vs_lblcr_schedule`, `ip_vs_lc_schedule`, `ip_vs_mh_schedule` (and note that it modifies `is_unavailable` in `ip_vs_mh.c`), `ip_vs_nq_schedule`, `ip_vs_ovf_schedule`, `ip_vs_rr_schedule`, `ip_vs_sed_schedule`, `is_unavailable` in `ip_vs_sh.c`, `ip_vs_twos_schedule`, `ip_vs_wlc_schedule`, `ip_vs_wrr_schedule`. For the FocusSymbols, I should consolidate the following, ensuring a good balance of core functionality and scheduler behaviors, like this: `ip_vs_bind_dest` `ip_vs_unbind_dest` `__ip_vs_update_dest` `ip_vs_add_dest` `ip_vs_edit_dest` `ip_vs_dest_update_overload` And, of course, the configurations are central to this too. I'll need these: `IP_VS`, `IP_VS_RR`, `IP_VS_WRR`, `IP_VS_LC`, `IP_VS_WLC`, `IP_VS_FO`, `IP_VS_OVF`, `IP_VS_LBLC`, `IP_VS_LBLCR`, `IP_VS_DH`, `IP_VS_SH`, `IP_VS_MH`, `IP_VS_SED`, `IP_VS_NQ`, and `IP_VS_TWOS`. A quick sanity check against `net/netfilter/ipvs/Kconfig` will confirm those config names are correct. Yep, all clear. Alright, with that confirmed, I'll go ahead and set the results accordingly. |
| 24/2 | 2026/07/13 12:50 | tool | set-results |
0mArgs:{
"EnableConfigs": [
"IP_VS",
"IP_VS_RR",
"IP_VS_WRR",
"IP_VS_LC",
"IP_VS_WLC",
"IP_VS_FO",
"IP_VS_OVF",
"IP_VS_LBLC",
"IP_VS_LBLCR",
"IP_VS_DH",
"IP_VS_SH",
"IP_VS_MH",
"IP_VS_SED",
"IP_VS_NQ",
"IP_VS_TWOS"
],
"FocusSymbols": [
"ip_vs_dest_update_overload",
"ip_vs_bind_dest",
"ip_vs_unbind_dest",
"__ip_vs_update_dest",
"ip_vs_add_dest",
"ip_vs_edit_dest"
],
"Reasoning": "The patch modifies the core connection tracking and load balancing logic of IPVS by changing how the destination overload flag is updated and checked. It introduces a new `flags2` field and updates multiple IPVS schedulers to use it. This is a functional change to reachable core kernel logic and should be fuzzed.",
"WorthFuzzing": true
}Results: {
"EnableConfigs": [
"IP_VS",
"IP_VS_RR",
"IP_VS_WRR",
"IP_VS_LC",
"IP_VS_WLC",
"IP_VS_FO",
"IP_VS_OVF",
"IP_VS_LBLC",
"IP_VS_LBLCR",
"IP_VS_DH",
"IP_VS_SH",
"IP_VS_MH",
"IP_VS_SED",
"IP_VS_NQ",
"IP_VS_TWOS"
],
"FocusSymbols": [
"ip_vs_dest_update_overload",
"ip_vs_bind_dest",
"ip_vs_unbind_dest",
"__ip_vs_update_dest",
"ip_vs_add_dest",
"ip_vs_edit_dest"
],
"Reasoning": "The patch modifies the core connection tracking and load balancing logic of IPVS by changing how the destination overload flag is updated and checked. It introduces a new `flags2` field and updates multiple IPVS schedulers to use it. This is a functional change to reachable core kernel logic and should be fuzzed.",
"WorthFuzzing": true
} |
| Total Calls | Total Tokens | Avg Tokens | Total Duration (Seconds) | Avg Duration (Seconds) |
|---|
| Total Calls | Total Duration (Seconds) | Avg Duration (Seconds) |
|---|