[PATCH bpf-next v4 0/5] Replace CONFIG_DMABUF_SYSFS_STATS with BPF

T.J. Mercier posted 5 patches 9 months ago
There is a newer version of this series
drivers/dma-buf/dma-buf.c                     |  98 +++++--
include/linux/dma-buf.h                       |   4 +-
kernel/bpf/Makefile                           |   3 +
kernel/bpf/dmabuf_iter.c                      | 149 ++++++++++
kernel/bpf/helpers.c                          |   5 +
.../testing/selftests/bpf/bpf_experimental.h  |   5 +
tools/testing/selftests/bpf/config            |   3 +
.../selftests/bpf/prog_tests/dmabuf_iter.c    | 258 ++++++++++++++++++
.../testing/selftests/bpf/progs/dmabuf_iter.c |  91 ++++++
9 files changed, 594 insertions(+), 22 deletions(-)
create mode 100644 kernel/bpf/dmabuf_iter.c
create mode 100644 tools/testing/selftests/bpf/prog_tests/dmabuf_iter.c
create mode 100644 tools/testing/selftests/bpf/progs/dmabuf_iter.c
[PATCH bpf-next v4 0/5] Replace CONFIG_DMABUF_SYSFS_STATS with BPF
Posted by T.J. Mercier 9 months ago
Until CONFIG_DMABUF_SYSFS_STATS was added [1] it was only possible to
perform per-buffer accounting with debugfs which is not suitable for
production environments. Eventually we discovered the overhead with
per-buffer sysfs file creation/removal was significantly impacting
allocation and free times, and exacerbated kernfs lock contention. [2]
dma_buf_stats_setup() is responsible for 39% of single-page buffer
creation duration, or 74% of single-page dma_buf_export() duration when
stressing dmabuf allocations and frees.

I prototyped a change from per-buffer to per-exporter statistics with a
RCU protected list of exporter allocations that accommodates most (but
not all) of our use-cases and avoids almost all of the sysfs overhead.
While that adds less overhead than per-buffer sysfs, and less even than
the maintenance of the dmabuf debugfs_list, it's still *additional*
overhead on top of the debugfs_list and doesn't give us per-buffer info.

This series uses the existing dmabuf debugfs_list to implement a BPF
dmabuf iterator, which adds no overhead to buffer allocation/free and
provides per-buffer info. The list has been moved outside of
CONFIG_DEBUG_FS scope so that it is always populated. The BPF program
loaded by userspace that extracts per-buffer information gets to define
its own interface which avoids the lack of ABI stability with debugfs.

This will allow us to replace our use of CONFIG_DMABUF_SYSFS_STATS, and
the plan is to remove it from the kernel after the next longterm stable
release.

[1] https://lore.kernel.org/linux-media/20201210044400.1080308-1-hridya@google.com
[2] https://lore.kernel.org/all/20220516171315.2400578-1-tjmercier@google.com

v1: https://lore.kernel.org/all/20250414225227.3642618-1-tjmercier@google.com
v1 -> v2:
Make the DMA buffer list independent of CONFIG_DEBUG_FS per Christian König
Add CONFIG_DMA_SHARED_BUFFER check to kernel/bpf/Makefile per kernel test robot
Use BTF_ID_LIST_SINGLE instead of BTF_ID_LIST_GLOBAL_SINGLE per Song Liu
Fixup comment style, mixing code/declarations, and use ASSERT_OK_FD in selftest per Song Liu
Add BPF_ITER_RESCHED feature to bpf_dmabuf_reg_info per Alexei Starovoitov
Add open-coded iterator and selftest per Alexei Starovoitov
Add a second test buffer from the system dmabuf heap to selftests
Use the BPF program we'll use in production for selftest per Alexei Starovoitov
  https://r.android.com/c/platform/system/bpfprogs/+/3616123/2/dmabufIter.c
  https://r.android.com/c/platform/system/memory/libmeminfo/+/3614259/1/libdmabufinfo/dmabuf_bpf_stats.cpp
v2: https://lore.kernel.org/all/20250504224149.1033867-1-tjmercier@google.com
v2 -> v3:
Rebase onto bpf-next/master
Move get_next_dmabuf() into drivers/dma-buf/dma-buf.c, along with the
  new get_first_dmabuf(). This avoids having to expose the dmabuf list
  and mutex to the rest of the kernel, and keeps the dmabuf mutex
  operations near each other in the same file. (Christian König)
