From: "Christian König" <christian.koenig@amd.com>
To: Simon Ser <contact@emersion.fr>, dri-devel@lists.freedesktop.org
Cc: Jason Ekstrand <jason.ekstrand@collabora.com>,
Greg KH <greg@kroah.com>, Daniel Vetter <daniel.vetter@ffwll.ch>
Subject: Re: [PATCH v3] dma-buf: Add a capabilities directory
Date: Mon, 30 May 2022 09:09:30 +0200 [thread overview]
Message-ID: <dbee55fd-37ac-d7cd-dc78-d72776dfdfac@amd.com> (raw)
In-Reply-To: <20220527073422.367910-1-contact@emersion.fr>
Am 27.05.22 um 09:34 schrieb Simon Ser:
> To discover support for new DMA-BUF IOCTLs, user-space has no
> choice but to try to perform the IOCTL on an existing DMA-BUF.
> However, user-space may want to figure out whether or not the
> IOCTL is available before it has a DMA-BUF at hand, e.g. at
> initialization time in a Wayland compositor.
>
> Add a /sys/kernel/dmabuf/caps directory which allows the DMA-BUF
> subsystem to advertise supported features. Add a
> sync_file_import_export entry which indicates that importing and
> exporting sync_files from/to DMA-BUFs is supported.
I find a separate directory rather unusual, but can't come up with any
better idea either.
IIRC the security module had a mask file with names for the supported
capabilities.
>
> v2: Add missing files lost in a rebase
>
> v3:
> - Create separate file in Documentation/ABI/testing/, add it to
> MAINTAINERS
> - Fix kernel version (Daniel)
> - Remove unnecessary brackets (Jason)
> - Fix SPDX comment style
>
> Signed-off-by: Simon Ser <contact@emersion.fr>
> Reviewed-by: Jason Ekstrand <jason.ekstrand@collabora.com>
> Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
> Cc: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
> Cc: Christian König <christian.koenig@amd.com>
> Cc: Greg KH <greg@kroah.com>
> ---
> .../ABI/testing/sysfs-kernel-dmabuf-caps | 13 +++++
> MAINTAINERS | 1 +
> drivers/dma-buf/Makefile | 2 +-
> drivers/dma-buf/dma-buf-sysfs-caps.c | 51 +++++++++++++++++++
> drivers/dma-buf/dma-buf-sysfs-caps.h | 16 ++++++
> drivers/dma-buf/dma-buf-sysfs-stats.c | 16 ++----
> drivers/dma-buf/dma-buf-sysfs-stats.h | 6 ++-
> drivers/dma-buf/dma-buf.c | 43 ++++++++++++++--
> include/uapi/linux/dma-buf.h | 6 +++
> 9 files changed, 134 insertions(+), 20 deletions(-)
> create mode 100644 Documentation/ABI/testing/sysfs-kernel-dmabuf-caps
> create mode 100644 drivers/dma-buf/dma-buf-sysfs-caps.c
> create mode 100644 drivers/dma-buf/dma-buf-sysfs-caps.h
>
> diff --git a/Documentation/ABI/testing/sysfs-kernel-dmabuf-caps b/Documentation/ABI/testing/sysfs-kernel-dmabuf-caps
> new file mode 100644
> index 000000000000..f83af422fd18
> --- /dev/null
> +++ b/Documentation/ABI/testing/sysfs-kernel-dmabuf-caps
> @@ -0,0 +1,13 @@
> +What: /sys/kernel/dmabuf/caps
> +Date: May 2022
> +KernelVersion: v5.20
> +Contact: Simon Ser <contact@emersion.fr>
> +Description: This directory advertises DMA-BUF capabilities supported by the
> + kernel.
> +
> +What: /sys/kernel/dmabuf/caps/sync_file_import_export
> +Date: May 2022
> +KernelVersion: v5.20
> +Contact: Simon Ser <contact@emersion.fr>
> +Description: This file is read-only and advertises support for importing and
> + exporting sync_files from/to DMA-BUFs.
> diff --git a/MAINTAINERS b/MAINTAINERS
> index 11da16bfa123..8966686f7231 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -5871,6 +5871,7 @@ L: dri-devel@lists.freedesktop.org
> L: linaro-mm-sig@lists.linaro.org (moderated for non-subscribers)
> S: Maintained
> T: git git://anongit.freedesktop.org/drm/drm-misc
> +F: Documentation/ABI/testing/sysfs-kernel-dmabuf-caps
> F: Documentation/driver-api/dma-buf.rst
> F: drivers/dma-buf/
> F: include/linux/*fence.h
> diff --git a/drivers/dma-buf/Makefile b/drivers/dma-buf/Makefile
> index 4c9eb53ba3f8..afc874272710 100644
> --- a/drivers/dma-buf/Makefile
> +++ b/drivers/dma-buf/Makefile
> @@ -1,6 +1,6 @@
> # SPDX-License-Identifier: GPL-2.0-only
> obj-y := dma-buf.o dma-fence.o dma-fence-array.o dma-fence-chain.o \
> - dma-resv.o
> + dma-resv.o dma-buf-sysfs-caps.o
> obj-$(CONFIG_DMABUF_HEAPS) += dma-heap.o
> obj-$(CONFIG_DMABUF_HEAPS) += heaps/
> obj-$(CONFIG_SYNC_FILE) += sync_file.o
> diff --git a/drivers/dma-buf/dma-buf-sysfs-caps.c b/drivers/dma-buf/dma-buf-sysfs-caps.c
> new file mode 100644
> index 000000000000..82b91eb874a9
> --- /dev/null
> +++ b/drivers/dma-buf/dma-buf-sysfs-caps.c
> @@ -0,0 +1,51 @@
> +// SPDX-License-Identifier: GPL-2.0-only
> +/*
> + * DMA-BUF sysfs capabilities.
> + *
> + * Copyright (C) 2022 Simon Ser
> + */
> +
> +#include <linux/kobject.h>
> +#include <linux/sysfs.h>
> +
> +#include "dma-buf-sysfs-caps.h"
> +
> +static ssize_t sync_file_import_export_show(struct kobject *kobj,
> + struct kobj_attribute *attr,
> + char *buf)
> +{
> + return sysfs_emit(buf, "1\n");
> +}
> +
> +static struct kobj_attribute dma_buf_sync_file_import_export_attr =
> + __ATTR_RO(sync_file_import_export);
> +
> +static struct attribute *dma_buf_caps_attrs[] = {
> + &dma_buf_sync_file_import_export_attr.attr,
> + NULL,
> +};
> +
> +static const struct attribute_group dma_buf_caps_attr_group = {
> + .attrs = dma_buf_caps_attrs,
> +};
Didn't we had macros for those? I think I have seen something for that.
Apart from those two random thoughts looks good to me as well.
Regards,
Christian.
> +
> +static struct kobject *dma_buf_caps_kobj;
> +
> +int dma_buf_init_sysfs_capabilities(struct kset *kset)
> +{
> + int ret;
> +
> + dma_buf_caps_kobj = kobject_create_and_add("caps", &kset->kobj);
> + if (!dma_buf_caps_kobj)
> + return -ENOMEM;
> +
> + ret = sysfs_create_group(dma_buf_caps_kobj, &dma_buf_caps_attr_group);
> + if (ret)
> + kobject_put(dma_buf_caps_kobj);
> + return ret;
> +}
> +
> +void dma_buf_uninit_sysfs_capabilities(void)
> +{
> + kobject_put(dma_buf_caps_kobj);
> +}
> diff --git a/drivers/dma-buf/dma-buf-sysfs-caps.h b/drivers/dma-buf/dma-buf-sysfs-caps.h
> new file mode 100644
> index 000000000000..d7bcef490b31
> --- /dev/null
> +++ b/drivers/dma-buf/dma-buf-sysfs-caps.h
> @@ -0,0 +1,16 @@
> +/* SPDX-License-Identifier: GPL-2.0-only */
> +/*
> + * DMA-BUF sysfs capabilities.
> + *
> + * Copyright (C) 2022 Simon Ser
> + */
> +
> +#ifndef _DMA_BUF_SYSFS_CAPS_H
> +#define _DMA_BUF_SYSFS_CAPS_H
> +
> +struct kset;
> +
> +int dma_buf_init_sysfs_capabilities(struct kset *kset);
> +void dma_buf_uninit_sysfs_capabilities(void);
> +
> +#endif // _DMA_BUF_SYSFS_CAPS_H
> diff --git a/drivers/dma-buf/dma-buf-sysfs-stats.c b/drivers/dma-buf/dma-buf-sysfs-stats.c
> index 2bba0babcb62..e2e62f83ce18 100644
> --- a/drivers/dma-buf/dma-buf-sysfs-stats.c
> +++ b/drivers/dma-buf/dma-buf-sysfs-stats.c
> @@ -141,23 +141,14 @@ static const struct kset_uevent_ops dmabuf_sysfs_no_uevent_ops = {
> .filter = dmabuf_sysfs_uevent_filter,
> };
>
> -static struct kset *dma_buf_stats_kset;
> static struct kset *dma_buf_per_buffer_stats_kset;
> -int dma_buf_init_sysfs_statistics(void)
> +int dma_buf_init_sysfs_statistics(struct kset *kset)
> {
> - dma_buf_stats_kset = kset_create_and_add("dmabuf",
> - &dmabuf_sysfs_no_uevent_ops,
> - kernel_kobj);
> - if (!dma_buf_stats_kset)
> - return -ENOMEM;
> -
> dma_buf_per_buffer_stats_kset = kset_create_and_add("buffers",
> &dmabuf_sysfs_no_uevent_ops,
> - &dma_buf_stats_kset->kobj);
> - if (!dma_buf_per_buffer_stats_kset) {
> - kset_unregister(dma_buf_stats_kset);
> + &kset->kobj);
> + if (!dma_buf_per_buffer_stats_kset)
> return -ENOMEM;
> - }
>
> return 0;
> }
> @@ -165,7 +156,6 @@ int dma_buf_init_sysfs_statistics(void)
> void dma_buf_uninit_sysfs_statistics(void)
> {
> kset_unregister(dma_buf_per_buffer_stats_kset);
> - kset_unregister(dma_buf_stats_kset);
> }
>
> int dma_buf_stats_setup(struct dma_buf *dmabuf)
> diff --git a/drivers/dma-buf/dma-buf-sysfs-stats.h b/drivers/dma-buf/dma-buf-sysfs-stats.h
> index a49c6e2650cc..798c54fb8ee3 100644
> --- a/drivers/dma-buf/dma-buf-sysfs-stats.h
> +++ b/drivers/dma-buf/dma-buf-sysfs-stats.h
> @@ -8,9 +8,11 @@
> #ifndef _DMA_BUF_SYSFS_STATS_H
> #define _DMA_BUF_SYSFS_STATS_H
>
> +struct kset;
> +
> #ifdef CONFIG_DMABUF_SYSFS_STATS
>
> -int dma_buf_init_sysfs_statistics(void);
> +int dma_buf_init_sysfs_statistics(struct kset *kset);
> void dma_buf_uninit_sysfs_statistics(void);
>
> int dma_buf_stats_setup(struct dma_buf *dmabuf);
> @@ -18,7 +20,7 @@ int dma_buf_stats_setup(struct dma_buf *dmabuf);
> void dma_buf_stats_teardown(struct dma_buf *dmabuf);
> #else
>
> -static inline int dma_buf_init_sysfs_statistics(void)
> +static inline int dma_buf_init_sysfs_statistics(struct kset *kset)
> {
> return 0;
> }
> diff --git a/drivers/dma-buf/dma-buf.c b/drivers/dma-buf/dma-buf.c
> index 5e1b0534b3ce..b5c5a5050508 100644
> --- a/drivers/dma-buf/dma-buf.c
> +++ b/drivers/dma-buf/dma-buf.c
> @@ -30,6 +30,7 @@
> #include <uapi/linux/dma-buf.h>
> #include <uapi/linux/magic.h>
>
> +#include "dma-buf-sysfs-caps.h"
> #include "dma-buf-sysfs-stats.h"
>
> static inline int is_dma_buf_file(struct file *);
> @@ -1546,22 +1547,54 @@ static inline void dma_buf_uninit_debugfs(void)
> }
> #endif
>
> +/* Capabilities and statistics files do not need to send uevents. */
> +static int dmabuf_sysfs_uevent_filter(struct kobject *kobj)
> +{
> + return 0;
> +}
> +
> +static const struct kset_uevent_ops dmabuf_sysfs_no_uevent_ops = {
> + .filter = dmabuf_sysfs_uevent_filter,
> +};
> +
> +static struct kset *dma_buf_kset;
> +
> static int __init dma_buf_init(void)
> {
> int ret;
>
> - ret = dma_buf_init_sysfs_statistics();
> + dma_buf_kset = kset_create_and_add("dmabuf",
> + &dmabuf_sysfs_no_uevent_ops,
> + kernel_kobj);
> + if (!dma_buf_kset)
> + return -ENOMEM;
> +
> + ret = dma_buf_init_sysfs_capabilities(dma_buf_kset);
> if (ret)
> - return ret;
> + goto err_kset;
> +
> + ret = dma_buf_init_sysfs_statistics(dma_buf_kset);
> + if (ret)
> + goto err_sysfs_caps;
>
> dma_buf_mnt = kern_mount(&dma_buf_fs_type);
> - if (IS_ERR(dma_buf_mnt))
> - return PTR_ERR(dma_buf_mnt);
> + if (IS_ERR(dma_buf_mnt)) {
> + ret = PTR_ERR(dma_buf_mnt);
> + goto err_sysfs_stats;
> + }
>
> mutex_init(&db_list.lock);
> INIT_LIST_HEAD(&db_list.head);
> dma_buf_init_debugfs();
> return 0;
> +
> +err_sysfs_stats:
> + dma_buf_uninit_sysfs_statistics();
> +err_sysfs_caps:
> + dma_buf_uninit_sysfs_capabilities();
> +err_kset:
> + kset_unregister(dma_buf_kset);
> + return ret;
> }
> subsys_initcall(dma_buf_init);
>
> @@ -1570,5 +1603,7 @@ static void __exit dma_buf_deinit(void)
> dma_buf_uninit_debugfs();
> kern_unmount(dma_buf_mnt);
> dma_buf_uninit_sysfs_statistics();
> + dma_buf_uninit_sysfs_capabilities();
> + kset_unregister(dma_buf_kset);
> }
> __exitcall(dma_buf_deinit);
> diff --git a/include/uapi/linux/dma-buf.h b/include/uapi/linux/dma-buf.h
> index 70e213a0d7d9..ab3afd5da75a 100644
> --- a/include/uapi/linux/dma-buf.h
> +++ b/include/uapi/linux/dma-buf.h
> @@ -114,6 +114,9 @@ struct dma_buf_sync {
> * ordering via these fences, it is the respnosibility of userspace to use
> * locks or other mechanisms to ensure that no other context adds fences or
> * submits work between steps 1 and 3 above.
> + *
> + * Userspace can check the availability of this API via
> + * /sys/kernel/dmabuf/caps/sync_file_import_export.
> */
> struct dma_buf_export_sync_file {
> /**
> @@ -146,6 +149,9 @@ struct dma_buf_export_sync_file {
> * synchronized APIs such as Vulkan to inter-op with dma-buf consumers
> * which expect implicit synchronization such as OpenGL or most media
> * drivers/video.
> + *
> + * Userspace can check the availability of this API via
> + * /sys/kernel/dmabuf/caps/sync_file_import_export.
> */
> struct dma_buf_import_sync_file {
> /**
next prev parent reply other threads:[~2022-05-30 7:09 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-05-27 7:34 [PATCH v3] dma-buf: Add a capabilities directory Simon Ser
2022-05-30 7:09 ` Christian König [this message]
2022-05-30 7:20 ` Greg KH
2022-05-30 8:15 ` Simon Ser
2022-05-30 8:26 ` Greg KH
2022-05-31 12:53 ` Jason Ekstrand
2022-05-31 18:37 ` Greg KH
2022-05-30 7:55 ` Simon Ser
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=dbee55fd-37ac-d7cd-dc78-d72776dfdfac@amd.com \
--to=christian.koenig@amd.com \
--cc=contact@emersion.fr \
--cc=daniel.vetter@ffwll.ch \
--cc=dri-devel@lists.freedesktop.org \
--cc=greg@kroah.com \
--cc=jason.ekstrand@collabora.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.