On Thu, Aug 28, 2025 at 5:50 AM Andrii Nakryiko <andrii.nakryiko@xxxxxxxxx> wrote: > > On Wed, Aug 27, 2025 at 8:48 AM Lorenzo Stoakes > <lorenzo.stoakes@xxxxxxxxxx> wrote: > > > > On Tue, Aug 26, 2025 at 03:19:41PM +0800, Yafang Shao wrote: > > > We will utilize this new kfunc bpf_mm_get_task() to retrieve the > > > associated task_struct from the given @mm. The obtained task_struct must > > > be released by calling bpf_task_release() as a paired operation. > > > > You're basically describing the patch you're not saying why - yeah you're > > getting a task struct from an mm (only if CONFIG_MEMCG which you don't > > mention here), but not for what purpose you intend to use this? > > > > > > > > Signed-off-by: Yafang Shao <laoar.shao@xxxxxxxxx> > > > --- > > > mm/bpf_thp.c | 34 ++++++++++++++++++++++++++++++++++ > > > 1 file changed, 34 insertions(+) > > > > > > diff --git a/mm/bpf_thp.c b/mm/bpf_thp.c > > > index b757e8f425fd..46b3bc96359e 100644 > > > --- a/mm/bpf_thp.c > > > +++ b/mm/bpf_thp.c > > > @@ -205,11 +205,45 @@ __bpf_kfunc void bpf_put_mem_cgroup(struct mem_cgroup *memcg) > > > #endif > > > } > > > > > > +/** > > > + * bpf_mm_get_task - Get the task struct associated with a mm_struct. > > > + * @mm: The mm_struct to query > > > + * > > > + * The obtained task_struct must be released by calling bpf_task_release(). > > > > Hmmm so now bpf programs can cause kernel bugs by keeping a reference around? > > BPF verifier will reject any program that cannot guarantee that > bpf_task_release() will always be called. So there shouldn't be any > problem here. Thanks for the clarification. > > > > > This feels extremely dodgy, I don't like this at all. > > > > I thought the whole point of BPF was that this kind of thing couldn't possibly > > happen? > > > > Or would this be a kernel bug? > > > > If a bpf program can lead to a refcount not being put, this is not > > upstreamable surely? > > > > > + * > > > + * Return: The associated task_struct on success, or NULL on failure. Note that > > > + * this function depends on CONFIG_MEMCG being enabled - it will always return > > > + * NULL if CONFIG_MEMCG is not configured. > > > + */ > > > +__bpf_kfunc struct task_struct *bpf_mm_get_task(struct mm_struct *mm) > > > +{ > > > +#ifdef CONFIG_MEMCG > > > + struct task_struct *task; > > > + > > > + if (!mm) > > > + return NULL; > > > + rcu_read_lock(); > > > + task = rcu_dereference(mm->owner); > > Question to Yafang, though. Instead of adding new kfunc just for this, > have you tried marking mm->owner as BTF_TYPE_SAFE_TRUSTED_OR_NULL, > which, if I understand correctly, would allow BPF program to just work > with `mm->owner` (after checking for NULL) directly. And then you can > just use existing bpf_task_acquire() good suggestion. will change it. > > > > > > + if (!task) > > > + goto out; > > > + if (!refcount_inc_not_zero(&task->rcu_users)) > > > + goto out; > > nit: just call bpf_task_acquire(), which will more obviously pair with > suggested bpf_task_release()? makes sense. -- Regards Yafang