Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/2217947/?format=api
{ "id": 2217947, "url": "http://patchwork.ozlabs.org/api/patches/2217947/?format=api", "web_url": "http://patchwork.ozlabs.org/project/linuxppc-dev/patch/20260331080309.173612-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": "<20260331080309.173612-1-adubey@linux.ibm.com>", "list_archive_url": "https://lore.kernel.org/linuxppc-dev/20260331080309.173612-1-adubey@linux.ibm.com/", "date": "2026-03-31T08:03:08", "name": "[v6,1/2] powerpc64/bpf: Implement JIT support for private stack", "commit_ref": null, "pull_url": null, "state": "changes-requested", "archived": false, "hash": "4bae87ca7f0643de751a2575eef1ddcf4711e218", "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/20260331080309.173612-1-adubey@linux.ibm.com/mbox/", "series": [ { "id": 498121, "url": "http://patchwork.ozlabs.org/api/series/498121/?format=api", "web_url": "http://patchwork.ozlabs.org/project/linuxppc-dev/list/?series=498121", "date": "2026-03-31T08:03:08", "name": "[v6,1/2] powerpc64/bpf: Implement JIT support for private stack", "version": 6, "mbox": "http://patchwork.ozlabs.org/series/498121/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/2217947/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/2217947/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "\n <linuxppc-dev+bounces-19042-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=NO6gKfaH;\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-19042-incoming=patchwork.ozlabs.org@lists.ozlabs.org;\n receiver=patchwork.ozlabs.org)", "lists.ozlabs.org;\n arc=none smtp.remote-ip=148.163.156.1", "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=NO6gKfaH;\n\tdkim-atps=neutral", "lists.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=linux.ibm.com\n (client-ip=148.163.156.1; helo=mx0a-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 4flDxJ2vHDz1y1q\n\tfor <incoming@patchwork.ozlabs.org>; Tue, 31 Mar 2026 15:03:15 +1100 (AEDT)", "from boromir.ozlabs.org (localhost [127.0.0.1])\n\tby lists.ozlabs.org (Postfix) with ESMTP id 4flDxG2J5wz2yd7;\n\tTue, 31 Mar 2026 15:03:14 +1100 (AEDT)", "from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com\n [148.163.156.1])\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 4flDxF10qTz2xlK\n\tfor <linuxppc-dev@lists.ozlabs.org>; Tue, 31 Mar 2026 15:03:12 +1100 (AEDT)", "from pps.filterd (m0353729.ppops.net [127.0.0.1])\n\tby mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id\n 62UDn7cY4097773;\n\tTue, 31 Mar 2026 04:02:55 GMT", "from ppma11.dal12v.mail.ibm.com\n (db.9e.1632.ip4.static.sl-reverse.com [50.22.158.219])\n\tby mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4d66nnhj85-1\n\t(version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT);\n\tTue, 31 Mar 2026 04:02:55 +0000 (GMT)", "from pps.filterd (ppma11.dal12v.mail.ibm.com [127.0.0.1])\n\tby ppma11.dal12v.mail.ibm.com (8.18.1.2/8.18.1.2) with ESMTP id\n 62V2nvjh008698;\n\tTue, 31 Mar 2026 04:02:54 GMT", "from smtprelay06.fra02v.mail.ibm.com ([9.218.2.230])\n\tby ppma11.dal12v.mail.ibm.com (PPS) with ESMTPS id 4d6v11f99u-1\n\t(version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT);\n\tTue, 31 Mar 2026 04:02:54 +0000", "from smtpav06.fra02v.mail.ibm.com (smtpav06.fra02v.mail.ibm.com\n [10.20.54.105])\n\tby smtprelay06.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id\n 62V42oEs27329016\n\t(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK);\n\tTue, 31 Mar 2026 04:02:50 GMT", "from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1])\n\tby IMSVA (Postfix) with ESMTP id 45E9020040;\n\tTue, 31 Mar 2026 04:02:50 +0000 (GMT)", "from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1])\n\tby IMSVA (Postfix) with ESMTP id AC89C20049;\n\tTue, 31 Mar 2026 04:02:48 +0000 (GMT)", "from ltcrain4-lp15.ltc.tadn.ibm.com (unknown [9.5.7.39])\n\tby smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP;\n\tTue, 31 Mar 2026 04:02:48 +0000 (GMT)" ], "ARC-Seal": "i=1; a=rsa-sha256; d=lists.ozlabs.org; s=201707; t=1774929794;\n\tcv=none;\n b=jKu3yR4Syoxly0Uoe1YPLiUpS+cj14dE+mRH0O4kyAK7EV2D038GKCZSsVkRtq8IVyEtd9M9lAkRB++SEDffGZ/8cQnhse7xX8EK/fn6c7gnmv6HKSsSABAxxdDrnW1ek4i9mMQunwH5MRKjJRwkAVwY6zAXY6w6IVhI1tKmh07ZH/2ugqHaMAoeFMqRRLcqBtvTdXT9IpV2oODF2ryZJPVaz3ih69tt+896GWpGWC/KsmgDyzfxy4MUbKl042ROHYfd4UrJfGvEWLcs5vwmWIoNxinSUQvBDvfWdYI3q7d8bpZlgLLzTqluM/dOA1mZEdV2IYk6x0chvAIxkSCmPQ==", "ARC-Message-Signature": "i=1; a=rsa-sha256; d=lists.ozlabs.org; s=201707;\n\tt=1774929794; c=relaxed/relaxed;\n\tbh=M1jqH6WLUcbFQ4A1JwnDqZdiJNv2m5S0+rWs5RxTSbw=;\n\th=From:To:Cc:Subject:Date:Message-ID:MIME-Version;\n b=GVV2uq+mgw8VxVRgspRakqADPxfvCzu64QhWt9a7qydgcsAdyV4jKuMMiJQL4h1td2x3lDcmfsBe56ds9bWjcfZjh4B7xd+QMWkOiwgkE0uxbw4KYgsBBp0TQKDL6uaUi0rEwnbkYp7fvkwyK3ZaEmzguOW+725Y80tXeRh6ZhuyfRn45zGaUjXhXXqAawtfstsdmH1BbAyAx4M3IbaGpMx/+EPYYefm78JIdkfFV7wWv69iJY5LOT4MAZ0PjzFAkFu4CAC0kf1I90rlbyZhKSjtOygDYi7KUjIF4zdpTNhLjT+YlhlMoMg/muk4ay4nhC5utQv9+VxYFg75pbAyBQ==", "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=NO6gKfaH; dkim-atps=neutral;\n spf=pass (client-ip=148.163.156.1; helo=mx0a-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=M1jqH6WLUcbFQ4A1JwnDqZdiJNv2m5S0+rWs5RxTS\n\tbw=; b=NO6gKfaHXGAGH9M6W1YHT+IMWT+/O6o3zivfs/imW+e+aEky1E/ztiYXU\n\tcMf0M/599s/NXJbM8aNaZrIm2opONlt908/Te8u2wOApTQFlxG2KmyDoar0HbtfF\n\tISzpghSYA1rJtgMGw2GutM6dyGimkZ+cqKQ2abTvSgAa0MNXBsVy95wWfltm/g9S\n\tdnPE498x3LEA0AXcofNm4y18yLeKfQxK/VJ3PvbXTuW30QajPHvajPK2RoLmW4V8\n\tyfHprXLrriTP40z4Wt1XoL9r4/3+7IuR3gxUAgQKsRMOwahGQxNepJlzhhMAhez4\n\tiEBklpj68SfF/sT0kQkbRGqNxjCgg==", "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 Abhishek Dubey <adubey@linux.ibm.com>", "Subject": "[PATCH v6 1/2] powerpc64/bpf: Implement JIT support for private stack", "Date": "Tue, 31 Mar 2026 04:03:08 -0400", "Message-ID": "<20260331080309.173612-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-Proofpoint-GUID": "TLuJdK-BWnWeG1Gkalps0MRbOpaBrdeZ", "X-Authority-Analysis": "v=2.4 cv=KslAGGWN c=1 sm=1 tr=0 ts=69cb476f cx=c_pps\n a=aDMHemPKRhS1OARIsFnwRA==:117 a=aDMHemPKRhS1OARIsFnwRA==:17\n a=Yq5XynenixoA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22\n a=uAbxVGIbfxUO_5tXvNgY:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8\n a=A8mRDSlWM7J1pTn1j8wA:9", "X-Proofpoint-Spam-Details-Enc": "AW1haW4tMjYwMzMxMDAzMyBTYWx0ZWRfX2sK2pR/fuZKv\n pkdVpdDOoDpFUGN7mOkUZjugMNdva9t0qZx5Ru5HZKKeSqw/dekSo/D5jXbzxs+6r1E+3kZedqK\n eagFYuo89eIzFMsn32JHA2HQT1s4CPnSM3avYfcecccVkOsat0Mgj/yk0YqKGwBNTbW10/Vpoas\n NnxvQfrsfw6uF3FlFXiMzeU2mzi2V0GaPcOYhGpVvRgX6ULvogHZy8AaWTho5/KP3fASHOIubMV\n rUHD6eMTYwCppni70P9IGiyL7VfSkA51bUyZQHTdd4dAC0qSxXeaelLp4ZxKsR42witPoYi8PfY\n IjXZJ+UwWjzJx0XfuhulE0o3LPfvQN49IR0f0/YGiA3CizEVUC4uJEuKWzBihPhm06wj8lwcJRq\n tYnGLsQYU/fT/QtNfqsC/kV1wtkrXpGAOpyAHLMWTrcSC4IVDlLs0h+E5zETzdQFceggrWRrilm\n oIgBOlVQ9m2QPrJgkkA==", "X-Proofpoint-ORIG-GUID": "TLuJdK-BWnWeG1Gkalps0MRbOpaBrdeZ", "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-03-31_01,2026-03-28_01,2025-10-01_01", "X-Proofpoint-Spam-Details": "rule=outbound_notspam policy=outbound score=0\n malwarescore=0 lowpriorityscore=0 priorityscore=1501 suspectscore=0\n phishscore=0 adultscore=0 bulkscore=0 impostorscore=0 clxscore=1015\n spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound\n adjust=0 reason=mlx scancount=1 engine=8.22.0-2603050001\n definitions=main-2603310033", "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\nv5->v6:\n No change\nv4->v5:\n Rebasing over latest changes\nv3->v4:\n Added new field to fix priv_stack allocation\nv2->v3:\n Fix ci-bot bug targeting clobbered NVRs on stack rollback\nv1->v2:\n Fix ci-bot warning for percpu pointer casting\n Minor refactoring\n\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\nSigned-off-by: Abhishek Dubey <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 | 29 ++++++++-\n 3 files changed, 124 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..8101e098d125 100644\n--- a/arch/powerpc/net/bpf_jit_comp64.c\n+++ b/arch/powerpc/net/bpf_jit_comp64.c\n@@ -183,6 +183,22 @@ 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+\t/* Load percpu data offset */\n+\tEMIT(PPC_RAW_LD(bpf_to_ppc(TMP_REG_1), _R13,\n+\t\t\toffsetof(struct paca_struct, data_offset)));\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+\tEMIT(PPC_RAW_ADD(bpf_to_ppc(BPF_REG_FP),\n+\t\t\tbpf_to_ppc(TMP_REG_1), bpf_to_ppc(BPF_REG_FP)));\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 +323,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": [ "v6", "1/2" ] }