From nobody Sun Jun 14 09:56:33 2026 Received: from mail-pj1-f43.google.com (mail-pj1-f43.google.com [209.85.216.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C5BAC38F646 for ; Thu, 2 Apr 2026 09:26:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775121999; cv=none; b=Q2dAS24QWVd7hs8JYlAMThk3IM28I3djGWoPbxz/8FqIhFoP852M+YdC0bSUjqswPHkrS/MlBPXgeHcQbiOaO3y+EuoUbhjmTssP7oZvoqEPpFLXnQOMbZIvZP3kt8i5WauDsk2u4AFIa2NdMVWGXa/poHV7lPPoLB9I9+/5M+M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775121999; c=relaxed/simple; bh=ej1QnT2eQaleNxlMgrs1gAsCPfQsz0m2v5hxcKmj2rc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=A6yFv8EjAmcngFhA+bbUC+Efu+vnCwRkCmOuN/PTrC06SjDWvaZ+JGf+0CCPb/n/yjkiEEUIW0xC6kIrUSlH0hVjnt7M2t0r1+TrRXtqnQOEvpUvqYbrL/zNPfa/ZoV6P/2UYQFTbpTLi6+fd9dr4RPLZ3In1/z8XGd3Dj/1otY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=F03xzT2Z; arc=none smtp.client-ip=209.85.216.43 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="F03xzT2Z" Received: by mail-pj1-f43.google.com with SMTP id 98e67ed59e1d1-35d90833cacso346911a91.2 for ; Thu, 02 Apr 2026 02:26:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775121989; x=1775726789; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=SG/JGJww/E4NFDS2ytnaNRFZJ2JnJt66danprE2gSxY=; b=F03xzT2ZtDi9zfHTPvbpiGmxCiZqaXs2IInz/hYR6jKRDhxsREf3+kiceC4XG3YfPI wALlAiGtb8sC4pEAEGeOVl9Zpz71P07gmCrD0e5khcTptydUKVcTxGDw2SuXnmhBTUyA a9B+g14Ggcn3bLyk/SrUZSlGyf7AJnqAYCMPIKvQHMzYFpNnLv9oL8lVaoIw6hzZvqDV acV2y1bGXFO991EZbfJj78HwgTzg2ZFsBc6Ia8Xx59HSBWJPrMk6kS+loq9i1cWhOQR7 0yPnWXnbHTt8m8j1P9qA85GCM4cETPCXFd7Am48Sl4XU7TNictnA/RmJSi3jnC0T+jQ1 AhBg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775121989; x=1775726789; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=SG/JGJww/E4NFDS2ytnaNRFZJ2JnJt66danprE2gSxY=; b=dCzplkPCsHEo8seiOt+okku4MomsU9fyZW+fdinYHiMHigEBEZLT7jX1hM1xqCkcAn f+rcrZ24E7cR14lmJIQ00k0T4GhoBQZ+P5kRMctmE70gZG4hcJULgyFQ+7o7lAonJrFP s7DPMGxd3qFWRu3fMGuTGpED6tH4j/++ww0C4C43Mlbjds3d+na3Ra9ipEpCV8rJ7gXM I0SGMMD/5LVRfR249o3+NH4KKV1M9eMbrPdQtAUOww4fo9Vcu0SeMBXZGnBeAENO/G+f 3aIqW5F7jR7+V8r/QG3NMWdSEV7bLgqHK9NM8lmTjHmMEcP3t8AGGVI2NzMfglyrWclp xQdw== X-Forwarded-Encrypted: i=1; AJvYcCWfXI1ro4a/DFL009f2JQw1nIGoewBClbh2JdX5OjLhD/uFiovstwTT5u/pNakVZDX6SZ5VgTrKQSaKuXU=@vger.kernel.org X-Gm-Message-State: AOJu0Yze9zaR3a4hSnKtZ3LILsgUOy6FNvfVGjRMXC9V+guRkuPZM2GO yD6BaM9e15eJOpaZHWNo/nlmJ30i0jwGPTg0TiAF3ROk9bsYnaEloUep X-Gm-Gg: AeBDiesyJIgYaZ5Fq8W6IDjAYQbHFzkZ4z0YJx+EKAunNUcRvZwdJF9BTENLqxVhptV ZKOe026E8K0FewdHuciqNeoYzNkXHIIl1fq90d77dYjhIlBrVjNzQVKnjgReGkw7BNwWIysBbYO lhkYJFWvJWYIC7So5SnuXLqLfpt6iXhO+0my72uuxDtCwsY8B4eXkE4pY20S5R+4LSoIDvpHKtq qsKYH4m9AQDd8s2t+dpW8/g4ZnPoSDK1oNvJJg7jHS0abTt9nNSO6egbtGnu2sVqq1ukzSeDQcq yZ88YTUDNSGlt553jOS7oYsPIQEXoo/hCfPMFot9ScSKmV05pGRw9FLX6QTm9zjvHmAeoOAMg74 ivaLwM1yn3a7BR6xhPASZK7J/ifl2d73fWJOfCXENGXMEOyRDu6HaCkeo3RGTY5WxNQ9KC94yh2 +OL4S7ltlSyJG/ZNGYnP90GtdAZhRNo8pggEwro5nWN+Ku X-Received: by 2002:a17:90b:3a8b:b0:35d:93ff:2859 with SMTP id 98e67ed59e1d1-35dc6f92e1amr6324093a91.22.1775121989484; Thu, 02 Apr 2026 02:26:29 -0700 (PDT) Received: from yafangs-Air ([2409:891f:1aa0:8613:19f3:7bee:2e41:149e]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-35dd35f50e9sm2227645a91.6.2026.04.02.02.26.22 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Thu, 02 Apr 2026 02:26:29 -0700 (PDT) From: Yafang Shao To: jpoimboe@kernel.org, jikos@kernel.org, mbenes@suse.cz, pmladek@suse.com, joe.lawrence@redhat.com, rostedt@goodmis.org, mhiramat@kernel.org, mathieu.desnoyers@efficios.com, kpsingh@kernel.org, mattbobrowski@google.com, song@kernel.org, jolsa@kernel.org, ast@kernel.org, daniel@iogearbox.net, andrii@kernel.org, martin.lau@linux.dev, eddyz87@gmail.com, memxor@gmail.com, yonghong.song@linux.dev Cc: live-patching@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, bpf@vger.kernel.org, Yafang Shao Subject: [RFC PATCH 1/4] trace: Simplify kprobe overridable function check Date: Thu, 2 Apr 2026 17:26:04 +0800 Message-ID: <20260402092607.96430-2-laoar.shao@gmail.com> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20260402092607.96430-1-laoar.shao@gmail.com> References: <20260402092607.96430-1-laoar.shao@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Simplify the logic for checking overridable kprobe functions by removing redundant code. No functional change. Signed-off-by: Yafang Shao --- kernel/trace/bpf_trace.c | 13 ++++++--- kernel/trace/trace_kprobe.c | 40 +++++---------------------- kernel/trace/trace_probe.h | 54 ++++++++++++++++++++++++++----------- 3 files changed, 54 insertions(+), 53 deletions(-) diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c index 0b040a417442..c901ace836cb 100644 --- a/kernel/trace/bpf_trace.c +++ b/kernel/trace/bpf_trace.c @@ -1929,10 +1929,15 @@ int perf_event_attach_bpf_prog(struct perf_event *e= vent, * Kprobe override only works if they are on the function entry, * and only if they are on the opt-in list. */ - if (prog->kprobe_override && - (!trace_kprobe_on_func_entry(event->tp_event) || - !trace_kprobe_error_injectable(event->tp_event))) - return -EINVAL; + if (prog->kprobe_override) { + struct trace_kprobe *tp =3D trace_kprobe_primary_from_call(event->tp_eve= nt); + + if (!tp) + return -EINVAL; + if (!trace_kprobe_on_func_entry(tp) || + !trace_kprobe_error_injectable(tp)) + return -EINVAL; + } =20 mutex_lock(&bpf_event_mutex); =20 diff --git a/kernel/trace/trace_kprobe.c b/kernel/trace/trace_kprobe.c index a5dbb72528e0..768702674a5c 100644 --- a/kernel/trace/trace_kprobe.c +++ b/kernel/trace/trace_kprobe.c @@ -53,17 +53,6 @@ static struct dyn_event_operations trace_kprobe_ops =3D { .match =3D trace_kprobe_match, }; =20 -/* - * Kprobe event core functions - */ -struct trace_kprobe { - struct dyn_event devent; - struct kretprobe rp; /* Use rp.kp for kprobe use */ - unsigned long __percpu *nhit; - const char *symbol; /* symbol name */ - struct trace_probe tp; -}; - static bool is_trace_kprobe(struct dyn_event *ev) { return ev->ops =3D=3D &trace_kprobe_ops; @@ -212,33 +201,16 @@ unsigned long trace_kprobe_address(struct trace_kprob= e *tk) return addr; } =20 -static nokprobe_inline struct trace_kprobe * -trace_kprobe_primary_from_call(struct trace_event_call *call) -{ - struct trace_probe *tp; - - tp =3D trace_probe_primary_from_call(call); - if (WARN_ON_ONCE(!tp)) - return NULL; - - return container_of(tp, struct trace_kprobe, tp); -} - -bool trace_kprobe_on_func_entry(struct trace_event_call *call) +bool trace_kprobe_on_func_entry(struct trace_kprobe *tp) { - struct trace_kprobe *tk =3D trace_kprobe_primary_from_call(call); - - return tk ? (kprobe_on_func_entry(tk->rp.kp.addr, - tk->rp.kp.addr ? NULL : tk->rp.kp.symbol_name, - tk->rp.kp.addr ? 0 : tk->rp.kp.offset) =3D=3D 0) : false; + return !kprobe_on_func_entry(tp->rp.kp.addr, + tp->rp.kp.addr ? NULL : tp->rp.kp.symbol_name, + tp->rp.kp.addr ? 0 : tp->rp.kp.offset); } =20 -bool trace_kprobe_error_injectable(struct trace_event_call *call) +bool trace_kprobe_error_injectable(struct trace_kprobe *tp) { - struct trace_kprobe *tk =3D trace_kprobe_primary_from_call(call); - - return tk ? within_error_injection_list(trace_kprobe_address(tk)) : - false; + return within_error_injection_list(trace_kprobe_address(tp)); } =20 static int register_kprobe_event(struct trace_kprobe *tk); diff --git a/kernel/trace/trace_probe.h b/kernel/trace/trace_probe.h index 9fc56c937130..958eb78a9068 100644 --- a/kernel/trace/trace_probe.h +++ b/kernel/trace/trace_probe.h @@ -30,6 +30,7 @@ =20 #include "trace.h" #include "trace_output.h" +#include "trace_dynevent.h" =20 #define MAX_TRACE_ARGS 128 #define MAX_ARGSTR_LEN 63 @@ -210,21 +211,6 @@ DECLARE_BASIC_PRINT_TYPE_FUNC(symbol); #define ASSIGN_FETCH_TYPE_END {} #define MAX_ARRAY_LEN 64 =20 -#ifdef CONFIG_KPROBE_EVENTS -bool trace_kprobe_on_func_entry(struct trace_event_call *call); -bool trace_kprobe_error_injectable(struct trace_event_call *call); -#else -static inline bool trace_kprobe_on_func_entry(struct trace_event_call *cal= l) -{ - return false; -} - -static inline bool trace_kprobe_error_injectable(struct trace_event_call *= call) -{ - return false; -} -#endif /* CONFIG_KPROBE_EVENTS */ - struct probe_arg { struct fetch_insn *code; bool dynamic;/* Dynamic array (string) is used */ @@ -271,6 +257,32 @@ struct event_file_link { struct list_head list; }; =20 +/* + * Kprobe event core functions + */ +struct trace_kprobe { + struct dyn_event devent; + struct kretprobe rp; /* Use rp.kp for kprobe use */ + unsigned long __percpu *nhit; + const char *symbol; /* symbol name */ + struct trace_probe tp; +}; + +#ifdef CONFIG_KPROBE_EVENTS +bool trace_kprobe_on_func_entry(struct trace_kprobe *tp); +bool trace_kprobe_error_injectable(struct trace_kprobe *tp); +#else +static inline bool trace_kprobe_on_func_entry(struct trace_kprobe *tp) +{ + return false; +} + +static inline bool trace_kprobe_error_injectable(struct trace_kprobe *tp) +{ + return false; +} +#endif /* CONFIG_KPROBE_EVENTS */ + static inline unsigned int trace_probe_load_flag(struct trace_probe *tp) { return smp_load_acquire(&tp->event->flags); @@ -329,6 +341,18 @@ trace_probe_primary_from_call(struct trace_event_call = *call) return list_first_entry_or_null(&tpe->probes, struct trace_probe, list); } =20 +static nokprobe_inline struct trace_kprobe * +trace_kprobe_primary_from_call(struct trace_event_call *call) +{ + struct trace_probe *tp; + + tp =3D trace_probe_primary_from_call(call); + if (WARN_ON_ONCE(!tp)) + return NULL; + + return container_of(tp, struct trace_kprobe, tp); +} + static inline struct list_head *trace_probe_probe_list(struct trace_probe = *tp) { return &tp->event->probes; --=20 2.47.3 From nobody Sun Jun 14 09:56:33 2026 Received: from mail-pj1-f53.google.com (mail-pj1-f53.google.com [209.85.216.53]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 428693921DE for ; Thu, 2 Apr 2026 09:26:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.53 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775122006; cv=none; b=blWSiOA2rKdzDgT03WpKl5nPIBgRRpydgB3mauTFJq97WCUFqlKZIVZh83poVQiPjg8R4du1VRj3TwCQ2T/aAi4McOvt56Acfjx16aPye66mgMw8MgTnOlVuWr0nP7B0pAj9PXcuQuNfmV4DmI8x4ogQXWHwhjjerWvC2UYaBOk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775122006; c=relaxed/simple; bh=5nMc9qAcFEsGx3C7PmryTlLfGSZTMZVInAVBgvQtejY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=VCIZuahibGEFU51dN7cHGAEF5/986aE6KjUoxEXnQr0YHRTJ7b2q8NzXpPatl+z9wbbkH8YrsfwS9wuMOS6qD9nDLaNj/Iy791QgdlDWhsiSHyWDHiPnsabjqS9p2vo3fdhvhYTZ+UG0NGKT67TeDDOtzU+Li+OU5VdAttlLIDI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=ZG7MGOBv; arc=none smtp.client-ip=209.85.216.53 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="ZG7MGOBv" Received: by mail-pj1-f53.google.com with SMTP id 98e67ed59e1d1-35c1d101355so248323a91.1 for ; Thu, 02 Apr 2026 02:26:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775121997; x=1775726797; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=81j40jm7xzkIDR0AUEs06y3jjZUfu/jUEFBO6OwZcOw=; b=ZG7MGOBvrOPdrSlJltkWWUZi7E2sgqmqfiuTaPjkWBNPF5s7PnyiRm36zvCIDtr6uX +c5B60RkEJue0Rewey+xsrKzgSWEJ3RGtrBQSHwstOEDhxuaxQbAklu3VtBcvAY/QGit MQKvw1sQbldvJBtUXOyLOcODIUqy+W5uIiM/TcJtYVKAbG97W9VcasXGLAXlbpv5HZay kq+BMPmCzbj4Vtes57fdyohUNWJbkjQW7gH737dCD/A7vXXgzFUMRFjTipV5Th0MRj3G e849m1pvOVsB132tO5tWgEHQa0DMaoiVDR2OLgv4xW+TLnnWTqXxY1bRkVL5sXDVOjhZ Fcpg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775121997; x=1775726797; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=81j40jm7xzkIDR0AUEs06y3jjZUfu/jUEFBO6OwZcOw=; b=QCk8lHflZ0nWHh1hmrj5wwigMD/yt2HgLonqCfVewRAArQT19k3Mxzw9fJa+uZ1he4 BG2Si2hNM714DGeZrcP3uUIef0sExJDUEfvrkApbqMb0t88Y7k0D8ixK1i+X9k4Bm0if tWou+xrX4XP3na6w0m1rKO0twRE4R6L3mlODxF7+R6thGKoYOHILqv+z674SDJRjNfgE ylrQjQdLQC9snIYBFWyd+GQGLzH/TCMNBQE6KfZwiCuBewR/iyKKNQsNKAhAsvPPoHwS sXtiBg+EWuBd2lJnguaiUCO9vK8SIURBDaQ0PzHoE6cj4far3xhp7Xo0Chc3xkf0wFEv ZW5A== X-Forwarded-Encrypted: i=1; AJvYcCVz+1bFyv571PPaPLHiGgwbYHeg/70UEBbBxQz4j/OtpH38sfiEB6gCqKcyuGeRroJ2/PqoTaNnC6zL074=@vger.kernel.org X-Gm-Message-State: AOJu0Yylw+FvVtWWggx10ac7to5ALLUkQqJq9ABmH2FN2LYN8wA5d1Hd r1KtIsyTIZOfmiznOfVeOWdfPjG6Qxq7tRxpp0MBCuynlOZplwtr57NL X-Gm-Gg: AeBDieuTV+jfBCiocbMifCkOelAxVLlQ4+W+DvcBmUA6miahqW5fFpJWtWHFNJKKGZh yA8WwuWJF7M6BPdEVmFtrj62DiBZsztsag56IJCP0NJoOTEJvc85MUou3X0FbHVyV1gc0TODUHY oW0TyxVWCywL+0/Gfm/A3WiTk5l3es/ooYcax3Yj1BoMthpZrEKc/prn337KR1Bo01LG7yItj+r ipM1QE7PB723ZoqbKmgV4DvDObpBfK6E17M9+d/ApwBOs2+uVOMelvSraF1B08XEe4ESGzfO2LM qGHuidpwmEoqkUwiEu4hBnkDNZ3GBxeiQEK2uUKUU51KabHwGkmMtOVQHQcAvTRdfeHXLBqOQq8 N92P4XjU359U1Q0f4woIm3uPMT+zzFjnI4MPr31pUKF/1umxHcjlftsIQSCBFBJ9Hpuqn2ncFCL 8nribfDgOL/1tICYX06dWxXNH3K9XKpCq/3Q/f94FW4B63 X-Received: by 2002:a17:90b:5350:b0:359:8dfd:64c8 with SMTP id 98e67ed59e1d1-35dc6f3b854mr6703431a91.24.1775121996713; Thu, 02 Apr 2026 02:26:36 -0700 (PDT) Received: from yafangs-Air ([2409:891f:1aa0:8613:19f3:7bee:2e41:149e]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-35dd35f50e9sm2227645a91.6.2026.04.02.02.26.29 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Thu, 02 Apr 2026 02:26:36 -0700 (PDT) From: Yafang Shao To: jpoimboe@kernel.org, jikos@kernel.org, mbenes@suse.cz, pmladek@suse.com, joe.lawrence@redhat.com, rostedt@goodmis.org, mhiramat@kernel.org, mathieu.desnoyers@efficios.com, kpsingh@kernel.org, mattbobrowski@google.com, song@kernel.org, jolsa@kernel.org, ast@kernel.org, daniel@iogearbox.net, andrii@kernel.org, martin.lau@linux.dev, eddyz87@gmail.com, memxor@gmail.com, yonghong.song@linux.dev Cc: live-patching@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, bpf@vger.kernel.org, Yafang Shao Subject: [RFC PATCH 2/4] trace: Allow kprobes to override livepatched functions Date: Thu, 2 Apr 2026 17:26:05 +0800 Message-ID: <20260402092607.96430-3-laoar.shao@gmail.com> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20260402092607.96430-1-laoar.shao@gmail.com> References: <20260402092607.96430-1-laoar.shao@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Introduce the ability for kprobes to override the return values of functions that have been livepatched. This functionality is guarded by the CONFIG_KPROBE_OVERRIDE_KLP_FUNC configuration option. Signed-off-by: Yafang Shao --- kernel/trace/Kconfig | 14 ++++++++++++++ kernel/trace/bpf_trace.c | 3 ++- kernel/trace/trace_kprobe.c | 17 +++++++++++++++++ kernel/trace/trace_probe.h | 5 +++++ 4 files changed, 38 insertions(+), 1 deletion(-) diff --git a/kernel/trace/Kconfig b/kernel/trace/Kconfig index 49de13cae428..db712c8cb745 100644 --- a/kernel/trace/Kconfig +++ b/kernel/trace/Kconfig @@ -1279,6 +1279,20 @@ config HIST_TRIGGERS_DEBUG =20 If unsure, say N. =20 +config KPROBE_OVERRIDE_KLP_FUNC + bool "Allow kprobes to override livepatched functions" + depends on KPROBES && LIVEPATCH + help + This option allows BPF programs to use kprobes to override functions + that have already been patched by Livepatch (KLP). + + Enabling this provides a mechanism to dynamically control execution + flow without requiring a reboot or a new livepatch module. It + effectively combines the persistence of livepatching with the + programmability of BPF. + + If unsure, say N. + source "kernel/trace/rv/Kconfig" =20 endif # FTRACE diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c index c901ace836cb..08ae2b1a912c 100644 --- a/kernel/trace/bpf_trace.c +++ b/kernel/trace/bpf_trace.c @@ -1935,7 +1935,8 @@ int perf_event_attach_bpf_prog(struct perf_event *eve= nt, if (!tp) return -EINVAL; if (!trace_kprobe_on_func_entry(tp) || - !trace_kprobe_error_injectable(tp)) + (!trace_kprobe_error_injectable(tp) && + !trace_kprobe_klp_func_overridable(tp))) return -EINVAL; } =20 diff --git a/kernel/trace/trace_kprobe.c b/kernel/trace/trace_kprobe.c index 768702674a5c..6f05451fbc76 100644 --- a/kernel/trace/trace_kprobe.c +++ b/kernel/trace/trace_kprobe.c @@ -213,6 +213,23 @@ bool trace_kprobe_error_injectable(struct trace_kprobe= *tp) return within_error_injection_list(trace_kprobe_address(tp)); } =20 +bool trace_kprobe_klp_func_overridable(struct trace_kprobe *tp) +{ + bool overridable =3D false; +#ifdef CONFIG_KPROBE_OVERRIDE_KLP_FUNC + struct module *mod; + unsigned long addr; + + addr =3D trace_kprobe_address(tp); + rcu_read_lock(); + mod =3D __module_address(addr); + if (mod && mod->klp) + overridable =3D true; + rcu_read_unlock(); +#endif + return overridable; +} + static int register_kprobe_event(struct trace_kprobe *tk); static int unregister_kprobe_event(struct trace_kprobe *tk); =20 diff --git a/kernel/trace/trace_probe.h b/kernel/trace/trace_probe.h index 958eb78a9068..84bd2617db7c 100644 --- a/kernel/trace/trace_probe.h +++ b/kernel/trace/trace_probe.h @@ -271,6 +271,7 @@ struct trace_kprobe { #ifdef CONFIG_KPROBE_EVENTS bool trace_kprobe_on_func_entry(struct trace_kprobe *tp); bool trace_kprobe_error_injectable(struct trace_kprobe *tp); +bool trace_kprobe_klp_func_overridable(struct trace_kprobe *tp); #else static inline bool trace_kprobe_on_func_entry(struct trace_kprobe *tp) { @@ -281,6 +282,10 @@ static inline bool trace_kprobe_error_injectable(struc= t trace_kprobe *tp) { return false; } +static inline bool trace_kprobe_klp_func_overridable(struct trace_kprobe *= tp) +{ + return false; +} #endif /* CONFIG_KPROBE_EVENTS */ =20 static inline unsigned int trace_probe_load_flag(struct trace_probe *tp) --=20 2.47.3 From nobody Sun Jun 14 09:56:33 2026 Received: from mail-pj1-f49.google.com (mail-pj1-f49.google.com [209.85.216.49]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3A38638D688 for ; Thu, 2 Apr 2026 09:26:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775122013; cv=none; b=hg7+bHNrEQfysCaQPu+33oIAr2w5DNCULaKtNePM1fMAmsXG2VDJJFkU2IONZNhjw9BwcmrZ+wU80gITmrYh1Y39UW4ISbx5RNHWcMUlMKAmocT1yL+8dxrGjzFV3V94DzL18yGvVohsTf9nLz/+lgCbPlBAmamGYXnP5y6IYgM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775122013; c=relaxed/simple; bh=fg9gtssW70rqBjzjZemwy81+H2Jd6oM+l/xkQy5zuS0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=AYYg3jge3W33XOkzU3PC6IxihwbI7WV0JDwfYg+7QndgD7BPs2xBhySZFoVSXnUytWT4wumw2L+DpESZy0nuk4eg4FK2dHPWfIZGjXOZox3J+viL7Kk3yU3Ewn9f820btGJ2snTeKgdioOps+ZqQ+2zruZAzOhIhWdcRHj14P2I= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=NwjBuQCg; arc=none smtp.client-ip=209.85.216.49 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="NwjBuQCg" Received: by mail-pj1-f49.google.com with SMTP id 98e67ed59e1d1-3585ec417f6so681551a91.1 for ; Thu, 02 Apr 2026 02:26:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775122004; x=1775726804; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=CcS6+ltlajemy60nMyxmGDon25GNRE0B5Cl/4uAqhyI=; b=NwjBuQCg+b08pUjtJ4kKR6QxL3EofbU+P1etAguRY5SkyGw65JUgXjogeGYGpXAacV N2UDTdgGH9KEx4RsQJ1sx654k6ZKfMOxAssT7RmifOy3UF7MmhNdppcmSe5eu+ycS92o VgOuVvYdMw/Qjz7qLB1LosBadeghQhTHXkyyxKSWWIuFyYiO0rIBYNxWYcLy87KijYqF J6nEjtHYuHfygTZF4dGZK9wZruYwpNEieAuNUD6Z+F7V1AjJCLD9+5dKfMHjG+E4SvFt 1bP2XQy4J2We3hdie9ogx7N266tIguejWg+kF8jS+kL/Kz0Wx3pg2JQ8H2GuBiSyMMRy BtAQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775122004; x=1775726804; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=CcS6+ltlajemy60nMyxmGDon25GNRE0B5Cl/4uAqhyI=; b=IeVTkKbi4yFwzQkTz+n18P+IaYOVfBrliQAFyDIdXAs7JW2TAG0qPg03xFakPP2n5X kZSrgv5UXzKI3JUo/WXzamrxJhz84kMHgS98h+VDyxvbgJjKsngbI5M5yc5b5czBoKMo LYT0TeFEcWdjCoeI42rzJgCiSHpEvmBk7/Q1tKucuZgWnmwDQcfltqr8hWbSqsrZwh+X /l14HQ3e1j3qpdtKmu5lOfwSxrtAWcBZM14kqiNSJFiScyCGorxoe+owFkfrMEnzzyDv NO4pB/GwOdm+Fic4DmeLyS1M90O8rzFO0Km0kSJNm+4VUgWpZAr8jAn5DlIK6J8drTyO GaJA== X-Forwarded-Encrypted: i=1; AJvYcCUhNhwQMMJoHYQh54MTUVvb1cbejjTwU5i+buug88M94+Y9BDfmqcXqKL+jBw8QY4vjfa+1h3+A7ngJNZM=@vger.kernel.org X-Gm-Message-State: AOJu0YynIQjR6KJZDNDt1T1HGSPDa1xC6aYUVodQWVv9GNAx7YZVWrEj 6+yA3lm/pief64bE97Q6zWHSklJbBXhpabwntYUsKRsUwSa+PD/BjuYd X-Gm-Gg: AeBDieu3eKkHPnCgGJTKZ26Xkz8Cf7WqpJA+y8loHfrLCgBL4u+Ra84c4I7X7Ovvhbe jPi2qvOCloqFBEm+3l51zh8Axk7VBDE4U0R+rgjE1RJOhqidzSavVNEu3qv70Wnk6XWRBQOGAV1 I9uIzEsppSTvmNn/3hzRh/t0RLGHD5gHpoc6MFzPx6C4ibrzgL8S/aLTMDQ0KrJOA6vhYKst7rp wUxCV/hUudAgYkuXrfba3VAzGkt9XLRoQ+echHWGT6fwhXwtH+NqQVBYZBRfBTcu72ANIKRkkey 0niOH4F/N/L8DbWVcoCLw8uUNj6nYhu96TLXyoqi2NLvZRamSmv5IfPcqm77HqlSCYHxcM3AVtu XsQsrhcJEkBR1ZDSIl8GZgXvaxgUuEou88vMB805an4rZwRS2/t8S+NltaI6IlyVHBCRK5yS34h Ifdw7TmRbctySHlrv/uIA0y3U6mZr54nT6XLTwBMP9Qm3F X-Received: by 2002:a17:90b:4a48:b0:35d:9fe9:f830 with SMTP id 98e67ed59e1d1-35dd684eacamr1324687a91.12.1775122003834; Thu, 02 Apr 2026 02:26:43 -0700 (PDT) Received: from yafangs-Air ([2409:891f:1aa0:8613:19f3:7bee:2e41:149e]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-35dd35f50e9sm2227645a91.6.2026.04.02.02.26.37 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Thu, 02 Apr 2026 02:26:43 -0700 (PDT) From: Yafang Shao To: jpoimboe@kernel.org, jikos@kernel.org, mbenes@suse.cz, pmladek@suse.com, joe.lawrence@redhat.com, rostedt@goodmis.org, mhiramat@kernel.org, mathieu.desnoyers@efficios.com, kpsingh@kernel.org, mattbobrowski@google.com, song@kernel.org, jolsa@kernel.org, ast@kernel.org, daniel@iogearbox.net, andrii@kernel.org, martin.lau@linux.dev, eddyz87@gmail.com, memxor@gmail.com, yonghong.song@linux.dev Cc: live-patching@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, bpf@vger.kernel.org, Yafang Shao Subject: [RFC PATCH 3/4] livepatch: Add "replaceable" attribute to klp_patch Date: Thu, 2 Apr 2026 17:26:06 +0800 Message-ID: <20260402092607.96430-4-laoar.shao@gmail.com> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20260402092607.96430-1-laoar.shao@gmail.com> References: <20260402092607.96430-1-laoar.shao@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add a new replaceable attribute to allow the coexistence of both atomic-replace and non-atomic-replace livepatches. If replaceable is set to 0, the livepatch will not be replaced by a subsequent atomic-replace operation. This is a preparatory patch for following changes. Signed-off-by: Yafang Shao Suggested-by: Song Liu --- include/linux/livepatch.h | 2 ++ kernel/livepatch/core.c | 44 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/include/linux/livepatch.h b/include/linux/livepatch.h index ba9e3988c07c..d88a6966e5f2 100644 --- a/include/linux/livepatch.h +++ b/include/linux/livepatch.h @@ -124,6 +124,7 @@ struct klp_state { * @objs: object entries for kernel objects to be patched * @states: system states that can get modified * @replace: replace all actively used patches + * @replaceable: whether this patch can be replaced or not * @list: list node for global list of actively used patches * @kobj: kobject for sysfs resources * @obj_list: dynamic list of the object entries @@ -138,6 +139,7 @@ struct klp_patch { struct klp_object *objs; struct klp_state *states; bool replace; + bool replaceable; =20 /* internal */ struct list_head list; diff --git a/kernel/livepatch/core.c b/kernel/livepatch/core.c index 28d15ba58a26..04f9e84f114f 100644 --- a/kernel/livepatch/core.c +++ b/kernel/livepatch/core.c @@ -351,6 +351,7 @@ int klp_apply_section_relocs(struct module *pmod, Elf_S= hdr *sechdrs, * /sys/kernel/livepatch//transition * /sys/kernel/livepatch//force * /sys/kernel/livepatch//replace + * /sys/kernel/livepatch//replaceable * /sys/kernel/livepatch//stack_order * /sys/kernel/livepatch// * /sys/kernel/livepatch///patched @@ -478,17 +479,60 @@ static ssize_t stack_order_show(struct kobject *kobj, return sysfs_emit(buf, "%d\n", stack_order); } =20 +static ssize_t replaceable_store(struct kobject *kobj, struct kobj_attribu= te *attr, + const char *buf, size_t count) +{ + struct klp_patch *patch; + bool replaceable; + int ret; + + ret =3D kstrtobool(buf, &replaceable); + if (ret) + return ret; + + patch =3D container_of(kobj, struct klp_patch, kobj); + + mutex_lock(&klp_mutex); + + if (patch->replaceable =3D=3D replaceable) + goto out; + + if (patch =3D=3D klp_transition_patch) { + ret =3D -EAGAIN; + goto out; + } + + patch->replaceable =3D replaceable; + +out: + mutex_unlock(&klp_mutex); + + if (ret) + return ret; + return count; +} +static ssize_t replaceable_show(struct kobject *kobj, + struct kobj_attribute *attr, char *buf) +{ + struct klp_patch *patch; + + patch =3D container_of(kobj, struct klp_patch, kobj); + return sysfs_emit(buf, "%d\n", patch->replaceable); +} + static struct kobj_attribute enabled_kobj_attr =3D __ATTR_RW(enabled); static struct kobj_attribute transition_kobj_attr =3D __ATTR_RO(transition= ); static struct kobj_attribute force_kobj_attr =3D __ATTR_WO(force); static struct kobj_attribute replace_kobj_attr =3D __ATTR_RO(replace); static struct kobj_attribute stack_order_kobj_attr =3D __ATTR_RO(stack_ord= er); +static struct kobj_attribute replaceable_kobj_attr =3D __ATTR_RW(replaceab= le); static struct attribute *klp_patch_attrs[] =3D { &enabled_kobj_attr.attr, &transition_kobj_attr.attr, &force_kobj_attr.attr, &replace_kobj_attr.attr, &stack_order_kobj_attr.attr, + &replaceable_kobj_attr.attr, NULL }; ATTRIBUTE_GROUPS(klp_patch); --=20 2.47.3 From nobody Sun Jun 14 09:56:33 2026 Received: from mail-pj1-f49.google.com (mail-pj1-f49.google.com [209.85.216.49]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 97D123939D2 for ; Thu, 2 Apr 2026 09:26:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775122022; cv=none; b=W8ngt3USIWCxnLggmBAzIYd1Y8ezhTI3P4YG/9bLSBPco7+r3BdVyH1MxFRWkFSEfgU1tVMjiawrZkq7R5x9ovyJ6DjZoAbxsnhxsQm8oJZGIPwg0Lqh7Xy6IiqI+GD+citw19PFb5TOlSEEseGqHBSFrE1a5sSe92b0ESkyL7o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775122022; c=relaxed/simple; bh=8qL3h59juOVKtdfVtW9fmnPkaOy3E2k5IewpcRqOTrg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=MOHcIdFlgErGbdHQm7hqsmc+7C10+aYfVrc9jQE5OE7wBpBAesq//8nDliEtWW2rKr94NIya34ZWYilr6Kpr68fITRlJPjUiBjJ9IYiSPEJUJn9yt9P3q5q6E+peltiWxnm5XMKE6mNl+Oh4anUVbLX0w7gq78q9FE/euhfrIss= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=GPTcZuwa; arc=none smtp.client-ip=209.85.216.49 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="GPTcZuwa" Received: by mail-pj1-f49.google.com with SMTP id 98e67ed59e1d1-35d94f4ee36so370541a91.3 for ; Thu, 02 Apr 2026 02:26:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775122011; x=1775726811; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=n764rmShOBun+KHnL+n7memFmLpzCXWKwyty1boEneI=; b=GPTcZuwaQ9dsujgraAxVwHHCifPXrgGVTQfKWBjvaZNkbaWhkb2Q8HTKPwxUcjbCHG HUHKYo7aeWIu07KMMVuNTXX8esTE+wTkZ0Ut/Ur5MGHA1rmeG5E7dINFJ211kcyBpnMr kAZ0CLlhS67Fy2lGrWoSQXVd+WWr6N4enueijThYCtZSQTvcbEqU61s7Yb2rc46pyrit ySnl8LBYj9kuWCZiRunjmmXguhyFu5BirCL/HDAugPDL2ffgvPz3CEyser0L/bK8hTqE Xbl2CslJ2sH31NzuUOrm9o2DKi0q+FiCySkuU6+jqmzZdEmGSresbQcRzN/i1VPyVOoX E/OA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775122011; x=1775726811; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=n764rmShOBun+KHnL+n7memFmLpzCXWKwyty1boEneI=; b=UzkADxZiNh/aGEts/YTw89Wnyg9ddIScxopLxv1EoqqvlOknSqfPY3w+qjyAvckgDq kbFiNWaVR+okuFfV9PZOGWBGBUai2xggmmGRuoIRM1F1aCe0ZIwyHckXTOk57zMX8GtC 069gOBej/sKrZX4NRrgNBl4mBDbaSRnbah/oC9cxYn2EH4Zfv9WbwaDuckLUTHS0FPSd nh62rthzJksr3ZeCbK3A6r1YQiyun8NPwOYMCzKrBnb0qrFPxMtdNEe4mtgWF+7x4nxl B33Ly9H6e3mWBXGRhU7cBVIIyTa9Aer0GfJvrTriwGJjVlQHUvURcELL3V3Hoe1rbSM3 fSTA== X-Forwarded-Encrypted: i=1; AJvYcCVonYQ0we+h29MuLotxnjzS9129UtFnW5rp76uZvxsGq6/lTmtUwdR9U1aZkheclVoASIFDJWZQL/nlCzY=@vger.kernel.org X-Gm-Message-State: AOJu0YxmTfyaq91Aqg2n45GX3KEknb/KoUh/21j+jH18afZyrPdm06LP EYtJqDxPLcsKdtoVKL3Y/k4styHvdXORdChw+l7wsQqJgPBfYGuglUDS X-Gm-Gg: AeBDietxAgdqCE2r0LXUZcJzj8jM5rWMBnS66D/nst5LtnyBznjrXVdkqBa4IF3Zucs D+Ro8Js4S+7PajCnJuISl1ixz/JpIRQw0Y1B1NBvmOm/h/Fgx8E9Z2DTKX6TobWg6I/paSImyHy zfyt8zr7Vu0eZ1oTpKfHV8R+mNoli+pWojhqjKXLlK9baGu3bS+7ZumLbGrrmbGMOt00vlFyCnw qPwl6VYd6v48zseKBr2gntPQLOKOI1YAnjG1WhHZiFAv2eUkdNyKgqee/ng3nb3hwD6Wi7jwSt2 0OKsHQKMS8LS3Z/QD+F+y2rkY4VJ1VUbt8wum4jPtHlx5l10/nGOlBG7iYOotDwGifcdDYdA9xv 6MssYIDSlpkCcu5ezWv0Fio0VnfCJ8j9lN8EfP3zUp8pUB9DLfhybipaz0zl6Oh2+aZCe82IyWR QRWcu5akoEINMN0bAVtZhjZ+4R8naOE8Q09hoeqm2lP7kn X-Received: by 2002:a17:90b:5890:b0:35c:1695:24a3 with SMTP id 98e67ed59e1d1-35dc7002648mr6149423a91.23.1775122011254; Thu, 02 Apr 2026 02:26:51 -0700 (PDT) Received: from yafangs-Air ([2409:891f:1aa0:8613:19f3:7bee:2e41:149e]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-35dd35f50e9sm2227645a91.6.2026.04.02.02.26.44 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Thu, 02 Apr 2026 02:26:50 -0700 (PDT) From: Yafang Shao To: jpoimboe@kernel.org, jikos@kernel.org, mbenes@suse.cz, pmladek@suse.com, joe.lawrence@redhat.com, rostedt@goodmis.org, mhiramat@kernel.org, mathieu.desnoyers@efficios.com, kpsingh@kernel.org, mattbobrowski@google.com, song@kernel.org, jolsa@kernel.org, ast@kernel.org, daniel@iogearbox.net, andrii@kernel.org, martin.lau@linux.dev, eddyz87@gmail.com, memxor@gmail.com, yonghong.song@linux.dev Cc: live-patching@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, bpf@vger.kernel.org, Yafang Shao Subject: [RFC PATCH 4/4] livepatch: Implement livepatch hybrid mode Date: Thu, 2 Apr 2026 17:26:07 +0800 Message-ID: <20260402092607.96430-5-laoar.shao@gmail.com> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20260402092607.96430-1-laoar.shao@gmail.com> References: <20260402092607.96430-1-laoar.shao@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Livepatching allows for rapid experimentation with new kernel features without interrupting production workloads. However, static livepatches lack the flexibility required to tune features based on task-specific attributes, such as cgroup membership, which is critical in multi-tenant k8s environments. Furthermore, hardcoding logic into a livepatch prevents dynamic adjustments based on the runtime environment. To address this, we propose a hybrid approach using BPF. Our production use case involves: 1. Deploying a Livepatch function to serve as a stable BPF hook. 2. Utilizing bpf_override_return() to dynamically modify the return value of that hook based on the current task's context. A significant challenge arises when atomic-replace is enabled. In this mode, deploying a new livepatch changes the target function's address, forcing a re-attachment of the BPF program. This re-attachment latency is unacceptable in critical paths, such as those handling networking policies. To solve this, we introduce a hybrid livepatch mode that allows specific patches to remain non-replaceable, ensuring the function address remains stable and the BPF program stays attached. Signed-off-by: Yafang Shao --- kernel/livepatch/core.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/kernel/livepatch/core.c b/kernel/livepatch/core.c index 04f9e84f114f..5a44154131c8 100644 --- a/kernel/livepatch/core.c +++ b/kernel/livepatch/core.c @@ -665,6 +665,8 @@ static int klp_add_nops(struct klp_patch *patch) klp_for_each_object(old_patch, old_obj) { int err; =20 + if (!old_patch->replaceable) + continue; err =3D klp_add_object_nops(patch, old_obj); if (err) return err; @@ -837,6 +839,8 @@ void klp_free_replaced_patches_async(struct klp_patch *= new_patch) klp_for_each_patch_safe(old_patch, tmp_patch) { if (old_patch =3D=3D new_patch) return; + if (!old_patch->replaceable) + continue; klp_free_patch_async(old_patch); } } @@ -1239,6 +1243,8 @@ void klp_unpatch_replaced_patches(struct klp_patch *n= ew_patch) if (old_patch =3D=3D new_patch) return; =20 + if (!old_patch->replaceable) + continue; old_patch->enabled =3D false; klp_unpatch_objects(old_patch); } --=20 2.47.3