[{"id":3672716,"web_url":"http://patchwork.ozlabs.org/comment/3672716/","msgid":"<d8c9c8dd-a544-4f5d-81c6-6041b5e806b1@linux.ibm.com>","date":"2026-04-02T13:15:53","subject":"Re: [PATCH] powerpc64/bpf: Add powerpc64 JIT support for timed\n may_goto","submitter":{"id":74073,"url":"http://patchwork.ozlabs.org/api/people/74073/","name":"Hari Bathini","email":"hbathini@linux.ibm.com"},"content":"On 02/04/26 11:12 am, Saket Kumar Bhaskar wrote:\n> When verifier sees a timed may_goto instruction, it emits a call to\n> arch_bpf_timed_may_goto() with a stack offset in BPF_REG_AX\n> (powerpc64 R12) and expects the refreshed count value to be returned\n> in the same register. The verifier doesn't save or restore any registers\n> before emitting this call.\n> \n> arch_bpf_timed_may_goto() should act as a trampoline to call\n> bpf_check_timed_may_goto() with powerpc64 ELF ABI calling convention.\n> \n> To support this custom calling convention, implement\n> arch_bpf_timed_may_goto() in assembly and make sure BPF caller saved\n> registers are preserved, then call bpf_check_timed_may_goto with\n> the powerpc64 ABI calling convention where first argument and return\n> value both are in R3. Finally, move the result back into BPF_REG_AX(R12)\n> before returning.\n> \n> Also, introduce bpf_jit_emit_func_call() that computes the offset from\n> kernel_toc_addr(), validates that the target and emits the ADDIS/ADDI\n> sequence to load the function address before performing the indirect\n> branch via MTCTR/BCTRL. The existing code in bpf_jit_emit_func_call_rel()\n> is refactored to use this function.\n> \n> Signed-off-by: Saket Kumar Bhaskar <skb99@linux.ibm.com>\n> ---\n>   arch/powerpc/net/Makefile             |  2 +-\n>   arch/powerpc/net/bpf_jit_comp.c       |  5 +++\n>   arch/powerpc/net/bpf_jit_comp64.c     | 59 ++++++++++++++++++++++-----\n>   arch/powerpc/net/bpf_timed_may_goto.S | 57 ++++++++++++++++++++++++++\n>   4 files changed, 111 insertions(+), 12 deletions(-)\n>   create mode 100644 arch/powerpc/net/bpf_timed_may_goto.S\n> \n> diff --git a/arch/powerpc/net/Makefile b/arch/powerpc/net/Makefile\n> index 8e60af32e51e..204fc57ac56e 100644\n> --- a/arch/powerpc/net/Makefile\n> +++ b/arch/powerpc/net/Makefile\n> @@ -2,4 +2,4 @@\n>   #\n>   # Arch-specific network modules\n>   #\n> -obj-$(CONFIG_BPF_JIT) += bpf_jit_comp.o bpf_jit_comp$(BITS).o\n> +obj-$(CONFIG_BPF_JIT) += bpf_jit_comp.o bpf_jit_comp$(BITS).o bpf_timed_may_goto.o\n\nAs this is currently only enabled for CONFIG_PPC64, bpf_timed_may_goto.o\nshould be compiled conditionally for PPC64:\n\nifdef CONFIG_PPC64\nobj-$(CONFIG_BPF_JIT) += bpf_timed_may_goto.o\nendif\n\n> diff --git a/arch/powerpc/net/bpf_jit_comp.c b/arch/powerpc/net/bpf_jit_comp.c\n> index 50103b3794fb..9b2b456b0765 100644\n> --- a/arch/powerpc/net/bpf_jit_comp.c\n> +++ b/arch/powerpc/net/bpf_jit_comp.c\n> @@ -537,6 +537,11 @@ bool bpf_jit_supports_subprog_tailcalls(void)\n>   \treturn IS_ENABLED(CONFIG_PPC64);\n>   }\n>   \n> +bool bpf_jit_supports_timed_may_goto(void)\n> +{\n> +\treturn IS_ENABLED(CONFIG_PPC64);\n> +}\n> +\n>   bool bpf_jit_supports_kfunc_call(void)\n>   {\n>   \treturn IS_ENABLED(CONFIG_PPC64);\n> diff --git a/arch/powerpc/net/bpf_jit_comp64.c b/arch/powerpc/net/bpf_jit_comp64.c\n> index db364d9083e7..d39241444cd9 100644\n> --- a/arch/powerpc/net/bpf_jit_comp64.c\n> +++ b/arch/powerpc/net/bpf_jit_comp64.c\n> @@ -451,10 +451,28 @@ void arch_bpf_stack_walk(bool (*consume_fn)(void *, u64, u64, u64), void *cookie\n>   \t}\n>   }\n>   \n> +static int bpf_jit_emit_func_call(u32 *image, struct codegen_context *ctx, u64 func_addr, int reg)\n> +{\n\n> +\tlong reladdr;\n> +\n> +\treladdr = func_addr - kernel_toc_addr();\n\nlong reladdr = func_addr - kernel_toc_addr();\n\n> +\tif (reladdr > 0x7FFFFFFF || reladdr < -(0x80000000L)) {\n> +\t\tpr_err(\"eBPF: address of %ps out of range of kernel_toc.\\n\", (void *)func_addr);\n> +\t\treturn -ERANGE;\n> +\t}\n> +\n> +\tEMIT(PPC_RAW_ADDIS(reg, _R2, PPC_HA(reladdr)));\n> +\tEMIT(PPC_RAW_ADDI(reg, reg, PPC_LO(reladdr)));\n> +\tEMIT(PPC_RAW_MTCTR(reg));\n> +\tEMIT(PPC_RAW_BCTRL());\n> +\n> +\treturn 0;\n> +}\n> +\n>   int bpf_jit_emit_func_call_rel(u32 *image, u32 *fimage, struct codegen_context *ctx, u64 func)\n>   {\n>   \tunsigned long func_addr = func ? ppc_function_entry((void *)func) : 0;\n> -\tlong reladdr;\n> +\tint ret;\n>   \n>   \t/* bpf to bpf call, func is not known in the initial pass. Emit 5 nops as a placeholder */\n>   \tif (!func) {\n> @@ -469,6 +487,7 @@ int bpf_jit_emit_func_call_rel(u32 *image, u32 *fimage, struct codegen_context *\n>   \t}\n>   \n>   #ifdef CONFIG_PPC_KERNEL_PCREL\n\n> +\tlong reladdr;\n\nWhile this works with modern C standard, I would be conservative and let\nthis be at the start of the function itself..\n\n>   \treladdr = func_addr - local_paca->kernelbase;\n>   \n>   \t/*\n> @@ -507,16 +526,9 @@ int bpf_jit_emit_func_call_rel(u32 *image, u32 *fimage, struct codegen_context *\n>   \tEMIT(PPC_RAW_BCTRL());\n>   #else\n>   \tif (core_kernel_text(func_addr)) {\n> -\t\treladdr = func_addr - kernel_toc_addr();\n> -\t\tif (reladdr > 0x7FFFFFFF || reladdr < -(0x80000000L)) {\n> -\t\t\tpr_err(\"eBPF: address of %ps out of range of kernel_toc.\\n\", (void *)func);\n> -\t\t\treturn -ERANGE;\n> -\t\t}\n> -\n> -\t\tEMIT(PPC_RAW_ADDIS(_R12, _R2, PPC_HA(reladdr)));\n> -\t\tEMIT(PPC_RAW_ADDI(_R12, _R12, PPC_LO(reladdr)));\n> -\t\tEMIT(PPC_RAW_MTCTR(_R12));\n> -\t\tEMIT(PPC_RAW_BCTRL());\n> +\t\tret = bpf_jit_emit_func_call(image, ctx, func_addr, _R12);\n> +\t\tif (ret)\n> +\t\t\treturn ret;\n>   \t} else {\n>   \t\tif (IS_ENABLED(CONFIG_PPC64_ELF_ABI_V1)) {\n>   \t\t\t/* func points to the function descriptor */\n> @@ -1755,6 +1767,31 @@ int bpf_jit_build_body(struct bpf_prog *fp, u32 *image, u32 *fimage, struct code\n>   \t\t\tif (ret < 0)\n>   \t\t\t\treturn ret;\n>   \n> +\t\t\t/*\n> +\t\t\t * Call to arch_bpf_timed_may_goto() is emitted by the\n> +\t\t\t * verifier and called with custom calling convention with\n> +\t\t\t * first argument and return value in BPF_REG_AX (_R12).\n> +\t\t\t *\n> +\t\t\t * The generic helper or bpf function call emission path\n> +\t\t\t * may use the same scratch register as BPF_REG_AX to\n> +\t\t\t * materialize the target address. This would clobber AX\n> +\t\t\t * and break timed may_goto semantics.\n> +\t\t\t *\n> +\t\t\t * Emit a minimal indirect call sequence here using a temp\n> +\t\t\t * register and skip the normal post-call return-value move.\n> +\t\t\t */\n> +\n> +\t\t\tif (func_addr == (u64)arch_bpf_timed_may_goto) {\n\n> +#ifdef CONFIG_PPC_KERNEL_PCREL\n> +\t\t\t\tPPC_LI_ADDR(tmp1_reg, func_addr);\n> +\t\t\t\tEMIT(PPC_RAW_MTCTR(tmp1_reg));\n> +\t\t\t\tEMIT(PPC_RAW_BCTRL());\n> +#else\n> +\t\t\t\tbpf_jit_emit_func_call(image, ctx, func_addr, tmp1_reg);\n\nThe error check is missing for the above function..\nActually, how about:\n\n\tret = 0;\n\tif (!IS_ENABLED(CONFIG_PPC_KERNEL_PCREL))\n\t\tret = bpf_jit_emit_func_call(image, ctx, func_addr, tmp1_reg);\n\n\tif (ret || IS_ENABLED(CONFIG_PPC_KERNEL_PCREL)) {\n\t\tPPC_LI_ADDR(tmp1_reg, func_addr);\n\t\tEMIT(PPC_RAW_MTCTR(tmp1_reg));\n\t\tEMIT(PPC_RAW_BCTRL());\n\t}\n\n> +#endif\n> +\t\t\t\tbreak;\n> +\t\t\t}\n> +\n>   \t\t\t/* Take care of powerpc ABI requirements before kfunc call */\n>   \t\t\tif (insn[i].src_reg == BPF_PSEUDO_KFUNC_CALL) {\n>   \t\t\t\tif (prepare_for_kfunc_call(fp, image, ctx, &insn[i]))\n> diff --git a/arch/powerpc/net/bpf_timed_may_goto.S b/arch/powerpc/net/bpf_timed_may_goto.S\n> new file mode 100644\n> index 000000000000..0b9afe3cfa1f\n> --- /dev/null\n> +++ b/arch/powerpc/net/bpf_timed_may_goto.S\n> @@ -0,0 +1,57 @@\n> +/* SPDX-License-Identifier: GPL-2.0 */\n> +/* Copyright (c) 2025 IBM Corporation, Saket Kumar Bhaskar <skb99@linux.ibm.com> */\n> +\n> +#include <linux/linkage.h>\n> +#include <asm/ppc_asm.h>\n> +\n> +/*\n> + * arch_bpf_timed_may_goto() trampoline for powerpc64\n> + *\n> + * Custom BPF convention (verifier/JIT):\n> + *\t- input:  stack offset in BPF_REG_AX (r12)\n> + *\t- output: updated count in BPF_REG_AX (r12)\n> + *\n> + * Call bpf_check_timed_may_goto(ptr) with normal powerpc64 ABI:\n> + * \t- r3 = ptr, return in r3\n> + *\n> + * Preserve BPF regs R0-R5 (mapping: r8, r3-r7).\n> + */\n> +\n> +SYM_FUNC_START(arch_bpf_timed_may_goto)\n> +\t/* Prologue: save LR, allocate frame */\n> +\tmflr    r0\n> +\tstd     r0, 16(r1)\n> +\tstdu    r1, -112(r1)\n> +\n> +\t/* Save BPF registers R0 - R5 (r8, r3-r7) */\n\n> +\tstd     r3, 24(r1)\n\nMay not matter much for this handwritten function but can we use\n32 and on instead, as 32 is the MIN_FRAME_SIZE on ABIv2?\n\n> +\tstd     r4, 32(r1)\n> +\tstd     r5, 40(r1)\n> +\tstd     r6, 48(r1)\n> +\tstd     r7, 56(r1)\n> +\tstd     r8, 64(r1)\n> +\n> +\t/*\n> +\t * r3 = BPF_REG_FP + BPF_REG_AX\n> +\t * BPF_REG_FP is r31; BPF_REG_AX is r12 (stack offset in bytes).\n> +\t */\n> +\tadd     r3, r31, r12\n> +\tbl      bpf_check_timed_may_goto\n> +\n> +\t/* Put return value back into AX */\n> +\tmr      r12, r3\n> +\n> +\t/* Restore BPF registers R0 - R5 (r8, r3-r7) */\n> +\tld      r3, 24(r1)\n> +\tld      r4, 32(r1)\n> +\tld      r5, 40(r1)\n> +\tld      r6, 48(r1)\n> +\tld      r7, 56(r1)\n> +\tld      r8, 64(r1)\n> +\n> +\t/* Epilogue: pop frame, restore LR, return */\n> +\taddi    r1, r1, 112\n> +\tld      r0, 16(r1)\n> +\tmtlr    r0\n> +\tblr\n> +SYM_FUNC_END(arch_bpf_timed_may_goto)\n\n- Hari","headers":{"Return-Path":"\n <linuxppc-dev+bounces-19217-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=Zfw5Zl8o;\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-19217-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=Zfw5Zl8o;\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=hbathini@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)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fmj7320Pkz1yGH\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 03 Apr 2026 00:16:47 +1100 (AEDT)","from boromir.ozlabs.org (localhost [127.0.0.1])\n\tby lists.ozlabs.org (Postfix) with ESMTP id 4fmj723xKfz2xln;\n\tFri, 03 Apr 2026 00:16:46 +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 4fmj713Cx4z2xS3\n\tfor <linuxppc-dev@lists.ozlabs.org>; Fri, 03 Apr 2026 00:16:44 +1100 (AEDT)","from pps.filterd (m0356517.ppops.net [127.0.0.1])\n\tby mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id\n 6327PhDJ2679500;\n\tThu, 2 Apr 2026 13:16:03 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 4d66q3cusf-1\n\t(version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT);\n\tThu, 02 Apr 2026 13:16:03 +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 632CIeBv008703;\n\tThu, 2 Apr 2026 13:16:02 GMT","from smtprelay01.fra02v.mail.ibm.com ([9.218.2.227])\n\tby ppma11.dal12v.mail.ibm.com (PPS) with ESMTPS id 4d6v11swb4-1\n\t(version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT);\n\tThu, 02 Apr 2026 13:16:02 +0000","from smtpav04.fra02v.mail.ibm.com (smtpav04.fra02v.mail.ibm.com\n [10.20.54.103])\n\tby smtprelay01.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id\n 632DFwmS54723026\n\t(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK);\n\tThu, 2 Apr 2026 13:15:58 GMT","from smtpav04.fra02v.mail.ibm.com (unknown [127.0.0.1])\n\tby IMSVA (Postfix) with ESMTP id 2CB2F20073;\n\tThu,  2 Apr 2026 13:15:58 +0000 (GMT)","from smtpav04.fra02v.mail.ibm.com (unknown [127.0.0.1])\n\tby IMSVA (Postfix) with ESMTP id 5D5DE2006C;\n\tThu,  2 Apr 2026 13:15:54 +0000 (GMT)","from [9.124.211.83] (unknown [9.124.211.83])\n\tby smtpav04.fra02v.mail.ibm.com (Postfix) with ESMTP;\n\tThu,  2 Apr 2026 13:15:54 +0000 (GMT)"],"ARC-Seal":"i=1; a=rsa-sha256; d=lists.ozlabs.org; s=201707; t=1775135806;\n\tcv=none;\n b=bjjM6vgUGtYqv/dDVE7g3JyUbQaJoJjib+x0PUwMZyLP3DuJepwOp+Q1qRGHF2HIHVlb0oR1gkendg4e5tts3a1llb/oRoo3i0X1M02Hcoc9GWPcW4S3FJhh7qRimIDm0vGfReEdk33LqNWfNstPp7Ye3UPaKXhvPEfXd9+/FIZ9mupxPJyqjXCNYqSoqlA7X2IAA/CM/LYZWDGNBBe9jmSQytnbIW30yi0BmVTugNApwWn0cCLJC21gNXbmdR1M70eHyDi4enN4rwa5bRWQoYIh4S/wQsrib3VbbtJBNjooTnfG9tSpAEqwrji/821ZB54d9C8kz8LJQyydueznvw==","ARC-Message-Signature":"i=1; a=rsa-sha256; d=lists.ozlabs.org; s=201707;\n\tt=1775135806; c=relaxed/relaxed;\n\tbh=JgbOLZtZTnGQzeKA0c8+hTYUkEa0VzumKm4KZiICbm0=;\n\th=Message-ID:Date:MIME-Version:Subject:To:Cc:References:From:\n\t In-Reply-To:Content-Type;\n b=hJr2epDQv0pP+MoTV88bg8exWdfjYlzTbimc4JiO4s+dMYVvN5l+5l7HHhFEqXLd6fwvwcUFrHBI9pWOwqTmlJ2WnyH5dSoI4wBXp1r1YCWaRDoCgCl0JLVJN3F2AjZtT+GQcwi4rEHRCex4sB5FcWbYmB4Bd5wBaf1kw6Vnp776ki18gHO/KF47LfqRnQZ/H8Lk5P9PVOwUZ9hCaKzWb1u/qwsBECx7YDCpT6OPImHORctYevF8DeYtJaiLpZfmhefaOpV2Z0joMl3PkBtb8f6fnVNnqu0qjDFkvyr445EM8W+CzYOYTL9lOfWsknlX7OHUKAyHM1tqEvlurcvbkg==","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=Zfw5Zl8o; dkim-atps=neutral;\n spf=pass (client-ip=148.163.156.1; helo=mx0a-001b2d01.pphosted.com;\n envelope-from=hbathini@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:content-type:date:from:in-reply-to\n\t:message-id:mime-version:references:subject:to; s=pp1; bh=JgbOLZ\n\ttZTnGQzeKA0c8+hTYUkEa0VzumKm4KZiICbm0=; b=Zfw5Zl8oQrDtWsAT9J+Cr/\n\tXQBADNPZ6wnndoLvRNp+yLGN0IfUjPac4H0kFXpewIjNLe9D3QCTzOnexSOXbIG5\n\t9sEh7sTi/BcT1sqj4WxeAJAUog2MPgmBFWAwu7g4SzlSiVtWgopLX1zNz1QdjH/E\n\trKeeWuCGvKxFGTLWyNmvUu4/v+A90nqQl78f0MIy9lS2syrZmNtXjBhJmzgKVv49\n\tv7oEZExF0LMkjEc+MdbPY4Ei/HCyF7i/vee+esRMgDwxDLkA9j02Kx0U5/jS/6Gi\n\ths6umJ6aYR4OpDsE54c79/YPreSNcBGO2ST1JvcNUfatLU9GEy0Eubwr7+zohaPA\n\t==","Message-ID":"<d8c9c8dd-a544-4f5d-81c6-6041b5e806b1@linux.ibm.com>","Date":"Thu, 2 Apr 2026 18:45:53 +0530","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","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH] powerpc64/bpf: Add powerpc64 JIT support for timed\n may_goto","To":"Saket Kumar Bhaskar <skb99@linux.ibm.com>, linux-kernel@vger.kernel.org,\n        bpf@vger.kernel.org, linuxppc-dev@lists.ozlabs.org","Cc":"sachinpb@linux.ibm.com, venkat88@linux.ibm.com, andrii@kernel.org,\n        eddyz87@gmail.com, ast@kernel.org, daniel@iogearbox.net,\n        martin.lau@linux.dev, song@kernel.org, yonghong.song@linux.dev,\n        john.fastabend@gmail.com, kpsingh@kernel.org, sdf@fomichev.me,\n        haoluo@google.com, jolsa@kernel.org, chleroy@kernel.org,\n        maddy@linux.ibm.com, mpe@ellerman.id.au, adubey@linux.ibm.com","References":"<20260402054249.28801-1-skb99@linux.ibm.com>","Content-Language":"en-US","From":"Hari Bathini <hbathini@linux.ibm.com>","In-Reply-To":"<20260402054249.28801-1-skb99@linux.ibm.com>","Content-Type":"text/plain; charset=UTF-8; format=flowed","Content-Transfer-Encoding":"7bit","X-TM-AS-GCONF":"00","X-Proofpoint-Reinject":"loops=2 maxloops=12","X-Proofpoint-GUID":"Zm4SQeeocor-YrMLtjR7rk28-DXVJAs8","X-Authority-Analysis":"v=2.4 cv=frzRpV4f c=1 sm=1 tr=0 ts=69ce6c13 cx=c_pps\n a=aDMHemPKRhS1OARIsFnwRA==:117 a=aDMHemPKRhS1OARIsFnwRA==:17\n a=IkcTkHD0fZMA:10 a=A5OVakUREuEA:10 a=VkNPw1HP01LnGYTKEx00:22\n a=RnoormkPH1_aCDwRdu11:22 a=U7nrCbtTmkRpXpFmAIza:22 a=VnNF1IyMAAAA:8\n a=sjD7eUQVPW1qbSBmM3gA:9 a=QEXdDO2ut3YA:10","X-Proofpoint-ORIG-GUID":"8JgscKiQBGn9pYynFAGYJa9FQLJ7T3-4","X-Proofpoint-Spam-Details-Enc":"AW1haW4tMjYwNDAyMDExNiBTYWx0ZWRfX9Hek6HY48SI5\n 05g4BuM1uw0Vf8NcCs8jZpawdT+1K4+CiI38uBsLc8FNUyBbZfwKH26K5X/FDMAjDwDkJcFxlON\n 2D86zoZX90MhkAu+QNldZD8nmO9H0uek0U7LPHBe3XZKpzd7Rtf0tw06Ei7KKdgj0Ui9kQI/S0T\n mosXXiuSTczfNQHNupEwMW2zzuj12t9yiCEd9RTKZsJJolEru+mFt7lK44b+QDcEUuENtZfo+gU\n oXSrQEOBTa7MOg6T/mBpkjE3OYegwsbz5jM2HyNgWThvgmPaCv6SrLe89Cz2ciSsS1H6f7VgmpD\n Sb4MT3uDoLZrNzkRFbWNJmb/6aQUEUWqcVWs0/9K8y+Vdxdbe7gmOL3B+Q+R00rb7bVag3tj4rG\n 2Ijx8tjpEhRAs3Xjc02N39zkT5v7J6UPKa7C8BoTkYXGYxnd/WfP2rAtCNe2t4O7z9jKq8B3f4x\n YczbcbQ9bD/ZnIFLVAA==","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-02_01,2026-04-02_02,2025-10-01_01","X-Proofpoint-Spam-Details":"rule=outbound_notspam policy=outbound score=0\n impostorscore=0 spamscore=0 priorityscore=1501 malwarescore=0 clxscore=1015\n lowpriorityscore=0 bulkscore=0 adultscore=0 suspectscore=0 phishscore=0\n classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0\n reason=mlx scancount=1 engine=8.22.0-2603050001 definitions=main-2604020116","X-Spam-Status":"No, score=-0.7 required=3.0 tests=DKIM_SIGNED,DKIM_VALID,\n\tRCVD_IN_DNSWL_LOW,RCVD_IN_MSPIKE_H4,RCVD_IN_MSPIKE_WL,SPF_HELO_NONE,\n\tSPF_PASS autolearn=disabled version=4.0.1 OzLabs 8","X-Spam-Checker-Version":"SpamAssassin 4.0.1 (2024-03-25) on lists.ozlabs.org"}}]