get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/1.1/patches/2225239/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 2225239,
    "url": "http://patchwork.ozlabs.org/api/1.1/patches/2225239/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/netfilter-devel/patch/20260420165539.85174-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": "<20260420165539.85174-4-ja@ssi.bg>",
    "date": "2026-04-20T16:55:39",
    "name": "[PATCHv2,net,3/3] ipvs: fix the spin_lock usage for RT build",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "7460775a98f242407517eb25f71b7f692b5ef683",
    "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/20260420165539.85174-4-ja@ssi.bg/mbox/",
    "series": [
        {
            "id": 500642,
            "url": "http://patchwork.ozlabs.org/api/1.1/series/500642/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/netfilter-devel/list/?series=500642",
            "date": "2026-04-20T16:55:36",
            "name": "IPVS: fixes after the new hash tables",
            "version": 1,
            "mbox": "http://patchwork.ozlabs.org/series/500642/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/2225239/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/2225239/checks/",
    "tags": {},
    "headers": {
        "Return-Path": "\n <netfilter-devel+bounces-12070-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=tcr4nGwx;\n\tdkim-atps=neutral",
            "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org\n (client-ip=2600:3c04:e001:36c::12fc:5321; helo=tor.lore.kernel.org;\n envelope-from=netfilter-devel+bounces-12070-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=\"tcr4nGwx\"",
            "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 tor.lore.kernel.org (tor.lore.kernel.org\n [IPv6:2600:3c04:e001:36c::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 4fzsY81MBYz1yD4\n\tfor <incoming@patchwork.ozlabs.org>; Tue, 21 Apr 2026 03:14:36 +1000 (AEST)",
            "from smtp.subspace.kernel.org (conduit.subspace.kernel.org\n [100.90.174.1])\n\tby tor.lore.kernel.org (Postfix) with ESMTP id DB30730AFA87\n\tfor <incoming@patchwork.ozlabs.org>; Mon, 20 Apr 2026 16:59:29 +0000 (UTC)",
            "from localhost.localdomain (localhost.localdomain [127.0.0.1])\n\tby smtp.subspace.kernel.org (Postfix) with ESMTP id C1011379EF0;\n\tMon, 20 Apr 2026 16:59:26 +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 D8738368276;\n\tMon, 20 Apr 2026 16:59:23 +0000 (UTC)",
            "from mx.ssi.bg (localhost [127.0.0.1])\n\tby mx.ssi.bg (Potsfix) with ESMTP id 8FEE2210E1;\n\tMon, 20 Apr 2026 19:59:08 +0300 (EEST)",
            "from box.ssi.bg (box.ssi.bg [193.238.174.46])\n\tby mx.ssi.bg (Potsfix) with ESMTPS;\n\tMon, 20 Apr 2026 19:59:06 +0300 (EEST)",
            "from ja.ssi.bg (unknown [213.16.62.126])\n\tby box.ssi.bg (Potsfix) with ESMTPSA id 385C1628C8;\n\tMon, 20 Apr 2026 19:59:06 +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 63KGu4Fa085564;\n\tMon, 20 Apr 2026 19:56:04 +0300",
            "(from root@localhost)\n\tby ja.home.ssi.bg (8.18.1/8.18.1/Submit) id 63KGu4RW085563;\n\tMon, 20 Apr 2026 19:56:04 +0300"
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;\n\tt=1776704366; cv=none;\n b=RU8m1AVYGzLdIZr8EOaalihsjqLY516Jf/cptEcx3+eiyXHjA5MDjeBnXDQ400mA1Oh4oTfHTU7K8Cgj2UyFkthNJ4LMFPfITMcAtKiqEjvFCvawnnDJKuxRJba2qkm3294ntsuG/K6U3rbAtIorm+Ttw4FPXtxCLKCLzHp4Hm0=",
        "ARC-Message-Signature": "i=1; a=rsa-sha256; d=subspace.kernel.org;\n\ts=arc-20240116; t=1776704366; c=relaxed/simple;\n\tbh=g8I9dx2byrtK7rdO/GIV6Y5sDqAp9VuIsttFZmoDRBU=;\n\th=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References:\n\t MIME-Version;\n b=pr79BdDJTZsK+BMIbGEeZbOSPRGJaJkCpUE0U71kskJi2hT9ZIOYUzHG8igVurvv4ujHZuCQfTHtXmcXzHENxdv1gmuBKmyv92GD0cduqQgGxfNZT2aBtsjStKl+h3/9uWhEIWSXi2LRESPDtla1VapVtzfGcmNdInp1dzXTk4k=",
        "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=tcr4nGwx;\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=2rqmaeWku7AlEMricXkhcjzlyFOaXOIS/qTCysWcgKg=; b=tcr4nGwx/Y0k\n\tG5lwT+ppbLmYe+J36prvko3RR1Rns2542SWKnwHlGjEmdgIS1yARbCtzLTzo7+N3\n\t/slZtaG2QRxkU/yI/pAkZUBuF6mn+UEOE0VeLIDYoAMUjezItIoTI/YrggLtdFlA\n\tv0NAOjYnIr75aasr+JNSz9uk5OTN4/RJ/mwxARszJb9bHfaC03UdHFXdpKTgCEGX\n\tmvJcCfwHqv0Q09Ta5NaAm0UlW+lD/oUWLQdWwDSBFe5vqNPoHYSaKUCxhHvDb6oF\n\tHnBmelz6RJl9eV+yWE9W6+8XXVAvOLTnSh5JlzhvL87rGVFjSqFxqoA6NoJV9b0e\n\t32+o/oSNgfCfRORes2ZHJwdxhFrJf4ioFSv+57srwgj+Sjx8kO5zrQ870koR0MJq\n\tsNwCp87y+y8cX3CH5jm4AL7KkVRMOiJthdBoOfL5LOmnySs73aJ0Xtutzqj1iuVl\n\tv86rtnj5eEvIJvYnZjQes3F0FkZ6CJ3uRjIXV8HZSonishF0+cGBiRRuaGb2NZzN\n\tUsgV+CjPm81oQl7iBglbivoWQB/gtUq08JSv0PQjvufkNBUm2dRumFRwL/TA22zl\n\t+M+op5ler5JHzQAs2ot5gUvayx8eVIninmAs+NIjEDTEJxwgSieYyAqT4T3KonBO\n\tApp9spvTa73tuKOLse0AVGCd91AoEe8=",
        "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": "[PATCHv2 net 3/3] ipvs: fix the spin_lock usage for RT build",
        "Date": "Mon, 20 Apr 2026 19:55:39 +0300",
        "Message-ID": "<20260420165539.85174-4-ja@ssi.bg>",
        "X-Mailer": "git-send-email 2.53.0",
        "In-Reply-To": "<20260420165539.85174-1-ja@ssi.bg>",
        "References": "<20260420165539.85174-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 lock can be also removed because it is called for\nthe first packet in data connection where cp->flags do not\nchange for other reasons. Here we make sure cport and flags\nare changed only once if two or more packets race to fill\nthe cport. Also, we fill cport early, so that if we race\nwith resizing there will be valid cport key for the hashing.\nProblems with v1 reported by Sashiko.\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\nLink: https://sashiko.dev/#/patchset/20260415200216.79699-1-ja%40ssi.bg\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 | 50 +++++++++++++++------------------\n 1 file changed, 22 insertions(+), 28 deletions(-)",
    "diff": "diff --git a/net/netfilter/ipvs/ip_vs_conn.c b/net/netfilter/ipvs/ip_vs_conn.c\nindex 84a4921a7865..8572517feb22 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 by_me = false;\n \tint ntbl;\n \tint dir;\n \n@@ -709,9 +701,17 @@ 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+\t/* Fill cport once, even if multiple packets try to do it */\n+\tif (cp->flags & IP_VS_CONN_F_NO_CPORT && (!cp->cport || by_me)) {\n+\t\t/* If we race with resizing make sure cport is set for dir 1 */\n+\t\tif (!cp->cport) {\n+\t\t\tcp->cport = cport;\n+\t\t\tby_me = true;\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}\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,13 +726,7 @@ 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}\n-\tspin_unlock(&cp->lock);\n \n \tif (head != head2)\n \t\thlist_bl_unlock(head2);\n",
    "prefixes": [
        "PATCHv2",
        "net",
        "3/3"
    ]
}