dri-devel.lists.freedesktop.org archive mirror
 help / color / mirror / Atom feed
From: Simon Ser <contact@emersion.fr>
To: dri-devel@lists.freedesktop.org
Cc: "Jason Ekstrand" <jason.ekstrand@collabora.com>,
	"Greg KH" <greg@kroah.com>,
	"Christian König" <christian.koenig@amd.com>,
	"Daniel Vetter" <daniel.vetter@ffwll.ch>
Subject: [PATCH v4] dma-buf: Add a capabilities directory
Date: Wed, 01 Jun 2022 16:13:14 +0000	[thread overview]
Message-ID: <20220601161303.64797-1-contact@emersion.fr> (raw)

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.

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

v4: improve sysfs code (Greg)

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          | 31 +++++++++++++
 drivers/dma-buf/dma-buf-sysfs-caps.h          | 15 +++++++
 drivers/dma-buf/dma-buf-sysfs-stats.c         | 16 ++-----
 drivers/dma-buf/dma-buf-sysfs-stats.h         |  6 ++-
 drivers/dma-buf/dma-buf.c                     | 45 +++++++++++++++++--
 include/uapi/linux/dma-buf.h                  |  6 +++
 9 files changed, 115 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..6eb27b81469f
--- /dev/null
+++ b/drivers/dma-buf/dma-buf-sysfs-caps.c
@@ -0,0 +1,31 @@
+// 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,
+};
+
+const struct attribute_group dma_buf_caps_group = {
+	.name = "caps",
+	.attrs = dma_buf_caps_attrs,
+};
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..e40a93513f06
--- /dev/null
+++ b/drivers/dma-buf/dma-buf-sysfs-caps.h
@@ -0,0 +1,15 @@
+/* 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 attribute_group;
+
+extern const struct attribute_group dma_buf_caps_group;
+
+#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..61c5be57558e 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,57 @@ 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 const struct attribute_group *dma_buf_sysfs_groups[] = {
+	&dma_buf_caps_group,
+	NULL,
+};
+
+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 = sysfs_create_groups(&dma_buf_kset->kobj, dma_buf_sysfs_groups);
 	if (ret)
-		return ret;
+		goto err_kset;
+
+	ret = dma_buf_init_sysfs_statistics(dma_buf_kset);
+	if (ret)
+		goto err_kset;
 
 	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_kset:
+	kset_unregister(dma_buf_kset);
+	return ret;
 }
 subsys_initcall(dma_buf_init);
 
@@ -1570,5 +1606,6 @@ static void __exit dma_buf_deinit(void)
 	dma_buf_uninit_debugfs();
 	kern_unmount(dma_buf_mnt);
 	dma_buf_uninit_sysfs_statistics();
+	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 {
 	/**
-- 
2.36.1



             reply	other threads:[~2022-06-01 16:13 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-06-01 16:13 Simon Ser [this message]
2022-06-01 16:51 ` [PATCH v4] dma-buf: Add a capabilities directory Christian König
2022-06-01 18:05 ` Jason Ekstrand
2022-06-02  5:40 ` Greg KH
2022-06-02  6:17   ` Simon Ser
2022-06-02  6:25     ` Greg KH
2022-06-02  6:34       ` Simon Ser
2022-06-02  6:47         ` Daniel Vetter
2022-06-06 15:10           ` Robin Murphy
2022-06-06 15:22             ` Greg KH
2022-06-06 15:44               ` Robin Murphy
2022-06-07 10:36           ` Brian Starkey
2022-06-07 10:55           ` Greg KH
2022-06-07 14:52             ` Jason Ekstrand
2022-06-07 16:01               ` Greg KH
2022-06-08 15:15                 ` Daniel Vetter

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=20220601161303.64797-1-contact@emersion.fr \
    --to=contact@emersion.fr \
    --cc=christian.koenig@amd.com \
    --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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).