Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/2218376/?format=api
{ "id": 2218376, "url": "http://patchwork.ozlabs.org/api/patches/2218376/?format=api", "web_url": "http://patchwork.ozlabs.org/project/linuxppc-dev/patch/20260401103215.104438-1-adubey@linux.ibm.com/", "project": { "id": 2, "url": "http://patchwork.ozlabs.org/api/projects/2/?format=api", "name": "Linux PPC development", "link_name": "linuxppc-dev", "list_id": "linuxppc-dev.lists.ozlabs.org", "list_email": "linuxppc-dev@lists.ozlabs.org", "web_url": "https://github.com/linuxppc/wiki/wiki", "scm_url": "https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git", "webscm_url": "https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git/", "list_archive_url": "https://lore.kernel.org/linuxppc-dev/", "list_archive_url_format": "https://lore.kernel.org/linuxppc-dev/{}/", "commit_url_format": "https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git/commit/?id={}" }, "msgid": "<20260401103215.104438-1-adubey@linux.ibm.com>", "list_archive_url": "https://lore.kernel.org/linuxppc-dev/20260401103215.104438-1-adubey@linux.ibm.com/", "date": "2026-04-01T10:32:14", "name": "[v7,1/2] powerpc64/bpf: Implement JIT support for private stack", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "a9b0637f86fd55851dfa9fe26ca9ebc2c7a6a683", "submitter": { "id": 88541, "url": "http://patchwork.ozlabs.org/api/people/88541/?format=api", "name": "adubey", "email": "adubey@linux.ibm.com" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/linuxppc-dev/patch/20260401103215.104438-1-adubey@linux.ibm.com/mbox/", "series": [ { "id": 498279, "url": "http://patchwork.ozlabs.org/api/series/498279/?format=api", "web_url": "http://patchwork.ozlabs.org/project/linuxppc-dev/list/?series=498279", "date": "2026-04-01T10:32:14", "name": "[v7,1/2] powerpc64/bpf: Implement JIT support for private stack", "version": 7, "mbox": "http://patchwork.ozlabs.org/series/498279/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/2218376/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/2218376/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "\n <linuxppc-dev+bounces-19122-incoming=patchwork.ozlabs.org@lists.ozlabs.org>", "X-Original-To": [ "incoming@patchwork.ozlabs.org", "linuxppc-dev@lists.ozlabs.org" ], "Delivered-To": "patchwork-incoming@legolas.ozlabs.org", "Authentication-Results": [ "legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=ibm.com header.i=@ibm.com header.a=rsa-sha256\n header.s=pp1 header.b=fFOCfr3u;\n\tdkim-atps=neutral", "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=lists.ozlabs.org\n (client-ip=112.213.38.117; helo=lists.ozlabs.org;\n envelope-from=linuxppc-dev+bounces-19122-incoming=patchwork.ozlabs.org@lists.ozlabs.org;\n receiver=patchwork.ozlabs.org)", "lists.ozlabs.org;\n arc=none smtp.remote-ip=148.163.158.5", "lists.ozlabs.org;\n dmarc=pass (p=none dis=none) header.from=linux.ibm.com", "lists.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=ibm.com header.i=@ibm.com header.a=rsa-sha256\n header.s=pp1 header.b=fFOCfr3u;\n\tdkim-atps=neutral", "lists.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=linux.ibm.com\n (client-ip=148.163.158.5; helo=mx0b-001b2d01.pphosted.com;\n envelope-from=adubey@linux.ibm.com; receiver=lists.ozlabs.org)" ], "Received": [ "from lists.ozlabs.org (lists.ozlabs.org [112.213.38.117])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1 raw public key)\n server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4flwCQ4WMRz1xtJ\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 01 Apr 2026 17:32:50 +1100 (AEDT)", "from boromir.ozlabs.org (localhost [127.0.0.1])\n\tby lists.ozlabs.org (Postfix) with ESMTP id 4flwCP6r8jz2ygY;\n\tWed, 01 Apr 2026 17:32:49 +1100 (AEDT)", "from mx0b-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com\n [148.163.158.5])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature RSA-PSS (2048 bits) server-digest\n SHA256)\n\t(No client certificate requested)\n\tby lists.ozlabs.org (Postfix) with ESMTPS id 4flwCN35RDz2xb3\n\tfor <linuxppc-dev@lists.ozlabs.org>; Wed, 01 Apr 2026 17:32:47 +1100 (AEDT)", "from pps.filterd (m0360072.ppops.net [127.0.0.1])\n\tby mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id\n 62VIY8c44187356;\n\tWed, 1 Apr 2026 06:32:32 GMT", "from ppma22.wdc07v.mail.ibm.com\n (5c.69.3da9.ip4.static.sl-reverse.com [169.61.105.92])\n\tby mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4d66ms644c-1\n\t(version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT);\n\tWed, 01 Apr 2026 06:32:31 +0000 (GMT)", "from pps.filterd (ppma22.wdc07v.mail.ibm.com [127.0.0.1])\n\tby ppma22.wdc07v.mail.ibm.com (8.18.1.2/8.18.1.2) with ESMTP id\n 63168efs006362;\n\tWed, 1 Apr 2026 06:32:31 GMT", "from smtprelay02.fra02v.mail.ibm.com ([9.218.2.226])\n\tby ppma22.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4d6spy4g7g-1\n\t(version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT);\n\tWed, 01 Apr 2026 06:32:31 +0000", "from smtpav05.fra02v.mail.ibm.com (smtpav05.fra02v.mail.ibm.com\n [10.20.54.104])\n\tby smtprelay02.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id\n 6316WR8A51904968\n\t(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK);\n\tWed, 1 Apr 2026 06:32:27 GMT", "from smtpav05.fra02v.mail.ibm.com (unknown [127.0.0.1])\n\tby IMSVA (Postfix) with ESMTP id 3897C2004B;\n\tWed, 1 Apr 2026 06:32:27 +0000 (GMT)", "from smtpav05.fra02v.mail.ibm.com (unknown [127.0.0.1])\n\tby IMSVA (Postfix) with ESMTP id 3E8942004D;\n\tWed, 1 Apr 2026 06:32:25 +0000 (GMT)", "from ltcrain4-lp15.ltc.tadn.ibm.com (unknown [9.5.7.39])\n\tby smtpav05.fra02v.mail.ibm.com (Postfix) with ESMTP;\n\tWed, 1 Apr 2026 06:32:25 +0000 (GMT)" ], "ARC-Seal": "i=1; a=rsa-sha256; d=lists.ozlabs.org; s=201707; t=1775025169;\n\tcv=none;\n b=OKBeRhmHtI3J//kvrhVJK8dBrM4cHqpc2vBX4PfxCtlQTWXAQ1SWaX4fpGerQomS1l/ppsHJeoaTPPkKDDms3kGtfIQ/lIc1KFEUGaWjiV4XLr7PlF0OJw/ogu/fle8WMTZMRH2oPGFfuEk4+6ZaOMLDpUcdsR1ATNrRHfKGlOKFbWBbQ+BOW1ELFechVAL3X4R4aKUlz5PLs8tDpjiJhsewdct3fPK/Qlmra0jQpkraCfP/A6lP8p8mKqNWwpfNKwqiOP4zjpySPOs6HvISWSdyXQXfaFKX4cGVnuW5tfmyQRKg2Gy/Nuj2I3BX2VP0yw4LL6Sk+/plPniZXeTb5A==", "ARC-Message-Signature": "i=1; a=rsa-sha256; d=lists.ozlabs.org; s=201707;\n\tt=1775025169; c=relaxed/relaxed;\n\tbh=Ht5y3I7lUy2pHx2eUv287Am35xnFtXoqqFDjibAg8O0=;\n\th=From:To:Cc:Subject:Date:Message-ID:MIME-Version;\n b=c4KHwWrVV26kta/Y5AJVCD2yhARJd0jzGhMDGJCCtoOAVnmD55kNaOoZIsenMPwI4FX1nws813xF7RRq28t34FYddTkGPPUY8kYav08UGINqCwyJVGFkBBiWYa5LW0IqP1PwdhRRBsiX4p2K15/QV7X5Cnb0AGW0NF8k/VWo+mP2IeiW5yRzJ1pZuyNQuByv/7umbZoYiQjqQFrvCk+Ogvsism2P4tLSM7+2SdAuaRf4lehHJExPxXcbqsuncLwWOPLjB52gp8kI9bbMaDN3X3U6Om5fjYDFcKqWOoTcqSYnV/yuUaM5WStmK35WtM4UTipHJI2vNNzoKkpR+fhC8g==", "ARC-Authentication-Results": "i=1; lists.ozlabs.org;\n dmarc=pass (p=none dis=none) header.from=linux.ibm.com;\n dkim=pass (2048-bit key;\n unprotected) header.d=ibm.com header.i=@ibm.com header.a=rsa-sha256\n header.s=pp1 header.b=fFOCfr3u; dkim-atps=neutral;\n spf=pass (client-ip=148.163.158.5; helo=mx0b-001b2d01.pphosted.com;\n envelope-from=adubey@linux.ibm.com;\n receiver=lists.ozlabs.org) smtp.mailfrom=linux.ibm.com", "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc\n\t:content-transfer-encoding:date:from:message-id:mime-version\n\t:subject:to; s=pp1; bh=Ht5y3I7lUy2pHx2eUv287Am35xnFtXoqqFDjibAg8\n\tO0=; b=fFOCfr3uFvTEP1HLXiTjDVBfoZu89i38X4cqHxAY6hINu83sYLSs1Y2wL\n\tJOWMVKCCJSn21DhVbHrCTIaSRSF2DvW4RDjjhctrX7Dr4+iWEOXPBqP+UMAmzG/8\n\ts7+57zdNDo/T662py5WpkGrsDwzHZ79S363H2u+f1faIscldvibBOWwwB0p6Xtpz\n\tDzhX0tmSEFmSIHIxJMn91JEhHorggsegjibg1NvUWO830vg+Ilmac8IsXO8ERJeV\n\tx07XKcy6XrK+DJEGgHYbKJTrPpsRF1cfKRsVaLIdlK0JFfS2nRuabMmfNVLFvKyX\n\tfvtTKCq81Gm+cCHkd6I5+PaxqG3nw==", "From": "adubey@linux.ibm.com", "To": "linuxppc-dev@lists.ozlabs.org", "Cc": "hbathini@linux.ibm.com, bpf@vger.kernel.org, maddy@linux.ibm.com,\n ast@kernel.org, andrii@kernel.org, daniel@iogearbox.net,\n shuah@kernel.org, linux-kselftest@vger.kernel.org,\n Abhishek Dubey <adubey@linux.ibm.com>,\n Venkat Rao Bagalkote <venkat88@linux.ibm.com>", "Subject": "[PATCH v7 1/2] powerpc64/bpf: Implement JIT support for private stack", "Date": "Wed, 1 Apr 2026 06:32:14 -0400", "Message-ID": "<20260401103215.104438-1-adubey@linux.ibm.com>", "X-Mailer": "git-send-email 2.52.0", "X-Mailing-List": "linuxppc-dev@lists.ozlabs.org", "List-Id": "<linuxppc-dev.lists.ozlabs.org>", "List-Help": "<mailto:linuxppc-dev+help@lists.ozlabs.org>", "List-Owner": "<mailto:linuxppc-dev+owner@lists.ozlabs.org>", "List-Post": "<mailto:linuxppc-dev@lists.ozlabs.org>", "List-Archive": "<https://lore.kernel.org/linuxppc-dev/>,\n <https://lists.ozlabs.org/pipermail/linuxppc-dev/>", "List-Subscribe": "<mailto:linuxppc-dev+subscribe@lists.ozlabs.org>,\n <mailto:linuxppc-dev+subscribe-digest@lists.ozlabs.org>,\n <mailto:linuxppc-dev+subscribe-nomail@lists.ozlabs.org>", "List-Unsubscribe": "<mailto:linuxppc-dev+unsubscribe@lists.ozlabs.org>", "Precedence": "list", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit", "X-TM-AS-GCONF": "00", "X-Authority-Analysis": "v=2.4 cv=J6enLQnS c=1 sm=1 tr=0 ts=69ccbbff cx=c_pps\n a=5BHTudwdYE3Te8bg5FgnPg==:117 a=5BHTudwdYE3Te8bg5FgnPg==:17\n a=A5OVakUREuEA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22\n a=RzCfie-kr_QcCd8fBx8p:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8\n a=A8mRDSlWM7J1pTn1j8wA:9", "X-Proofpoint-Spam-Details-Enc": "AW1haW4tMjYwNDAxMDA1MyBTYWx0ZWRfX1aLs8KzBjDOZ\n Q5ORE1oKKvSfufb7QPuA3qklDcdgbqZnFchbeCK+bFzVm2f1flQShm4Xw1S2EqabJyGKdetM+Uz\n DI0dExDhg7ka401iHBHBQZLSUyHhys8m9YsERhY1K8yw45EUqUptmGejLo7cxRivAwEp8Ktxgas\n mTrVLST9iYqEtrKCm76qcuxEYp/pwWe6C57bP3sPCAM4Z3S7bho5aaso8BafVREqgORAswd0Ou/\n f/VHFCCVoS1ACatluX83OrvsAMzGnbt9AtxZAblepDhlf7dXfdyXLwoqilpR4/JiaLRFkoc+dYw\n d4TobMwX3f6VjJI5BHap80VkKlp/Hc6yIToDMlmesy8q3QEqb7jfhiS5lSzoOKnHR9WOxWOBVv4\n zMzEgTslCiL2grEkbfhvh6SHykuPIhSAiwJDoxvVm5eCkPi7Aet/1veVHfB17X3kfVymrgREls7\n qK1teu27FtnePoIno4w==", "X-Proofpoint-GUID": "zXASUtDI995Awp9vz-SeS3Rmgyal53Df", "X-Proofpoint-ORIG-GUID": "zXASUtDI995Awp9vz-SeS3Rmgyal53Df", "X-Proofpoint-Virus-Version": "vendor=baseguard\n engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49\n definitions=2026-04-01_02,2026-03-31_02,2025-10-01_01", "X-Proofpoint-Spam-Details": "rule=outbound_notspam policy=outbound score=0\n suspectscore=0 clxscore=1011 adultscore=0 priorityscore=1501 bulkscore=0\n phishscore=0 malwarescore=0 lowpriorityscore=0 spamscore=0 impostorscore=0\n classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0\n reason=mlx scancount=1 engine=8.22.0-2603050001 definitions=main-2604010053", "X-Spam-Status": "No, score=1.7 required=3.0 tests=DATE_IN_FUTURE_03_06,\n\tDKIM_SIGNED,DKIM_VALID,RCVD_IN_DNSWL_LOW,RCVD_IN_MSPIKE_H4,\n\tRCVD_IN_MSPIKE_WL,SPF_HELO_NONE,SPF_PASS autolearn=disabled\n\tversion=4.0.1 OzLabs 8", "X-Spam-Level": "*", "X-Spam-Checker-Version": "SpamAssassin 4.0.1 (2024-03-25) on lists.ozlabs.org" }, "content": "From: Abhishek Dubey <adubey@linux.ibm.com>\n\nProvision the private stack as a per-CPU allocation during\nbpf_int_jit_compile(). Align the stack to 16 bytes and place guard\nregions at both ends to detect runtime stack overflow and underflow.\n\nRound the private stack size up to the nearest 16-byte boundary.\nMake each guard region 16 bytes to preserve the required overall\n16-byte alignment. When private stack is set, skip bpf stack size\naccounting in kernel stack.\n\nThere is no stack pointer in powerpc. Stack referencing during JIT\nis done using frame pointer. Frame pointer calculation goes like:\n\nBPF frame pointer = Priv stack allocation start address +\n Overflow guard +\n Actual stack size defined by verifier\n\nMemory layout:\n\nHigh Addr +--------------------------------------------------+\n | |\n | 16 bytes Underflow guard (0xEB9F12345678eb9fULL) |\n | |\n BPF FP -> +--------------------------------------------------+\n | |\n | Private stack - determined by verifier |\n | 16-bytes aligned |\n | |\n +--------------------------------------------------+\n | |\nLower Addr | 16 byte Overflow guard (0xEB9F12345678eb9fULL) |\n | |\nPriv stack alloc ->+--------------------------------------------------+\nstart\n\nUpdate BPF_REG_FP to point to the calculated offset within the\nallocated private stack buffer. Now, BPF stack usage reference\nin the allocated private stack.\n\nSigned-off-by: Abhishek Dubey <adubey@linux.ibm.com>\nAcked-by: Hari Bathini <hbathini@linux.ibm.com>\nTested-by: Venkat Rao Bagalkote <venkat88@linux.ibm.com>\n---\n\nv6->v7:\n Handle SMP case when setting frame pointer\n Pickup Acked-by and Tested-by tags\nv5->v6:\n Remove unused label\nv4->v5:\n Rebase over latest branch\nv3->v4:\n No change\nv2->v3:\n Enable testcase using __powerpc64__ instead of __TARGET_ARCH_powerpc,\n to prevent it getting invoked on powerpc32\nv1->v2:\n No change\n\n[v6]: https://lore.kernel.org/bpf/20260331080309.173612-1-adubey@linux.ibm.com \n[v5]: https://lore.kernel.org/bpf/20260330232034.44776-1-adubey@linux.ibm.com\n[v4]: https://lore.kernel.org/bpf/20260226031324.17352-1-adubey@linux.ibm.com\n[v3]: https://lore.kernel.org/bpf/20260226005440.9570-1-adubey@linux.ibm.com\n[v2]: https://lore.kernel.org/bpf/20260225153950.15331-1-adubey@linux.ibm.com\n[v1]: https://lore.kernel.org/bpf/20260216152234.36632-1-adubey@linux.ibm.com\n\n arch/powerpc/net/bpf_jit.h | 6 ++\n arch/powerpc/net/bpf_jit_comp.c | 97 +++++++++++++++++++++++++++++--\n arch/powerpc/net/bpf_jit_comp64.c | 31 +++++++++-\n 3 files changed, 126 insertions(+), 8 deletions(-)", "diff": "diff --git a/arch/powerpc/net/bpf_jit.h b/arch/powerpc/net/bpf_jit.h\nindex 7354e1d72f79..a232f3fb73be 100644\n--- a/arch/powerpc/net/bpf_jit.h\n+++ b/arch/powerpc/net/bpf_jit.h\n@@ -178,8 +178,14 @@ struct codegen_context {\n \tbool is_subprog;\n \tbool exception_boundary;\n \tbool exception_cb;\n+\tvoid __percpu *priv_sp;\n+\tunsigned int priv_stack_size;\n };\n \n+/* Memory size & magic-value to detect private stack overflow/underflow */\n+#define PRIV_STACK_GUARD_SZ 16\n+#define PRIV_STACK_GUARD_VAL 0xEB9F12345678eb9fULL\n+\n #define bpf_to_ppc(r)\t(ctx->b2p[r])\n \n #ifdef CONFIG_PPC32\ndiff --git a/arch/powerpc/net/bpf_jit_comp.c b/arch/powerpc/net/bpf_jit_comp.c\nindex a62a9a92b7b5..2018260f56c6 100644\n--- a/arch/powerpc/net/bpf_jit_comp.c\n+++ b/arch/powerpc/net/bpf_jit_comp.c\n@@ -129,25 +129,60 @@ bool bpf_jit_needs_zext(void)\n \treturn true;\n }\n \n+static void priv_stack_init_guard(void __percpu *priv_stack_ptr, int alloc_size)\n+{\n+\tint cpu, underflow_idx = (alloc_size - PRIV_STACK_GUARD_SZ) >> 3;\n+\tu64 *stack_ptr;\n+\n+\tfor_each_possible_cpu(cpu) {\n+\t\tstack_ptr = per_cpu_ptr(priv_stack_ptr, cpu);\n+\t\tstack_ptr[0] = PRIV_STACK_GUARD_VAL;\n+\t\tstack_ptr[1] = PRIV_STACK_GUARD_VAL;\n+\t\tstack_ptr[underflow_idx] = PRIV_STACK_GUARD_VAL;\n+\t\tstack_ptr[underflow_idx + 1] = PRIV_STACK_GUARD_VAL;\n+\t}\n+}\n+\n+static void priv_stack_check_guard(void __percpu *priv_stack_ptr, int alloc_size,\n+\t\t\t\t\t\t\t\tstruct bpf_prog *fp)\n+{\n+\tint cpu, underflow_idx = (alloc_size - PRIV_STACK_GUARD_SZ) >> 3;\n+\tu64 *stack_ptr;\n+\n+\tfor_each_possible_cpu(cpu) {\n+\t\tstack_ptr = per_cpu_ptr(priv_stack_ptr, cpu);\n+\t\tif (stack_ptr[0] != PRIV_STACK_GUARD_VAL ||\n+\t\t\tstack_ptr[1] != PRIV_STACK_GUARD_VAL ||\n+\t\t\tstack_ptr[underflow_idx] != PRIV_STACK_GUARD_VAL ||\n+\t\t\tstack_ptr[underflow_idx + 1] != PRIV_STACK_GUARD_VAL) {\n+\t\t\tpr_err(\"BPF private stack overflow/underflow detected for prog %s\\n\",\n+\t\t\tbpf_jit_get_prog_name(fp));\n+\t\t\tbreak;\n+\t\t}\n+\t}\n+}\n+\n struct bpf_prog *bpf_int_jit_compile(struct bpf_prog *fp)\n {\n \tu32 proglen;\n \tu32 alloclen;\n \tu8 *image = NULL;\n-\tu32 *code_base;\n-\tu32 *addrs;\n-\tstruct powerpc_jit_data *jit_data;\n+\tu32 *code_base = NULL;\n+\tu32 *addrs = NULL;\n+\tstruct powerpc_jit_data *jit_data = NULL;\n \tstruct codegen_context cgctx;\n \tint pass;\n \tint flen;\n+\tint priv_stack_alloc_size;\n+\tvoid __percpu *priv_stack_ptr = NULL;\n \tstruct bpf_binary_header *fhdr = NULL;\n \tstruct bpf_binary_header *hdr = NULL;\n \tstruct bpf_prog *org_fp = fp;\n-\tstruct bpf_prog *tmp_fp;\n+\tstruct bpf_prog *tmp_fp = NULL;\n \tbool bpf_blinded = false;\n \tbool extra_pass = false;\n \tu8 *fimage = NULL;\n-\tu32 *fcode_base;\n+\tu32 *fcode_base = NULL;\n \tu32 extable_len;\n \tu32 fixup_len;\n \n@@ -173,6 +208,26 @@ struct bpf_prog *bpf_int_jit_compile(struct bpf_prog *fp)\n \t\tfp->aux->jit_data = jit_data;\n \t}\n \n+\tpriv_stack_ptr = fp->aux->priv_stack_ptr;\n+\tif (!priv_stack_ptr && fp->aux->jits_use_priv_stack) {\n+\t\t/*\n+\t\t * Allocate private stack of size equivalent to\n+\t\t * verifier-calculated stack size plus two memory\n+\t\t * guard regions to detect private stack overflow\n+\t\t * and underflow.\n+\t\t */\n+\t\tpriv_stack_alloc_size = round_up(fp->aux->stack_depth, 16) +\n+\t\t\t\t\t\t\t2 * PRIV_STACK_GUARD_SZ;\n+\t\tpriv_stack_ptr = __alloc_percpu_gfp(priv_stack_alloc_size, 16, GFP_KERNEL);\n+\t\tif (!priv_stack_ptr) {\n+\t\t\tfp = org_fp;\n+\t\t\tgoto out_priv_stack;\n+\t\t}\n+\n+\t\tpriv_stack_init_guard(priv_stack_ptr, priv_stack_alloc_size);\n+\t\tfp->aux->priv_stack_ptr = priv_stack_ptr;\n+\t}\n+\n \tflen = fp->len;\n \taddrs = jit_data->addrs;\n \tif (addrs) {\n@@ -209,6 +264,19 @@ struct bpf_prog *bpf_int_jit_compile(struct bpf_prog *fp)\n \tcgctx.is_subprog = bpf_is_subprog(fp);\n \tcgctx.exception_boundary = fp->aux->exception_boundary;\n \tcgctx.exception_cb = fp->aux->exception_cb;\n+\tcgctx.priv_sp = priv_stack_ptr;\n+\tcgctx.priv_stack_size = 0;\n+\tif (priv_stack_ptr) {\n+\t\t/*\n+\t\t * priv_stack_size required for setting bpf FP inside\n+\t\t * percpu allocation.\n+\t\t * stack_size is marked 0 to prevent allocation on\n+\t\t * general stack and offset calculation don't go for\n+\t\t * a toss in bpf_jit_stack_offsetof() & bpf_jit_stack_local()\n+\t\t */\n+\t\tcgctx.priv_stack_size = cgctx.stack_size;\n+\t\tcgctx.stack_size = 0;\n+\t}\n \n \t/* Scouting faux-generate pass 0 */\n \tif (bpf_jit_build_body(fp, NULL, NULL, &cgctx, addrs, 0, false)) {\n@@ -306,6 +374,11 @@ struct bpf_prog *bpf_int_jit_compile(struct bpf_prog *fp)\n \t\t}\n \t\tbpf_prog_fill_jited_linfo(fp, addrs);\n out_addrs:\n+\t\tif (!image && priv_stack_ptr) {\n+\t\t\tfp->aux->priv_stack_ptr = NULL;\n+\t\t\tfree_percpu(priv_stack_ptr);\n+\t\t}\n+out_priv_stack:\n \t\tkfree(addrs);\n \t\tkfree(jit_data);\n \t\tfp->aux->jit_data = NULL;\n@@ -419,6 +492,8 @@ void bpf_jit_free(struct bpf_prog *fp)\n \tif (fp->jited) {\n \t\tstruct powerpc_jit_data *jit_data = fp->aux->jit_data;\n \t\tstruct bpf_binary_header *hdr;\n+\t\tvoid __percpu *priv_stack_ptr;\n+\t\tint priv_stack_alloc_size;\n \n \t\t/*\n \t\t * If we fail the final pass of JIT (from jit_subprogs),\n@@ -432,6 +507,13 @@ void bpf_jit_free(struct bpf_prog *fp)\n \t\t}\n \t\thdr = bpf_jit_binary_pack_hdr(fp);\n \t\tbpf_jit_binary_pack_free(hdr, NULL);\n+\t\tpriv_stack_ptr = fp->aux->priv_stack_ptr;\n+\t\tif (priv_stack_ptr) {\n+\t\t\tpriv_stack_alloc_size = round_up(fp->aux->stack_depth, 16) +\n+\t\t\t\t\t\t\t2 * PRIV_STACK_GUARD_SZ;\n+\t\t\tpriv_stack_check_guard(priv_stack_ptr, priv_stack_alloc_size, fp);\n+\t\t\tfree_percpu(priv_stack_ptr);\n+\t\t}\n \t\tWARN_ON_ONCE(!bpf_prog_kallsyms_verify_off(fp));\n \t}\n \n@@ -453,6 +535,11 @@ bool bpf_jit_supports_kfunc_call(void)\n \treturn IS_ENABLED(CONFIG_PPC64);\n }\n \n+bool bpf_jit_supports_private_stack(void)\n+{\n+\treturn IS_ENABLED(CONFIG_PPC64);\n+}\n+\n bool bpf_jit_supports_arena(void)\n {\n \treturn IS_ENABLED(CONFIG_PPC64);\ndiff --git a/arch/powerpc/net/bpf_jit_comp64.c b/arch/powerpc/net/bpf_jit_comp64.c\nindex c5e26d231cd5..6670d8c69ade 100644\n--- a/arch/powerpc/net/bpf_jit_comp64.c\n+++ b/arch/powerpc/net/bpf_jit_comp64.c\n@@ -183,6 +183,24 @@ void bpf_jit_realloc_regs(struct codegen_context *ctx)\n {\n }\n \n+static void emit_fp_priv_stack(u32 *image, struct codegen_context *ctx)\n+{\n+\tPPC_LI64(bpf_to_ppc(BPF_REG_FP), (__force long)ctx->priv_sp);\n+\t/*\n+\t * Load base percpu pointer of private stack allocation.\n+\t * Runtime per-cpu address = (base + data_offset) + (guard + stack_size)\n+\t */\n+#ifdef CONFIG_SMP\n+\t/* Load percpu data offset */\n+\tEMIT(PPC_RAW_LD(bpf_to_ppc(TMP_REG_1), _R13,\n+\t\toffsetof(struct paca_struct, data_offset)));\n+\tEMIT(PPC_RAW_ADD(bpf_to_ppc(BPF_REG_FP),\n+\t\tbpf_to_ppc(TMP_REG_1), bpf_to_ppc(BPF_REG_FP)));\n+#endif\n+\tEMIT(PPC_RAW_ADDI(bpf_to_ppc(BPF_REG_FP), bpf_to_ppc(BPF_REG_FP),\n+\t\t\tPRIV_STACK_GUARD_SZ + round_up(ctx->priv_stack_size, 16)));\n+}\n+\n /*\n * For exception boundary & exception_cb progs:\n * return increased size to accommodate additional NVRs.\n@@ -307,9 +325,16 @@ void bpf_jit_build_prologue(u32 *image, struct codegen_context *ctx)\n \t * Exception_cb not restricted from using stack area or arena.\n \t * Setup frame pointer to point to the bpf stack area\n \t */\n-\tif (bpf_is_seen_register(ctx, bpf_to_ppc(BPF_REG_FP)))\n-\t\tEMIT(PPC_RAW_ADDI(bpf_to_ppc(BPF_REG_FP), _R1,\n-\t\t\tSTACK_FRAME_MIN_SIZE + ctx->stack_size));\n+\tif (bpf_is_seen_register(ctx, bpf_to_ppc(BPF_REG_FP))) {\n+\t\tif (ctx->priv_sp) {\n+\t\t\t/* Set up fp in private stack */\n+\t\t\temit_fp_priv_stack(image, ctx);\n+\t\t} else {\n+\t\t\t/* Setup frame pointer to point to the bpf stack area */\n+\t\t\tEMIT(PPC_RAW_ADDI(bpf_to_ppc(BPF_REG_FP), _R1,\n+\t\t\t\tSTACK_FRAME_MIN_SIZE + ctx->stack_size));\n+\t\t}\n+\t}\n \n \tif (ctx->arena_vm_start)\n \t\tPPC_LI64(bpf_to_ppc(ARENA_VM_START), ctx->arena_vm_start);\n", "prefixes": [ "v7", "1/2" ] }