Andrii Nakryiko wrote: > Add bpf_link_new_file() API for cases when we need to ensure anon_inode is > successfully created before we proceed with expensive BPF program attachment > procedure, which will require equally (if not more so) expensive and > potentially failing compensation detachment procedure just because anon_inode > creation failed. This API allows to simplify code by ensuring first that > anon_inode is created and after BPF program is attached proceed with > fd_install() that can't fail. > > After anon_inode file is created, link can't be just kfree()'d anymore, > because its destruction will be performed by deferred file_operations->release > call. For this, bpf_link API required specifying two separate operations: > release() and dealloc(), former performing detachment only, while the latter > frees memory used by bpf_link itself. dealloc() needs to be specified, because > struct bpf_link is frequently embedded into link type-specific container > struct (e.g., struct bpf_raw_tp_link), so bpf_link itself doesn't know how to > properly free the memory. In case when anon_inode file was successfully > created, but subsequent BPF attachment failed, bpf_link needs to be marked as > "defunct", so that file's release() callback will perform only memory > deallocation, but no detachment. > > Convert raw tracepoint and tracing attachment to new API and eliminate > detachment from error handling path. > > Signed-off-by: Andrii Nakryiko <andriin@xxxxxx> > --- LGTM Acked-by: John Fastabend <john.fastabend@xxxxxxxxx>