Add Christian's RB to dma-buf: Rename debugfs symbols
Drop RFC: dma-buf: Remove DMA-BUF statistics
v3: https://lore.kernel.org/all/20250507001036.2278781-1-tjmercier@google.com
v3 -> v4:
Fix selftest BPF program comment style (not kdoc) per Alexei Starovoitov
Fix dma-buf.c kdoc comment style per Alexei Starovoitov
Rename get_first_dmabuf / get_next_dmabuf to dma_buf_iter_begin /
  dma_buf_iter_next per Christian König
Add Christian's RB to bpf: Add dmabuf iterator

T.J. Mercier (5):
  dma-buf: Rename debugfs symbols
  bpf: Add dmabuf iterator
  bpf: Add open coded dmabuf iterator
  selftests/bpf: Add test for dmabuf_iter
  selftests/bpf: Add test for open coded dmabuf_iter

 drivers/dma-buf/dma-buf.c                     |  98 +++++--
 include/linux/dma-buf.h                       |   4 +-
 kernel/bpf/Makefile                           |   3 +
 kernel/bpf/dmabuf_iter.c                      | 149 ++++++++++
 kernel/bpf/helpers.c                          |   5 +
 .../testing/selftests/bpf/bpf_experimental.h  |   5 +
 tools/testing/selftests/bpf/config            |   3 +
 .../selftests/bpf/prog_tests/dmabuf_iter.c    | 258 ++++++++++++++++++
 .../testing/selftests/bpf/progs/dmabuf_iter.c |  91 ++++++
 9 files changed, 594 insertions(+), 22 deletions(-)
 create mode 100644 kernel/bpf/dmabuf_iter.c
 create mode 100644 tools/testing/selftests/bpf/prog_tests/dmabuf_iter.c
 create mode 100644 tools/testing/selftests/bpf/progs/dmabuf_iter.c


base-commit: 43745d11bfd9683abdf08ad7a5cc403d6a9ffd15
-- 
2.49.0.1015.ga840276032-goog
Re: [PATCH bpf-next v4 0/5] Replace CONFIG_DMABUF_SYSFS_STATS with BPF
Posted by Christian König 9 months ago
Feel free to add my Acked-by to the patches which don't have my rb yet.

And ping me when I should upstream this through drm-misc-next, but if you want to upstream this through some other branch then that is fine with me as well.

Regards,
Christian.

