On Wed, Aug 27, 2025 at 11:42 PM 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? For example, we could retrieve task->comm or other attributes and make decisions based on that information. I’ll provide a clearer description in the next revision. > > > > > 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? > > 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? As explained by Andrii, the BPF verifier can protect it. > > > + * > > + * 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); > > > + if (!task) > > + goto out; > > + if (!refcount_inc_not_zero(&task->rcu_users)) > > + goto out; > > + > > + rcu_read_unlock(); > > + return task; > > + > > +out: > > + rcu_read_unlock(); > > +#endif > > This #ifdeffery is horrid, can we please just have separate functions instead of > inside the one? Thanks. > > > + return NULL; > > So we can't tell the difference between this failling due to CONFIG_MEMCG > not being set (in which case it will _always_ fail) or we couldn't get a > task or we couldn't get a refcount on the task. > > Maybe this doesn't matter since perhaps we are only using this if > CONFIG_MEMCG but in that case why even expose this if !CONFIG_MEMCG? > As suggested by Andrii, I will remove this kfunc and mark mm->owner as BTF_TYPE_SAFE_TRUSTED_OR_NULL. Thanks for your comments. -- Regards Yafang