Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/2196741/?format=api
{ "id": 2196741, "url": "http://patchwork.ozlabs.org/api/patches/2196741/?format=api", "web_url": "http://patchwork.ozlabs.org/project/linuxppc-dev/patch/20260216152234.36632-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": "<20260216152234.36632-1-adubey@linux.ibm.com>", "list_archive_url": "https://lore.kernel.org/linuxppc-dev/20260216152234.36632-1-adubey@linux.ibm.com/", "date": "2026-02-16T15:22:33", "name": "[1/2] powerpc64/bpf: Implement JIT support for private stack", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "3f0ba9b369df42da81b55bbfc1aa8218904a0c83", "submitter": { "id": 88541, "url": "http://patchwork.ozlabs.org/api/people/88541/?format=api", "name": "Abhishek Dubey", "email": "adubey@linux.ibm.com" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/linuxppc-dev/patch/20260216152234.36632-1-adubey@linux.ibm.com/mbox/", "series": [ { "id": 492278, "url": "http://patchwork.ozlabs.org/api/series/492278/?format=api", "web_url": "http://patchwork.ozlabs.org/project/linuxppc-dev/list/?series=492278", "date": "2026-02-16T15:22:33", "name": "[1/2] powerpc64/bpf: Implement JIT support for private stack", "version": 1, "mbox": "http://patchwork.ozlabs.org/series/492278/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/2196741/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/2196741/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "\n <linuxppc-dev+bounces-16877-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=UMCBjrxl;\n\tdkim-atps=neutral", "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=lists.ozlabs.org\n (client-ip=2404:9400:21b9:f100::1; helo=lists.ozlabs.org;\n envelope-from=linuxppc-dev+bounces-16877-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=UMCBjrxl;\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\n [IPv6:2404:9400:21b9:f100::1])\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 4fDzP91slWz1xpY\n\tfor <incoming@patchwork.ozlabs.org>; Mon, 16 Feb 2026 21:22:52 +1100 (AEDT)", "from boromir.ozlabs.org (localhost [127.0.0.1])\n\tby lists.ozlabs.org (Postfix) with ESMTP id 4fDzP243G3z2ySS;\n\tMon, 16 Feb 2026 21:22:46 +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 4fDzP12PLWz2xN4\n\tfor <linuxppc-dev@lists.ozlabs.org>; Mon, 16 Feb 2026 21:22:44 +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 61FNiNml1731753;\n\tMon, 16 Feb 2026 10:22:20 GMT", "from ppma12.dal12v.mail.ibm.com\n (dc.9e.1632.ip4.static.sl-reverse.com [50.22.158.220])\n\tby mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4cajcj6qn1-1\n\t(version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT);\n\tMon, 16 Feb 2026 10:22:20 +0000 (GMT)", "from pps.filterd (ppma12.dal12v.mail.ibm.com [127.0.0.1])\n\tby ppma12.dal12v.mail.ibm.com (8.18.1.2/8.18.1.2) with ESMTP id\n 61G6baxO012709;\n\tMon, 16 Feb 2026 10:22:19 GMT", "from smtprelay01.fra02v.mail.ibm.com ([9.218.2.227])\n\tby ppma12.dal12v.mail.ibm.com (PPS) with ESMTPS id 4cb3crw39j-1\n\t(version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT);\n\tMon, 16 Feb 2026 10:22:19 +0000", "from smtpav06.fra02v.mail.ibm.com (smtpav06.fra02v.mail.ibm.com\n [10.20.54.105])\n\tby smtprelay01.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id\n 61GAMFUX57606504\n\t(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK);\n\tMon, 16 Feb 2026 10:22:15 GMT", "from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1])\n\tby IMSVA (Postfix) with ESMTP id A18E720049;\n\tMon, 16 Feb 2026 10:22:15 +0000 (GMT)", "from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1])\n\tby IMSVA (Postfix) with ESMTP id 4D0CD2004B;\n\tMon, 16 Feb 2026 10:22:13 +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\tMon, 16 Feb 2026 10:22:13 +0000 (GMT)" ], "ARC-Seal": "i=1; a=rsa-sha256; d=lists.ozlabs.org; s=201707; t=1771237366;\n\tcv=none;\n b=B8/pZixrngzVYy7oUnD9RD0skLYF5AGGl/gUh5rN71TjM07fTyz7vdQ89MZIuAGGJT6XcHOoV9A1a1YAylgmGMFamrfDvNQM/Qhn+tnzeSl9I2dgCZAgfrbqC4x48JwqXhkWK+7L0u+kuvFBIhsyjxHm6Xykn3osCazSwQDPH1OrTJLjP86lU4UAOdM4OBQincse6ccca7WLe7j9M6AwWVg9Uz/wqPvFTZvYREKO7zxStPf8RxnoN1eY8eZjOJVvM2Z8DL9rXi13U8z7EWA//C2MJx3WfNDX3LxeMtBFn7HvtbAXYBp1J40Z+YsfhCg/Ym1ivSv6ru9+zxFfGVPxmQ==", "ARC-Message-Signature": "i=1; a=rsa-sha256; d=lists.ozlabs.org; s=201707;\n\tt=1771237366; c=relaxed/relaxed;\n\tbh=Eom+h3mB7WCszSDoHhlS/sDtmGmLLxyusAv+KtbCsGA=;\n\th=From:To:Cc:Subject:Date:Message-ID:MIME-Version;\n b=drtWrBB5RbouyRjuKYL26xuPcqg3V8K0g06uDsO8Et1eyuLN/nlVo1NY4KwL0JpqDYl/4m2+GBQgfX05FGMOc/gvq/QwfK2tFSNlDBYLFyeHN/DOj9l9MpRIPGWk9FqKTOWirWyX0B1CZcK4JUpd7a+sZsVv5hCGqcBiMhOxNuab2ETr2HgNSGz4EAdAQQHN3ACI4EHmeeK7uZ9dBnfVt2NRdfZU++1b21IqgnWZ3d38y8r9oJ6IF8n3BxoT3cfxEYW/Jt4OuSPZpxRixNWS2+Il8JjPQmFT3eAiP0+qaEVG3Tvf/ev7LhgGhDcHQXvADu0oqMMnxtSYI9XLvIFYBw==", "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=UMCBjrxl; 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=Eom+h3mB7WCszSDoHhlS/sDtmGmLLxyusAv+KtbCs\n\tGA=; b=UMCBjrxlCjlh3ZTlsbvcNlmAI23Bk+VeMPoQ9a3RWihhnT73AUefghxSU\n\tRLHF/cxpqCXxgE2OxLDtKklJgimHULfUnarPxjX347qyVVvsVYsQz99vgTpnvZ9/\n\tRiKOOiisKK+QC4NLK/g3FGMf6y5mb59JtUXxNAtRXdYXDdV/pBdAwBm6surCyXXr\n\thldsVwKi28v4TY3sM923xG18RHyoDMq+i1cLkoFrikUCAyZLQ18NxUdY0GsDPXF2\n\tjR4mqjXFNpKfKxq7x61r7/QgYWxM4lV5HNeSdhWJkrTk2Uewdi11vRA+9Vsw39FJ\n\tTa3jpS7sKU2OWH4QiRX13pDVT/8wA==", "From": "adubey@linux.ibm.com", "To": "bpf@vger.kernel.org", "Cc": "hbathini@linux.ibm.com, linuxppc-dev@lists.ozlabs.org, ast@kernel.org,\n daniel@iogearbox.net, andrii@kernel.org, martin.lau@kernel.org,\n eddyz87@gmail.com, yonghong.song@linux.dev, clm@meta.com,\n ihor.solodrai@linux.dev, chleroy@kernel.org,\n Abhishek Dubey <adubey@linux.ibm.com>", "Subject": "[PATCH 1/2] powerpc64/bpf: Implement JIT support for private stack", "Date": "Mon, 16 Feb 2026 10:22:33 -0500", "Message-ID": "<20260216152234.36632-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-Reinject": "loops=2 maxloops=12", "X-Proofpoint-ORIG-GUID": "XzMDQ7tZ9W1Kqg5mOl3Dep3viRcScAxZ", "X-Authority-Analysis": "v=2.4 cv=Md9hep/f c=1 sm=1 tr=0 ts=6992efdc cx=c_pps\n a=bLidbwmWQ0KltjZqbj+ezA==:117 a=bLidbwmWQ0KltjZqbj+ezA==:17\n a=HzLeVaNsDn8A:10 a=VkNPw1HP01LnGYTKEx00:22 a=Mpw57Om8IfrbqaoTuvik:22\n a=GgsMoib0sEa3-_RKJdDe:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8\n a=A8mRDSlWM7J1pTn1j8wA:9", "X-Proofpoint-Spam-Details-Enc": "AW1haW4tMjYwMjE2MDA4NSBTYWx0ZWRfX2KxewgMASKc4\n tGjnJhX0zbHl9t8mZAgySd9zdlebnE4WyTuVmcsilHvKKmQl8ouaL7MSebgGLoTUwoaLmfBe1+P\n BijvN1nOe2Z2JnODVq/hwdQVtnZ/Mno507Oq7Mbz4K35F6LBjmzPsHWc5UG1Bw2d7OPsoUewh/C\n aIKAsY6uGxDk4nsqpvqV3Jv9qeeKc2x7d6bEHbJZO7ngNXlzy7PWgyVe49xTy20SSJ7/3Wr3f9g\n 8sliAxFKylqA2afPTxNXP0n4BrGa3OIjuFyy951QjllPKnqvjX3fJ6XQwwb7vCGG69VAkWpz77O\n RvWd5J4Sp7d6FbtTtet39Oqz37JVozXf1XsSQFeiedSkKbFCAmIVOZaW98U3e0WubnUFhCzW6Y+\n t1LmdQrG/V9f1n7vQ3ofD2XsnOi6uS+1oZOvVO3U67hOdlrYnT/2E5fOZtEYQ2f1n0YdJ+v4vkF\n 10v0Fewe95Q0DBTLC4w==", "X-Proofpoint-GUID": "9FbaGHNwQ_D3s_ZrsejfcYXGMDOZ_R9k", "X-Proofpoint-Virus-Version": "vendor=baseguard\n engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49\n definitions=2026-02-16_04,2026-02-16_01,2025-10-01_01", "X-Proofpoint-Spam-Details": "rule=outbound_notspam policy=outbound score=0\n clxscore=1011 impostorscore=0 lowpriorityscore=0 spamscore=0 adultscore=0\n priorityscore=1501 suspectscore=0 malwarescore=0 phishscore=0 bulkscore=0\n classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0\n reason=mlx scancount=1 engine=8.22.0-2601150000 definitions=main-2602160085", "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\nThe patch is rebase over fixes by Hari:\nhttps://lore.kernel.org/bpf/20260216065639.1750181-1-hbathini@linux.ibm.com/T/#mf02cad9096fa4ad1f05610b1f464da1cddf7445a\n\nSigned-off-by: Abhishek Dubey <adubey@linux.ibm.com>\n---\n arch/powerpc/net/bpf_jit.h | 5 +++\n arch/powerpc/net/bpf_jit_comp.c | 74 +++++++++++++++++++++++++++++++\n arch/powerpc/net/bpf_jit_comp64.c | 38 +++++++++++++---\n 3 files changed, 112 insertions(+), 5 deletions(-)", "diff": "diff --git a/arch/powerpc/net/bpf_jit.h b/arch/powerpc/net/bpf_jit.h\nindex 7354e1d72f79..5a115c54e43a 100644\n--- a/arch/powerpc/net/bpf_jit.h\n+++ b/arch/powerpc/net/bpf_jit.h\n@@ -178,8 +178,13 @@ struct codegen_context {\n \tbool is_subprog;\n \tbool exception_boundary;\n \tbool exception_cb;\n+\tu64 priv_sp;\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 278e09b57560..7a78e03d482f 100644\n--- a/arch/powerpc/net/bpf_jit_comp.c\n+++ b/arch/powerpc/net/bpf_jit_comp.c\n@@ -129,6 +129,39 @@ 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 %sx\\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@@ -140,6 +173,8 @@ struct bpf_prog *bpf_int_jit_compile(struct bpf_prog *fp)\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@@ -173,6 +208,25 @@ struct bpf_prog *bpf_int_jit_compile(struct bpf_prog *fp)\n \t\tfp->aux->jit_data = jit_data;\n \t}\n \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 +263,7 @@ 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 ? (u64)priv_stack_ptr : 0;\n \n \t/* Scouting faux-generate pass 0 */\n \tif (bpf_jit_build_body(fp, NULL, NULL, &cgctx, addrs, 0, false)) {\n@@ -306,7 +361,12 @@ 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\tfree_percpu(priv_stack_ptr);\n+\t\t\tfp->aux->priv_stack_ptr = NULL;\n+\t\t}\n \t\tkfree(addrs);\n+out_priv_stack:\n \t\tkfree(jit_data);\n \t\tfp->aux->jit_data = NULL;\n \t} else {\n@@ -419,6 +479,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 +494,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 +522,11 @@ bool bpf_jit_supports_kfunc_call(void)\n \treturn true;\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 640b84409687..206ef43b4090 100644\n--- a/arch/powerpc/net/bpf_jit_comp64.c\n+++ b/arch/powerpc/net/bpf_jit_comp64.c\n@@ -183,6 +183,20 @@ 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, void __percpu *ptr)\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), (u64)ptr);\n+\t/*\n+\t * Set frame pointer with percpu allocated\n+\t * buffer for private stack.\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+}\n+\n /*\n * For exception boundary & exception_cb progs:\n * return increased size to accommodate additional NVRs.\n@@ -197,6 +211,12 @@ static int bpf_jit_stack_size(struct codegen_context *ctx)\n void bpf_jit_build_prologue(u32 *image, struct codegen_context *ctx)\n {\n \tint i;\n+\tvoid __percpu *priv_frame_ptr = NULL;\n+\n+\tif (ctx->priv_sp) {\n+\t\tpriv_frame_ptr = (void*) ctx->priv_sp + PRIV_STACK_GUARD_SZ +\n+\t\t\t\t\tround_up(ctx->stack_size, 16);\n+\t}\n \n \t/* Instruction for trampoline attach */\n \tEMIT(PPC_RAW_NOP());\n@@ -251,7 +271,7 @@ void bpf_jit_build_prologue(u32 *image, struct codegen_context *ctx)\n \t\t}\n \n \t\tEMIT(PPC_RAW_STDU(_R1, _R1,\n-\t\t\t\t-(bpf_jit_stack_size(ctx) + ctx->stack_size)));\n+\t\t\t-(bpf_jit_stack_size(ctx) + (ctx->priv_sp ? 0 : ctx->stack_size))));\n \t}\n \n \t/*\n@@ -307,9 +327,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 && priv_frame_ptr) {\n+\t\t\t/* Set up private stack pointer */\n+\t\t\temit_fp_priv_stack(image, ctx, priv_frame_ptr);\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@@ -339,7 +366,8 @@ static void bpf_jit_emit_common_epilogue(u32 *image, struct codegen_context *ctx\n \n \t/* Tear down our stack frame */\n \tif (bpf_has_stack_frame(ctx)) {\n-\t\tEMIT(PPC_RAW_ADDI(_R1, _R1, bpf_jit_stack_size(ctx) + ctx->stack_size));\n+\t\tEMIT(PPC_RAW_ADDI(_R1, _R1,\n+\t\t\tbpf_jit_stack_size(ctx) + (ctx->priv_sp ? 0 : ctx->stack_size)));\n \n \t\tif (ctx->seen & SEEN_FUNC || ctx->exception_cb) {\n \t\t\tEMIT(PPC_RAW_LD(_R0, _R1, PPC_LR_STKOFF));\n", "prefixes": [ "1/2" ] }