On 5/8/25 20:20, T.J. Mercier wrote:
> Until CONFIG_DMABUF_SYSFS_STATS was added [1] it was only possible to
> perform per-buffer accounting with debugfs which is not suitable for
> production environments. Eventually we discovered the overhead with
> per-buffer sysfs file creation/removal was significantly impacting
> allocation and free times, and exacerbated kernfs lock contention. [2]
> dma_buf_stats_setup() is responsible for 39% of single-page buffer
> creation duration, or 74% of single-page dma_buf_export() duration when
> stressing dmabuf allocations and frees.
> 
> I prototyped a change from per-buffer to per-exporter statistics with a
> RCU protected list of exporter allocations that accommodates most (but
> not all) of our use-cases and avoids almost all of the sysfs overhead.
> While that adds less overhead than per-buffer sysfs, and less even than
> the maintenance of the dmabuf debugfs_list, it's still *additional*
> overhead on top of the debugfs_list and doesn't give us per-buffer info.
> 
> This series uses the existing dmabuf debugfs_list to implement a BPF
> dmabuf iterator, which adds no overhead to buffer allocation/free and
> provides per-buffer info. The list has been moved outside of
> CONFIG_DEBUG_FS scope so that it is always populated. The BPF program
> loaded by userspace that extracts per-buffer information gets to define
> its own interface which avoids the lack of ABI stability with debugfs.
> 
> This will allow us to replace our use of CONFIG_DMABUF_SYSFS_STATS, and
> the plan is to remove it from the kernel after the next longterm stable
> release.
> 
> [1] https://lore.kernel.org/linux-media/20201210044400.1080308-1-hridya@google.com
> [2] https://lore.kernel.org/all/20220516171315.2400578-1-tjmercier@google.com
> 
> v1: https://lore.kernel.org/all/20250414225227.3642618-1-tjmercier@google.com
> v1 -> v2:
> Make the DMA buffer list independent of CONFIG_DEBUG_FS per Christian König
> Add CONFIG_DMA_SHARED_BUFFER check to kernel/bpf/Makefile per kernel test robot
> Use BTF_ID_LIST_SINGLE instead of BTF_ID_LIST_GLOBAL_SINGLE per Song Liu
> Fixup comment style, mixing code/declarations, and use ASSERT_OK_FD in selftest per Song Liu
> Add BPF_ITER_RESCHED feature to bpf_dmabuf_reg_info per Alexei Starovoitov
> Add open-coded iterator and selftest per Alexei Starovoitov
> Add a second test buffer from the system dmabuf heap to selftests
> Use the BPF program we'll use in production for selftest per Alexei Starovoitov
>   https://r.android.com/c/platform/system/bpfprogs/+/3616123/2/dmabufIter.c
>   https://r.android.com/c/platform/system/memory/libmeminfo/+/3614259/1/libdmabufinfo/dmabuf_bpf_stats.cpp
> v2: https://lore.kernel.org/all/20250504224149.1033867-1-tjmercier@google.com
> v2 -> v3:
> Rebase onto bpf-next/master
> Move get_next_dmabuf() into drivers/dma-buf/dma-buf.c, along with the
>   new get_first_dmabuf(). This avoids having to expose the dmabuf list
>   and mutex to the rest of the kernel, and keeps the dmabuf mutex
>   operations near each other in the same file. (Christian König)
> Add Christian's RB to dma-buf: Rename debugfs symbols
> Drop RFC: dma-buf: Remove DMA-BUF statistics
> v3: https://lore.kernel.org/all/20250507001036.2278781-1-tjmercier@google.com
> v3 -> v4:
> Fix selftest BPF program comment style (not kdoc) per Alexei Starovoitov
> Fix dma-buf.c kdoc comment style per Alexei Starovoitov
> Rename get_first_dmabuf / get_next_dmabuf to dma_buf_iter_begin /
>   dma_buf_iter_next per Christian König
> Add Christian's RB to bpf: Add dmabuf iterator
> 
> T.J. Mercier (5):
>   dma-buf: Rename debugfs symbols
>   bpf: Add dmabuf iterator
>   bpf: Add open coded dmabuf iterator
>   selftests/bpf: Add test for dmabuf_iter
>   selftests/bpf: Add test for open coded dmabuf_iter
> 
>  drivers/dma-buf/dma-buf.c                     |  98 +++++--
>  include/linux/dma-buf.h                       |   4 +-
>  kernel/bpf/Makefile                           |   3 +
>  kernel/bpf/dmabuf_iter.c                      | 149 ++++++++++
>  kernel/bpf/helpers.c                          |   5 +
>  .../testing/selftests/bpf/bpf_experimental.h  |   5 +
>  tools/testing/selftests/bpf/config            |   3 +
>  .../selftests/bpf/prog_tests/dmabuf_iter.c    | 258 ++++++++++++++++++
>  .../testing/selftests/bpf/progs/dmabuf_iter.c |  91 ++++++
>  9 files changed, 594 insertions(+), 22 deletions(-)
>  create mode 100644 kernel/bpf/dmabuf_iter.c
>  create mode 100644 tools/testing/selftests/bpf/prog_tests/dmabuf_iter.c
>  create mode 100644 tools/testing/selftests/bpf/progs/dmabuf_iter.c
> 
> 
> base-commit: 43745d11bfd9683abdf08ad7a5cc403d6a9ffd15

Re: [PATCH bpf-next v4 0/5] Replace CONFIG_DMABUF_SYSFS_STATS with BPF
Posted by T.J. Mercier 9 months ago
On Thu, May 8, 2025 at 11:04 PM Christian König
<christian.koenig@amd.com> wrote:
>
> Feel free to add my Acked-by to the patches which don't have my rb yet.
>
> And ping me when I should upstream this through drm-misc-next, but if you want to upstream this through some other branch then that is fine with me as well.

Thanks Christian. Alexei mentioned he was willing to take the series
through bpf-next here:
https://lore.kernel.org/all/CAADnVQLqv-ZpoQEhk2UwvSZorSLcjgF7qLD76oHguH5-GcSXxA@mail.gmail.com/

I think it makes sense to send the CONFIG_DMABUF_SYSFS_STATS removal
through drm-misc-next though, so I'll resend that as a standalone
patch whenever I hear about the next longterm stable release.

