Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/1.1/patches/2223628/?format=api
{ "id": 2223628, "url": "http://patchwork.ozlabs.org/api/1.1/patches/2223628/?format=api", "web_url": "http://patchwork.ozlabs.org/project/netfilter-devel/patch/20260415200216.79699-4-ja@ssi.bg/", "project": { "id": 26, "url": "http://patchwork.ozlabs.org/api/1.1/projects/26/?format=api", "name": "Netfilter Development", "link_name": "netfilter-devel", "list_id": "netfilter-devel.vger.kernel.org", "list_email": "netfilter-devel@vger.kernel.org", "web_url": null, "scm_url": null, "webscm_url": null }, "msgid": "<20260415200216.79699-4-ja@ssi.bg>", "date": "2026-04-15T20:02:16", "name": "[net,3/3] ipvs: fix the spin_lock usage for RT build", "commit_ref": null, "pull_url": null, "state": "changes-requested", "archived": false, "hash": "92ebfeb9706a75b0588b094bd843461dd7652326", "submitter": { "id": 2825, "url": "http://patchwork.ozlabs.org/api/1.1/people/2825/?format=api", "name": "Julian Anastasov", "email": "ja@ssi.bg" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/netfilter-devel/patch/20260415200216.79699-4-ja@ssi.bg/mbox/", "series": [ { "id": 500036, "url": "http://patchwork.ozlabs.org/api/1.1/series/500036/?format=api", "web_url": "http://patchwork.ozlabs.org/project/netfilter-devel/list/?series=500036", "date": "2026-04-15T20:02:13", "name": "IPVS: fixes after the new hash tables", "version": 1, "mbox": "http://patchwork.ozlabs.org/series/500036/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/2223628/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/2223628/checks/", "tags": {}, "headers": { "Return-Path": "\n <netfilter-devel+bounces-11939-incoming=patchwork.ozlabs.org@vger.kernel.org>", "X-Original-To": [ "incoming@patchwork.ozlabs.org", "netfilter-devel@vger.kernel.org" ], "Delivered-To": "patchwork-incoming@legolas.ozlabs.org", "Authentication-Results": [ "legolas.ozlabs.org;\n\tdkim=pass (4096-bit key;\n unprotected) header.d=ssi.bg header.i=@ssi.bg header.a=rsa-sha256\n header.s=ssi header.b=pLTAgD/m;\n\tdkim-atps=neutral", "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org\n (client-ip=2600:3c0a:e001:db::12fc:5321; helo=sea.lore.kernel.org;\n envelope-from=netfilter-devel+bounces-11939-incoming=patchwork.ozlabs.org@vger.kernel.org;\n receiver=patchwork.ozlabs.org)", "smtp.subspace.kernel.org;\n\tdkim=pass (4096-bit key) header.d=ssi.bg header.i=@ssi.bg header.b=\"pLTAgD/m\"", "smtp.subspace.kernel.org;\n arc=none smtp.client-ip=193.238.174.39", "smtp.subspace.kernel.org;\n dmarc=pass (p=reject dis=none) header.from=ssi.bg", "smtp.subspace.kernel.org;\n spf=pass smtp.mailfrom=ssi.bg" ], "Received": [ "from sea.lore.kernel.org (sea.lore.kernel.org\n [IPv6:2600:3c0a:e001:db::12fc:5321])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fwsbL4FBGz1yHc\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 16 Apr 2026 06:06:06 +1000 (AEST)", "from smtp.subspace.kernel.org (conduit.subspace.kernel.org\n [100.90.174.1])\n\tby sea.lore.kernel.org (Postfix) with ESMTP id 0F17A30B7666\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 15 Apr 2026 20:05:39 +0000 (UTC)", "from localhost.localdomain (localhost.localdomain [127.0.0.1])\n\tby smtp.subspace.kernel.org (Postfix) with ESMTP id 972B1386C2C;\n\tWed, 15 Apr 2026 20:05:37 +0000 (UTC)", "from mx.ssi.bg (mx.ssi.bg [193.238.174.39])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby smtp.subspace.kernel.org (Postfix) with ESMTPS id 3CB87373C04;\n\tWed, 15 Apr 2026 20:05:34 +0000 (UTC)", "from mx.ssi.bg (localhost [127.0.0.1])\n\tby mx.ssi.bg (Potsfix) with ESMTP id 70EAB21109;\n\tWed, 15 Apr 2026 23:05:18 +0300 (EEST)", "from box.ssi.bg (box.ssi.bg [193.238.174.46])\n\tby mx.ssi.bg (Potsfix) with ESMTPS;\n\tWed, 15 Apr 2026 23:05:16 +0300 (EEST)", "from ja.ssi.bg (unknown [213.16.62.126])\n\tby box.ssi.bg (Potsfix) with ESMTPSA id 4DF7F659B9;\n\tWed, 15 Apr 2026 23:05:16 +0300 (EEST)", "from ja.home.ssi.bg (localhost.localdomain [127.0.0.1])\n\tby ja.ssi.bg (8.18.1/8.18.1) with ESMTP id 63FK2dBd079739;\n\tWed, 15 Apr 2026 23:02:39 +0300", "(from root@localhost)\n\tby ja.home.ssi.bg (8.18.1/8.18.1/Submit) id 63FK2dCr079738;\n\tWed, 15 Apr 2026 23:02:39 +0300" ], "ARC-Seal": "i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;\n\tt=1776283536; cv=none;\n b=lkvgCAZxTIYq5mc1xLC4GDa/1LpH+Qtjdk9Hwz2XgJTTHnM85EXqK/K9VLwIB8EQ0xaV6Nq9qtZSXW1OBspjxxG68RPpU/HW+fXk3GIkquT07YjPokQOkKTi1YwDlUNwIpjZWhAojkPTWVlVshMbB2OCgW+UZcJ2yYkKYvMrZ/A=", "ARC-Message-Signature": "i=1; a=rsa-sha256; d=subspace.kernel.org;\n\ts=arc-20240116; t=1776283536; c=relaxed/simple;\n\tbh=e9yXjpHxlDuMvK+1gBHVgiUCambJT29h/6ksorUkIFU=;\n\th=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References:\n\t MIME-Version;\n b=L6NifiKHCo6F9wnbXJijOVa8lIM392j+T2gyIPQ8/25DhFro6dla8A+5UWJwoJ6sVgVtsp4jL3bQOk6+RzIy6ib4aQKZi0kW9tnyAuZSeU6Bsh7vDwPi9ON9/17F+8CEMLfkx2VFwpoZH2+aJCV2u2Mqx14kRoAHl7mUPpAfRxQ=", "ARC-Authentication-Results": "i=1; smtp.subspace.kernel.org;\n dmarc=pass (p=reject dis=none) header.from=ssi.bg;\n spf=pass smtp.mailfrom=ssi.bg;\n dkim=pass (4096-bit key) header.d=ssi.bg header.i=@ssi.bg header.b=pLTAgD/m;\n arc=none smtp.client-ip=193.238.174.39", "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=ssi.bg; h=cc:cc\n\t:content-transfer-encoding:date:from:from:in-reply-to:message-id\n\t:mime-version:references:reply-to:subject:subject:to:to; s=ssi;\n\t bh=01UtdVvsTe+NU8pEfyanQjMt2ACQt6xn0yg+GScOdbQ=; b=pLTAgD/mSO1R\n\tkjEpcucCQ4zKMw01Zt/PiBBOFwZ7TA8v63XMYP8ccVqz8CWdRycoD1A/b2CjGrx9\n\tH23nqDeVEpA/N35mPb/dGo1mGorcDaPJLwIseUBiIsNzavxoSsM4RvUEcA+eNVYW\n\t+nfwQ4WC42gPiGZpWgupAF0RkW7WksMQTs5kxy4JRnvhRQ61FVa6Q1+lfmRAjioF\n\twln7Nnvuc4z149QMhHyp0IEfqVrGv5k/bxcWqcu79OZU7WzVtNUHd/lEDt38uaCi\n\ta74+MwjW8PZAHWoMbv1siiLrLYMYk69A3MYSKYPi5l/F3v5PQJ6nOYUmDHgUBLZZ\n\tua19DQtiAUL2ti3yTKS6Wl3SHvbZvYDxHRWrXzPy3vk0vI2suKjV7cVBuXIdZzn+\n\tgTOQxByyNZgZDiaGYpBYjQFOMWA8MJlZDjDX5E7MTmh9UX8Sl6S7UG+B83o0XGEX\n\tHjpQC6jJde3lEtjQKLHwAILXfJdXLCBqtR0dLUsp+1V3g/0ZNiY2T5ihAAWBJk+w\n\tIWpPdUC9Caiy3ouoo7cnWNdB50ls8uH9Nww9QVy3mSDVnWFcKgFs+Is5U7IuHNPu\n\tT8yyj91HVu2UlmLML/LwiWjsqEQWuV6p+TGbAmuKovavpRhpAhDzVD5qhUx4SSWZ\n\tYoMDKI3G8p9i6QlE3Cjc1/KKqmxSkW8=", "From": "Julian Anastasov <ja@ssi.bg>", "To": "Simon Horman <horms@verge.net.au>", "Cc": "Pablo Neira Ayuso <pablo@netfilter.org>, Florian Westphal <fw@strlen.de>,\n lvs-devel@vger.kernel.org, netfilter-devel@vger.kernel.org", "Subject": "[PATCH net 3/3] ipvs: fix the spin_lock usage for RT build", "Date": "Wed, 15 Apr 2026 23:02:16 +0300", "Message-ID": "<20260415200216.79699-4-ja@ssi.bg>", "X-Mailer": "git-send-email 2.53.0", "In-Reply-To": "<20260415200216.79699-1-ja@ssi.bg>", "References": "<20260415200216.79699-1-ja@ssi.bg>", "Precedence": "bulk", "X-Mailing-List": "netfilter-devel@vger.kernel.org", "List-Id": "<netfilter-devel.vger.kernel.org>", "List-Subscribe": "<mailto:netfilter-devel+subscribe@vger.kernel.org>", "List-Unsubscribe": "<mailto:netfilter-devel+unsubscribe@vger.kernel.org>", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit" }, "content": "syzbot reports for sleeping function called from invalid context [1].\nThe recently added code for resizable hash tables uses\nhlist_bl bit locks in combination with spin_lock for\nthe connection fields (cp->lock).\n\nFix the following problems:\n\n* avoid using spin_lock(&cp->lock) under locked bit lock\nbecause it sleeps on PREEMPT_RT\n\n* as the recent changes call ip_vs_conn_hash() only for newly\nallocated connection, the spin_lock can be removed there because\nthe connection is still not linked to table and does not need\ncp->lock protection.\n\n* the lock can be removed also from ip_vs_conn_unlink() where we\nare the last connection user.\n\n* the last place that is fixed is ip_vs_conn_fill_cport()\nwhere the locks can be reordered to follow the RT rules.\n\n[1]:\nBUG: sleeping function called from invalid context at kernel/locking/spinlock_rt.c:48\nin_atomic(): 1, irqs_disabled(): 0, non_block: 0, pid: 16, name: ktimers/0\npreempt_count: 2, expected: 0\nRCU nest depth: 3, expected: 3\n8 locks held by ktimers/0/16:\n #0: ffffffff8de5f260 (local_bh){.+.+}-{1:3}, at: __local_bh_disable_ip+0x3c/0x420 kernel/softirq.c:163\n #1: ffffffff8dfc80c0 (rcu_read_lock){....}-{1:3}, at: __local_bh_disable_ip+0x3c/0x420 kernel/softirq.c:163\n #2: ffff8880b8826360 (&base->expiry_lock){+...}-{3:3}, at: spin_lock include/linux/spinlock_rt.h:45 [inline]\n #2: ffff8880b8826360 (&base->expiry_lock){+...}-{3:3}, at: timer_base_lock_expiry kernel/time/timer.c:1502 [inline]\n #2: ffff8880b8826360 (&base->expiry_lock){+...}-{3:3}, at: __run_timer_base+0x120/0x9f0 kernel/time/timer.c:2384\n #3: ffffffff8dfc80c0 (rcu_read_lock){....}-{1:3}, at: rcu_lock_acquire include/linux/rcupdate.h:300 [inline]\n #3: ffffffff8dfc80c0 (rcu_read_lock){....}-{1:3}, at: rcu_read_lock include/linux/rcupdate.h:838 [inline]\n #3: ffffffff8dfc80c0 (rcu_read_lock){....}-{1:3}, at: __rt_spin_lock kernel/locking/spinlock_rt.c:50 [inline]\n #3: ffffffff8dfc80c0 (rcu_read_lock){....}-{1:3}, at: rt_spin_lock+0x1e0/0x400 kernel/locking/spinlock_rt.c:57\n #4: ffffc90000157a80 ((&cp->timer)){+...}-{0:0}, at: call_timer_fn+0xd4/0x5e0 kernel/time/timer.c:1745\n #5: ffffffff8dfc80c0 (rcu_read_lock){....}-{1:3}, at: rcu_lock_acquire include/linux/rcupdate.h:300 [inline]\n #5: ffffffff8dfc80c0 (rcu_read_lock){....}-{1:3}, at: rcu_read_lock include/linux/rcupdate.h:838 [inline]\n #5: ffffffff8dfc80c0 (rcu_read_lock){....}-{1:3}, at: ip_vs_conn_unlink net/netfilter/ipvs/ip_vs_conn.c:315 [inline]\n #5: ffffffff8dfc80c0 (rcu_read_lock){....}-{1:3}, at: ip_vs_conn_expire+0x257/0x2390 net/netfilter/ipvs/ip_vs_conn.c:1260\n #6: ffffffff8de5f260 (local_bh){.+.+}-{1:3}, at: __local_bh_disable_ip+0x3c/0x420 kernel/softirq.c:163\n #7: ffff888068d4c3f0 (&cp->lock#2){+...}-{3:3}, at: spin_lock include/linux/spinlock_rt.h:45 [inline]\n #7: ffff888068d4c3f0 (&cp->lock#2){+...}-{3:3}, at: ip_vs_conn_unlink net/netfilter/ipvs/ip_vs_conn.c:324 [inline]\n #7: ffff888068d4c3f0 (&cp->lock#2){+...}-{3:3}, at: ip_vs_conn_expire+0xd4a/0x2390 net/netfilter/ipvs/ip_vs_conn.c:1260\nPreemption disabled at:\n[<ffffffff898a6358>] bit_spin_lock include/linux/bit_spinlock.h:38 [inline]\n[<ffffffff898a6358>] hlist_bl_lock+0x18/0x110 include/linux/list_bl.h:149\nCPU: 0 UID: 0 PID: 16 Comm: ktimers/0 Tainted: G W L syzkaller #0 PREEMPT_{RT,(full)}\nTainted: [W]=WARN, [L]=SOFTLOCKUP\nHardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 03/18/2026\nCall Trace:\n <TASK>\n dump_stack_lvl+0xe8/0x150 lib/dump_stack.c:120\n __might_resched+0x329/0x480 kernel/sched/core.c:9162\n __rt_spin_lock kernel/locking/spinlock_rt.c:48 [inline]\n rt_spin_lock+0xc2/0x400 kernel/locking/spinlock_rt.c:57\n spin_lock include/linux/spinlock_rt.h:45 [inline]\n ip_vs_conn_unlink net/netfilter/ipvs/ip_vs_conn.c:324 [inline]\n ip_vs_conn_expire+0xd4a/0x2390 net/netfilter/ipvs/ip_vs_conn.c:1260\n call_timer_fn+0x192/0x5e0 kernel/time/timer.c:1748\n expire_timers kernel/time/timer.c:1799 [inline]\n __run_timers kernel/time/timer.c:2374 [inline]\n __run_timer_base+0x6a3/0x9f0 kernel/time/timer.c:2386\n run_timer_base kernel/time/timer.c:2395 [inline]\n run_timer_softirq+0xb7/0x170 kernel/time/timer.c:2405\n handle_softirqs+0x1de/0x6d0 kernel/softirq.c:622\n __do_softirq kernel/softirq.c:656 [inline]\n run_ktimerd+0x69/0x100 kernel/softirq.c:1151\n smpboot_thread_fn+0x541/0xa50 kernel/smpboot.c:160\n kthread+0x388/0x470 kernel/kthread.c:436\n ret_from_fork+0x514/0xb70 arch/x86/kernel/process.c:158\n ret_from_fork_asm+0x1a/0x30 arch/x86/entry/entry_64.S:245\n </TASK>\n\nReported-by: syzbot+504e778ddaecd36fdd17@syzkaller.appspotmail.com\nFixes: 2fa7cc9c7025 (\"ipvs: switch to per-net connection table\")\nSigned-off-by: Julian Anastasov <ja@ssi.bg>\n---\n net/netfilter/ipvs/ip_vs_conn.c | 49 ++++++++++++++-------------------\n 1 file changed, 21 insertions(+), 28 deletions(-)", "diff": "diff --git a/net/netfilter/ipvs/ip_vs_conn.c b/net/netfilter/ipvs/ip_vs_conn.c\nindex 84a4921a7865..cf19dc06c65d 100644\n--- a/net/netfilter/ipvs/ip_vs_conn.c\n+++ b/net/netfilter/ipvs/ip_vs_conn.c\n@@ -267,27 +267,20 @@ static inline int ip_vs_conn_hash(struct ip_vs_conn *cp)\n \t\thash_key2 = hash_key;\n \t\tuse2 = false;\n \t}\n+\n \tconn_tab_lock(t, cp, hash_key, hash_key2, use2, true /* new_hash */,\n \t\t &head, &head2);\n-\tspin_lock(&cp->lock);\n-\n-\tif (!(cp->flags & IP_VS_CONN_F_HASHED)) {\n-\t\tcp->flags |= IP_VS_CONN_F_HASHED;\n-\t\tWRITE_ONCE(cp->hn0.hash_key, hash_key);\n-\t\tWRITE_ONCE(cp->hn1.hash_key, hash_key2);\n-\t\trefcount_inc(&cp->refcnt);\n-\t\thlist_bl_add_head_rcu(&cp->hn0.node, head);\n-\t\tif (use2)\n-\t\t\thlist_bl_add_head_rcu(&cp->hn1.node, head2);\n-\t\tret = 1;\n-\t} else {\n-\t\tpr_err(\"%s(): request for already hashed, called from %pS\\n\",\n-\t\t __func__, __builtin_return_address(0));\n-\t\tret = 0;\n-\t}\n \n-\tspin_unlock(&cp->lock);\n+\tcp->flags |= IP_VS_CONN_F_HASHED;\n+\tWRITE_ONCE(cp->hn0.hash_key, hash_key);\n+\tWRITE_ONCE(cp->hn1.hash_key, hash_key2);\n+\trefcount_inc(&cp->refcnt);\n+\thlist_bl_add_head_rcu(&cp->hn0.node, head);\n+\tif (use2)\n+\t\thlist_bl_add_head_rcu(&cp->hn1.node, head2);\n+\n \tconn_tab_unlock(head, head2);\n+\tret = 1;\n \n \t/* Schedule resizing if load increases */\n \tif (atomic_read(&ipvs->conn_count) > t->u_thresh &&\n@@ -321,7 +314,6 @@ static inline bool ip_vs_conn_unlink(struct ip_vs_conn *cp)\n \n \tconn_tab_lock(t, cp, hash_key, hash_key2, use2, false /* new_hash */,\n \t\t &head, &head2);\n-\tspin_lock(&cp->lock);\n \n \tif (cp->flags & IP_VS_CONN_F_HASHED) {\n \t\t/* Decrease refcnt and unlink conn only if we are last user */\n@@ -334,7 +326,6 @@ static inline bool ip_vs_conn_unlink(struct ip_vs_conn *cp)\n \t\t}\n \t}\n \n-\tspin_unlock(&cp->lock);\n \tconn_tab_unlock(head, head2);\n \n \trcu_read_unlock();\n@@ -637,6 +628,7 @@ void ip_vs_conn_fill_cport(struct ip_vs_conn *cp, __be16 cport)\n \tstruct ip_vs_conn_hnode *hn;\n \tu32 hash_key, hash_key_new;\n \tstruct ip_vs_conn_param p;\n+\tbool changed = false;\n \tint ntbl;\n \tint dir;\n \n@@ -709,9 +701,7 @@ void ip_vs_conn_fill_cport(struct ip_vs_conn *cp, __be16 cport)\n \t\tgoto retry;\n \t}\n \n-\tspin_lock(&cp->lock);\n-\tif ((cp->flags & IP_VS_CONN_F_NO_CPORT) &&\n-\t (cp->flags & IP_VS_CONN_F_HASHED)) {\n+\tif (cp->flags & IP_VS_CONN_F_NO_CPORT) {\n \t\t/* We do not recalc hash_key_r under lock, we assume the\n \t\t * parameters in cp do not change, i.e. cport is\n \t\t * the only possible change.\n@@ -726,19 +716,22 @@ void ip_vs_conn_fill_cport(struct ip_vs_conn *cp, __be16 cport)\n \t\t\thlist_bl_del_rcu(&hn->node);\n \t\t\thlist_bl_add_head_rcu(&hn->node, head_new);\n \t\t}\n-\t\tif (!dir) {\n-\t\t\tatomic_dec(&ipvs->no_cport_conns[af_id]);\n-\t\t\tcp->flags &= ~IP_VS_CONN_F_NO_CPORT;\n-\t\t\tcp->cport = cport;\n-\t\t}\n+\t\tif (!dir)\n+\t\t\tchanged = true;\n \t}\n-\tspin_unlock(&cp->lock);\n \n \tif (head != head2)\n \t\thlist_bl_unlock(head2);\n \thlist_bl_unlock(head);\n \twrite_seqcount_end(&t->seqc[hash_key & t->seqc_mask]);\n \tpreempt_enable_nested();\n+\tif (changed) {\n+\t\tatomic_dec(&ipvs->no_cport_conns[af_id]);\n+\t\tspin_lock(&cp->lock);\n+\t\tcp->flags &= ~IP_VS_CONN_F_NO_CPORT;\n+\t\tcp->cport = cport;\n+\t\tspin_unlock(&cp->lock);\n+\t}\n \tspin_unlock_bh(&t->lock[hash_key & t->lock_mask].l);\n \tif (dir--)\n \t\tgoto next_dir;\n", "prefixes": [ "net", "3/3" ] }