On Tue, Oct 10, 2023 at 12:00 PM Dave Marchevsky <davemarchevsky@xxxxxx> wrote: > > This patch adds kfuncs bpf_iter_task_vma_{new,next,destroy} which allow > creation and manipulation of struct bpf_iter_task_vma in open-coded > iterator style. BPF programs can use these kfuncs directly or through > bpf_for_each macro for natural-looking iteration of all task vmas. > > The implementation borrows heavily from bpf_find_vma helper's locking - > differing only in that it holds the mmap_read lock for all iterations > while the helper only executes its provided callback on a maximum of 1 > vma. Aside from locking, struct vma_iterator and vma_next do all the > heavy lifting. > > A pointer to an inner data struct, struct bpf_iter_task_vma_data, is the > only field in struct bpf_iter_task_vma. This is because the inner data > struct contains a struct vma_iterator (not ptr), whose size is likely to > change under us. If bpf_iter_task_vma_kern contained vma_iterator directly > such a change would require change in opaque bpf_iter_task_vma struct's > size. So better to allocate vma_iterator using BPF allocator, and since > that alloc must already succeed, might as well allocate all iter fields, > thereby freezing struct bpf_iter_task_vma size. > > Signed-off-by: Dave Marchevsky <davemarchevsky@xxxxxx> > Cc: Nathan Slingerland <slinger@xxxxxxxx> > --- > kernel/bpf/helpers.c | 3 ++ > kernel/bpf/task_iter.c | 85 ++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 88 insertions(+) > LGTM. Acked-by: Andrii Nakryiko <andrii@xxxxxxxxxx> > diff --git a/kernel/bpf/helpers.c b/kernel/bpf/helpers.c > index d2840dd5b00d..62a53ebfedf9 100644 > --- a/kernel/bpf/helpers.c > +++ b/kernel/bpf/helpers.c [...]