>
> Regards,
> Christian.
>
> On 5/8/25 20:20, T.J. Mercier wrote:
> > Until CONFIG_DMABUF_SYSFS_STATS was added [1] it was only possible to
> > perform per-buffer accounting with debugfs which is not suitable for
> > production environments. Eventually we discovered the overhead with
> > per-buffer sysfs file creation/removal was significantly impacting
> > allocation and free times, and exacerbated kernfs lock contention. [2]
> > dma_buf_stats_setup() is responsible for 39% of single-page buffer
> > creation duration, or 74% of single-page dma_buf_export() duration when
> > stressing dmabuf allocations and frees.
> >
> > I prototyped a change from per-buffer to per-exporter statistics with a
> > RCU protected list of exporter allocations that accommodates most (but
> > not all) of our use-cases and avoids almost all of the sysfs overhead.
> > While that adds less overhead than per-buffer sysfs, and less even than
> > the maintenance of the dmabuf debugfs_list, it's still *additional*
> > overhead on top of the debugfs_list and doesn't give us per-buffer info.
> >
> > This series uses the existing dmabuf debugfs_list to implement a BPF
> > dmabuf iterator, which adds no overhead to buffer allocation/free and
> > provides per-buffer info. The list has been moved outside of
> > CONFIG_DEBUG_FS scope so that it is always populated. The BPF program
> > loaded by userspace that extracts per-buffer information gets to define
> > its own interface which avoids the lack of ABI stability with debugfs.
> >
> > This will allow us to replace our use of CONFIG_DMABUF_SYSFS_STATS, and
> > the plan is to remove it from the kernel after the next longterm stable
> > release.
> >
> > [1] https://lore.kernel.org/linux-media/20201210044400.1080308-1-hridya@google.com
> > [2] https://lore.kernel.org/all/20220516171315.2400578-1-tjmercier@google.com
> >
> > v1: https://lore.kernel.org/all/20250414225227.3642618-1-tjmercier@google.com
> > v1 -> v2:
> > Make the DMA buffer list independent of CONFIG_DEBUG_FS per Christian König
> > Add CONFIG_DMA_SHARED_BUFFER check to kernel/bpf/Makefile per kernel test robot
> > Use BTF_ID_LIST_SINGLE instead of BTF_ID_LIST_GLOBAL_SINGLE per Song Liu
> > Fixup comment style, mixing code/declarations, and use ASSERT_OK_FD in selftest per Song Liu
> > Add BPF_ITER_RESCHED feature to bpf_dmabuf_reg_info per Alexei Starovoitov
> > Add open-coded iterator and selftest per Alexei Starovoitov
> > Add a second test buffer from the system dmabuf heap to selftests
> > Use the BPF program we'll use in production for selftest per Alexei Starovoitov
> >   https://r.android.com/c/platform/system/bpfprogs/+/3616123/2/dmabufIter.c
> >   https://r.android.com/c/platform/system/memory/libmeminfo/+/3614259/1/libdmabufinfo/dmabuf_bpf_stats.cpp
> > v2: https://lore.kernel.org/all/20250504224149.1033867-1-tjmercier@google.com
> > v2 -> v3:
> > Rebase onto bpf-next/master
> > Move get_next_dmabuf() into drivers/dma-buf/dma-buf.c, along with the
> >   new get_first_dmabuf(). This avoids having to expose the dmabuf list
> >   and mutex to the rest of the kernel, and keeps the dmabuf mutex
> >   operations near each other in the same file. (Christian König)
> > Add Christian's RB to dma-buf: Rename debugfs symbols
> > Drop RFC: dma-buf: Remove DMA-BUF statistics
> > v3: https://lore.kernel.org/all/20250507001036.2278781-1-tjmercier@google.com
> > v3 -> v4:
> > Fix selftest BPF program comment style (not kdoc) per Alexei Starovoitov
> > Fix dma-buf.c kdoc comment style per Alexei Starovoitov
> > Rename get_first_dmabuf / get_next_dmabuf to dma_buf_iter_begin /
> >   dma_buf_iter_next per Christian König
> > Add Christian's RB to bpf: Add dmabuf iterator
> >
> > T.J. Mercier (5):
> >   dma-buf: Rename debugfs symbols
> >   bpf: Add dmabuf iterator
> >   bpf: Add open coded dmabuf iterator
> >   selftests/bpf: Add test for dmabuf_iter
> >   selftests/bpf: Add test for open coded dmabuf_iter
> >
> >  drivers/dma-buf/dma-buf.c                     |  98 +++++--
> >  include/linux/dma-buf.h                       |   4 +-
> >  kernel/bpf/Makefile                           |   3 +
> >  kernel/bpf/dmabuf_iter.c                      | 149 ++++++++++
> >  kernel/bpf/helpers.c                          |   5 +
> >  .../testing/selftests/bpf/bpf_experimental.h  |   5 +
> >  tools/testing/selftests/bpf/config            |   3 +
> >  .../selftests/bpf/prog_tests/dmabuf_iter.c    | 258 ++++++++++++++++++
> >  .../testing/selftests/bpf/progs/dmabuf_iter.c |  91 ++++++
> >  9 files changed, 594 insertions(+), 22 deletions(-)
> >  create mode 100644 kernel/bpf/dmabuf_iter.c
> >  create mode 100644 tools/testing/selftests/bpf/prog_tests/dmabuf_iter.c
> >  create mode 100644 tools/testing/selftests/bpf/progs/dmabuf_iter.c
> >
> >
> > base-commit: 43745d11bfd9683abdf08ad7a5cc403d6a9ffd15
>