From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7F35CC369C2 for ; Mon, 28 Apr 2025 03:36:49 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id B65CD6B0010; Sun, 27 Apr 2025 23:36:48 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id AEE336B0011; Sun, 27 Apr 2025 23:36:48 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 87EFC6B0012; Sun, 27 Apr 2025 23:36:48 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0012.hostedemail.com [216.40.44.12]) by kanga.kvack.org (Postfix) with ESMTP id 5F0466B0010 for ; Sun, 27 Apr 2025 23:36:48 -0400 (EDT) Received: from smtpin17.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id 16FD65EAE4 for ; Mon, 28 Apr 2025 03:36:48 +0000 (UTC) X-FDA: 83382040896.17.469CE02 Received: from out-181.mta1.migadu.com (out-181.mta1.migadu.com [95.215.58.181]) by imf09.hostedemail.com (Postfix) with ESMTP id 635F0140002 for ; Mon, 28 Apr 2025 03:36:46 +0000 (UTC) Authentication-Results: imf09.hostedemail.com; dkim=pass header.d=linux.dev header.s=key1 header.b=MV+ZBc7Y; dmarc=pass (policy=none) header.from=linux.dev; spf=pass (imf09.hostedemail.com: domain of roman.gushchin@linux.dev designates 95.215.58.181 as permitted sender) smtp.mailfrom=roman.gushchin@linux.dev ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1745811406; a=rsa-sha256; cv=none; b=3oszwrObvPpzxE4ackltuFR0DYGUowYDvjVLaPRgWlS04Lq3LU6l8Cy+jzVJfmrxrnEp/N yVfrkY4eht/NXpjYlNL1Wx1enYKXzDckQk7bUClpUMmScNKX8839mTXqQzrjzz+iHAmmcx cDBFGgAZqJL+KYDA+9lPhH3TYPXZe90= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1745811406; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=5UgujTTC+M44uRBA0W/V1VZG3lLjwg8UiEHcHCfP0z0=; b=Wr/o/Ck+rc/5oB53bJH3YcQPdYwYMuN/ly7DPHWwdr/u26lcubKvW6Q9hdXQVJIv2jrBER r2UAXzyC7Weo2MiFlIP+JJQk9IMpFbfCIjd9lvpdUuYkN1wyqiV7laGBeEv2nErURNsr4f mdVmwAZcf7pWdksEYiRg9qO26hmA6fY= ARC-Authentication-Results: i=1; imf09.hostedemail.com; dkim=pass header.d=linux.dev header.s=key1 header.b=MV+ZBc7Y; dmarc=pass (policy=none) header.from=linux.dev; spf=pass (imf09.hostedemail.com: domain of roman.gushchin@linux.dev designates 95.215.58.181 as permitted sender) smtp.mailfrom=roman.gushchin@linux.dev X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1745811404; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=5UgujTTC+M44uRBA0W/V1VZG3lLjwg8UiEHcHCfP0z0=; b=MV+ZBc7Yde26EYnylyMbUZ4BNiFwo3uT9N1TpI8VmbA/Ah8V8Fhi2wG/cC+Q08x/MxWW0A woaT+KT1s0n4iTFKfJkQlQ+8pS7YpRR9DPLXhD/olJGa6ANeaafug3Do0+6zCTJcGxgaHv OSNyU6xp9Da+pSYHz2mbSZx1NDX37zc= From: Roman Gushchin To: linux-kernel@vger.kernel.org Cc: Andrew Morton , Alexei Starovoitov , Johannes Weiner , Michal Hocko , Shakeel Butt , Suren Baghdasaryan , David Rientjes , Josh Don , Chuyi Zhou , cgroups@vger.kernel.org, linux-mm@kvack.org, bpf@vger.kernel.org, Roman Gushchin Subject: [PATCH rfc 04/12] mm: introduce bpf_oom_kill_process() bpf kfunc Date: Mon, 28 Apr 2025 03:36:09 +0000 Message-ID: <20250428033617.3797686-5-roman.gushchin@linux.dev> In-Reply-To: <20250428033617.3797686-1-roman.gushchin@linux.dev> References: <20250428033617.3797686-1-roman.gushchin@linux.dev> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Migadu-Flow: FLOW_OUT X-Rspamd-Server: rspam06 X-Rspamd-Queue-Id: 635F0140002 X-Stat-Signature: 8rgequuakcy6xoyyb78rrh6n4pznttqc X-Rspam-User: X-HE-Tag: 1745811406-822422 X-HE-Meta: U2FsdGVkX1+3PzRKSJVBf11lCgJFsLcSYFFHCtptprycpvqUKMxga/FNqbI3rm6AUGV66mwrvB6tQlsnVoh0gzDZLVw/HwiqslIiKhHdxCh8avGNusqxMAwsPEUS4Vdbxa6QwcCZ9/f8Icu6PGgcxUnVwdcp/7j4Xm2ErgXRyC00TeIVDJZWdKd+exLfxeMC2AvBWFWJca/EQWoXogG1fgSio56b5VWofBFX/GrF7Dn91m+vahF+IObLYqQX0tSZnn9F9DHaEHk1q8vOawNy2BDdBOvP7NTsp1ojO0Zd8X+ubtgKmRwr8vu0iYyexOAhUgh4NqmC0jDLfZUqtaPrG7gY8hCRzXXGp1GhrEj9ycGSPFbC+whFCnV1S2vdfCpem6vrNsPZKqvgtTaYoRrBd4hIo088oc3nQmRjGAFe83auuqFMjzFSZ4wGHdQQ/EFdDdxqyPD/zVufHrd9uq7FqkM7bOLzGPRtqcQar4tql+b0GpVPq68Jp6zs6yhvzwmlTeYijGo3ZuhIYIm0+ML/iXXJZA6IPA1auRS5al8xwLUeqs13R92gPHtQVxsifhVuWFthUcF0PvW2moT3+EGL6O2RTmKAJYna1UNCq+vLzMv7w4HX+om5CNU8W/U5+OSiVUZTP6b+hMjE+uxSJjwzRuNZFznRKoXFFyYKwLe5NSlc7hd6thyGm7BIprWdCpt9ausKivcwNM4u42yq+hzSHtnjTkso2LcP7nNrbrOmO0ewlf6/VnUGEqjMFClHz0jXzsJ6WXTjg8C+N032hdY880jSIBscWmoWO498UGrgm/DgNlpwQaKNN6AhNqXcu0zW9P9K3EwP6rIQWZvBxTegKJG9fT87OipAYlfHckP/Lyywsx4c5cgcVp6jwnvEJsixbPN84WYI/pZPFE6l2lJ1pu2F8RSd/RcxeEFevFQp7PkW86HPn0lwAG1VCkRuUPDE6rZRaGy1Kf3lXV3fGmo iKvih/4Y FQVBdTUXgbj8kfZUJC1Kneg+iDTipvB0aCDqOVzoNwrzOaZghKJKvazvF2SDdJ+WkW+EofrlZYDB0qsJzDy8DezPmJWOBK+Y4j3epoGkr4dcT2KzpSf/yVbtt2Gmd5wvsy4EXpoqLg/sgMGyILd9BfXeWFFT33YTMtXyHM7Sf/y0npkdNkyA+FKmLgjBXHlOFtG+YwntPkoDOjEgVp2vRzd5+YmXLQde2YaiY X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: Introduce bpf_oom_kill_process() bpf kfunc, which is supposed to be used by bpf OOM programs. It allows to kill a process in exactly the same way the OOM killer does: using the OOM reaper, bumping corresponding memcg and global statistics, respecting memory.oom.group etc. On success, it sets om_control's bpf_memory_freed field to true, enabling the bpf program to bypass the kernel OOM killer. Signed-off-by: Roman Gushchin --- mm/oom_kill.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/mm/oom_kill.c b/mm/oom_kill.c index d00776b63c0a..2e922e75a9df 100644 --- a/mm/oom_kill.c +++ b/mm/oom_kill.c @@ -1299,6 +1299,42 @@ SYSCALL_DEFINE2(process_mrelease, int, pidfd, unsigned int, flags) #ifdef CONFIG_BPF_SYSCALL +__bpf_kfunc_start_defs(); +/* + * Kill a process in a way similar to the kernel OOM killer. + * This means dump the necessary information to dmesg, adjust memcg + * statistics, leverage the oom reaper, respect memory.oom.group etc. + * + * bpf_oom_kill_process() marks the forward progress by setting + * oc->bpf_memory_freed. If the progress was made, the bpf program + * is free to decide if the kernel oom killer should be invoked. + * Otherwise it's enforced, so that a bad bpf program can't + * deadlock the machine on memory. + */ +__bpf_kfunc int bpf_oom_kill_process(struct oom_control *oc, + struct task_struct *task, + const char *message__str) +{ + if (oom_unkillable_task(task)) + return -EPERM; + + /* paired with put_task_struct() in oom_kill_process() */ + task = tryget_task_struct(task); + if (!task) + return -EINVAL; + + oc->chosen = task; + + oom_kill_process(oc, message__str); + + oc->chosen = NULL; + oc->bpf_memory_freed = true; + + return 0; +} + +__bpf_kfunc_end_defs(); + __bpf_hook_start(); /* @@ -1319,6 +1355,16 @@ static const struct btf_kfunc_id_set bpf_oom_hook_set = { .owner = THIS_MODULE, .set = &bpf_oom_hooks, }; + +BTF_KFUNCS_START(bpf_oom_kfuncs) +BTF_ID_FLAGS(func, bpf_oom_kill_process, KF_SLEEPABLE | KF_TRUSTED_ARGS) +BTF_KFUNCS_END(bpf_oom_kfuncs) + +static const struct btf_kfunc_id_set bpf_oom_kfunc_set = { + .owner = THIS_MODULE, + .set = &bpf_oom_kfuncs, +}; + static int __init bpf_oom_init(void) { int err; @@ -1326,6 +1372,10 @@ static int __init bpf_oom_init(void) err = register_btf_fmodret_id_set(&bpf_oom_hook_set); if (err) pr_warn("error while registering bpf oom hooks: %d", err); + err = register_btf_kfunc_id_set(BPF_PROG_TYPE_TRACING, + &bpf_oom_kfunc_set); + if (err) + pr_warn("error while registering bpf oom kfuncs: %d", err); return err; } -- 2.49.0.901.g37484f566f-goog