From 653a01e2ee5215ec34709de8699186cee520392f Mon Sep 17 00:00:00 2001 From: Yuanzheng Song Date: Mon, 25 Apr 2022 15:32:58 +0800 Subject: [PATCH] dmabuf: Add the capability to expose DMA-BUF stats in sysfs issue: #I53P7W Signed-off-by: Yuanzheng Song --- linux-5.10/rk3568_patch/kernel.patch | 651 ++------------------------- 1 file changed, 44 insertions(+), 607 deletions(-) diff --git a/linux-5.10/rk3568_patch/kernel.patch b/linux-5.10/rk3568_patch/kernel.patch index 75be2f1..9fdccc0 100755 --- a/linux-5.10/rk3568_patch/kernel.patch +++ b/linux-5.10/rk3568_patch/kernel.patch @@ -128397,435 +128397,19 @@ index 3ca7de37d..dec5d6851 100644 help A sync object driver that uses a 32bit counter to coordinate synchronization. Useful when there is no hardware primitive backing -@@ -65,6 +64,17 @@ menuconfig DMABUF_HEAPS - allows userspace to allocate dma-bufs that can be shared - between drivers. - -+menuconfig DMABUF_SYSFS_STATS -+ bool "DMA-BUF sysfs statistics" -+ select DMA_SHARED_BUFFER -+ help -+ Choose this option to enable DMA-BUF sysfs statistics -+ in location /sys/kernel/dmabuf/buffers. -+ -+ /sys/kernel/dmabuf/buffers/ will contain -+ statistics for the DMA-BUF with the unique inode number -+ . -+ - source "drivers/dma-buf/heaps/Kconfig" - - endmenu -diff --git a/drivers/dma-buf/Makefile b/drivers/dma-buf/Makefile -index 995e05f60..40d81f23c 100644 ---- a/drivers/dma-buf/Makefile -+++ b/drivers/dma-buf/Makefile -@@ -6,6 +6,7 @@ obj-$(CONFIG_DMABUF_HEAPS) += heaps/ - obj-$(CONFIG_SYNC_FILE) += sync_file.o - obj-$(CONFIG_SW_SYNC) += sw_sync.o sync_debug.o - obj-$(CONFIG_UDMABUF) += udmabuf.o -+obj-$(CONFIG_DMABUF_SYSFS_STATS) += dma-buf-sysfs-stats.o - - dmabuf_selftests-y := \ - selftest.o \ -diff --git a/drivers/dma-buf/dma-buf-sysfs-stats.c b/drivers/dma-buf/dma-buf-sysfs-stats.c -new file mode 100755 -index 000000000..943e395d1 ---- /dev/null -+++ b/drivers/dma-buf/dma-buf-sysfs-stats.c -@@ -0,0 +1,311 @@ -+// SPDX-License-Identifier: GPL-2.0-only -+/* -+ * DMA-BUF sysfs statistics. -+ * -+ * Copyright (C) 2021 Google LLC. -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include "dma-buf-sysfs-stats.h" -+ -+#define to_dma_buf_entry_from_kobj(x) container_of(x, struct dma_buf_sysfs_entry, kobj) -+ -+struct dma_buf_stats_attribute { -+ struct attribute attr; -+ ssize_t (*show)(struct dma_buf *dmabuf, -+ struct dma_buf_stats_attribute *attr, char *buf); -+}; -+#define to_dma_buf_stats_attr(x) container_of(x, struct dma_buf_stats_attribute, attr) -+ -+static ssize_t dma_buf_stats_attribute_show(struct kobject *kobj, -+ struct attribute *attr, -+ char *buf) -+{ -+ struct dma_buf_stats_attribute *attribute; -+ struct dma_buf_sysfs_entry *sysfs_entry; -+ struct dma_buf *dmabuf; -+ -+ attribute = to_dma_buf_stats_attr(attr); -+ sysfs_entry = to_dma_buf_entry_from_kobj(kobj); -+ dmabuf = sysfs_entry->dmabuf; -+ -+ if (!dmabuf || !attribute->show) -+ return -EIO; -+ -+ return attribute->show(dmabuf, attribute, buf); -+} -+ -+static const struct sysfs_ops dma_buf_stats_sysfs_ops = { -+ .show = dma_buf_stats_attribute_show, -+}; -+ -+static ssize_t exporter_name_show(struct dma_buf *dmabuf, -+ struct dma_buf_stats_attribute *attr, -+ char *buf) -+{ -+ return sysfs_emit(buf, "%s\n", dmabuf->exp_name); -+} -+ -+static ssize_t mmap_count_show(struct dma_buf *dmabuf, -+ struct dma_buf_stats_attribute *attr, -+ char *buf) -+{ -+ return sysfs_emit(buf, "%d\n", dmabuf->mmap_count); -+} -+ -+static ssize_t size_show(struct dma_buf *dmabuf, -+ struct dma_buf_stats_attribute *attr, -+ char *buf) -+{ -+ return sysfs_emit(buf, "%zu\n", dmabuf->size); -+} -+ -+static struct dma_buf_stats_attribute exporter_name_attribute = -+ __ATTR_RO(exporter_name); -+static struct dma_buf_stats_attribute size_attribute = __ATTR_RO(size); -+static struct dma_buf_stats_attribute mmap_count_attribute = -+ __ATTR_RO(mmap_count); -+ -+static struct attribute *dma_buf_stats_default_attrs[] = { -+ &exporter_name_attribute.attr, -+ &size_attribute.attr, -+ &mmap_count_attribute.attr, -+ NULL, -+}; -+ATTRIBUTE_GROUPS(dma_buf_stats_default); -+ -+static void dma_buf_sysfs_release(struct kobject *kobj) -+{ -+ struct dma_buf_sysfs_entry *sysfs_entry; -+ -+ sysfs_entry = to_dma_buf_entry_from_kobj(kobj); -+ kfree(sysfs_entry); -+} -+ -+static struct kobj_type dma_buf_ktype = { -+ .sysfs_ops = &dma_buf_stats_sysfs_ops, -+ .release = dma_buf_sysfs_release, -+ .default_groups = dma_buf_stats_default_groups, -+}; -+ -+#define to_dma_buf_attach_entry_from_kobj(x) container_of(x, struct dma_buf_attach_sysfs_entry, kobj) -+ -+struct dma_buf_attach_stats_attribute { -+ struct attribute attr; -+ ssize_t (*show)(struct dma_buf_attach_sysfs_entry *sysfs_entry, -+ struct dma_buf_attach_stats_attribute *attr, char *buf); -+}; -+#define to_dma_buf_attach_stats_attr(x) container_of(x, struct dma_buf_attach_stats_attribute, attr) -+ -+static ssize_t dma_buf_attach_stats_attribute_show(struct kobject *kobj, -+ struct attribute *attr, -+ char *buf) -+{ -+ struct dma_buf_attach_stats_attribute *attribute; -+ struct dma_buf_attach_sysfs_entry *sysfs_entry; -+ -+ attribute = to_dma_buf_attach_stats_attr(attr); -+ sysfs_entry = to_dma_buf_attach_entry_from_kobj(kobj); -+ -+ if (!attribute->show) -+ return -EIO; -+ -+ return attribute->show(sysfs_entry, attribute, buf); -+} -+ -+static const struct sysfs_ops dma_buf_attach_stats_sysfs_ops = { -+ .show = dma_buf_attach_stats_attribute_show, -+}; -+ -+static ssize_t map_counter_show(struct dma_buf_attach_sysfs_entry *sysfs_entry, -+ struct dma_buf_attach_stats_attribute *attr, -+ char *buf) -+{ -+ return sysfs_emit(buf, "%u\n", sysfs_entry->map_counter); -+} -+ -+static struct dma_buf_attach_stats_attribute map_counter_attribute = -+ __ATTR_RO(map_counter); -+ -+static struct attribute *dma_buf_attach_stats_default_attrs[] = { -+ &map_counter_attribute.attr, -+ NULL, -+}; -+ATTRIBUTE_GROUPS(dma_buf_attach_stats_default); -+ -+static void dma_buf_attach_sysfs_release(struct kobject *kobj) -+{ -+ struct dma_buf_attach_sysfs_entry *sysfs_entry; -+ -+ sysfs_entry = to_dma_buf_attach_entry_from_kobj(kobj); -+ kfree(sysfs_entry); -+} -+ -+static struct kobj_type dma_buf_attach_ktype = { -+ .sysfs_ops = &dma_buf_attach_stats_sysfs_ops, -+ .release = dma_buf_attach_sysfs_release, -+ .default_groups = dma_buf_attach_stats_default_groups, -+}; -+ -+void dma_buf_attach_stats_teardown(struct dma_buf_attachment *attach) -+{ -+ struct dma_buf_attach_sysfs_entry *sysfs_entry; -+ -+ sysfs_entry = attach->sysfs_entry; -+ if (!sysfs_entry) -+ return; -+ -+ sysfs_delete_link(&sysfs_entry->kobj, &attach->dev->kobj, "device"); -+ -+ kobject_del(&sysfs_entry->kobj); -+ kobject_put(&sysfs_entry->kobj); -+} -+ -+int dma_buf_attach_stats_setup(struct dma_buf_attachment *attach, -+ unsigned int uid) -+{ -+ struct dma_buf_attach_sysfs_entry *sysfs_entry; -+ int ret; -+ struct dma_buf *dmabuf; -+ -+ if (!attach) -+ return -EINVAL; -+ -+ dmabuf = attach->dmabuf; -+ -+ sysfs_entry = kzalloc(sizeof(struct dma_buf_attach_sysfs_entry), -+ GFP_KERNEL); -+ if (!sysfs_entry) -+ return -ENOMEM; -+ -+ sysfs_entry->kobj.kset = dmabuf->sysfs_entry->attach_stats_kset; -+ -+ attach->sysfs_entry = sysfs_entry; -+ -+ ret = kobject_init_and_add(&sysfs_entry->kobj, &dma_buf_attach_ktype, -+ NULL, "%u", uid); -+ if (ret) -+ goto kobj_err; -+ -+ ret = sysfs_create_link(&sysfs_entry->kobj, &attach->dev->kobj, -+ "device"); -+ if (ret) -+ goto link_err; -+ -+ return 0; -+ -+link_err: -+ kobject_del(&sysfs_entry->kobj); -+kobj_err: -+ kobject_put(&sysfs_entry->kobj); -+ attach->sysfs_entry = NULL; -+ -+ return ret; -+} -+void dma_buf_stats_teardown(struct dma_buf *dmabuf) -+{ -+ struct dma_buf_sysfs_entry *sysfs_entry; -+ -+ sysfs_entry = dmabuf->sysfs_entry; -+ if (!sysfs_entry) -+ return; -+ -+ kset_unregister(sysfs_entry->attach_stats_kset); -+ kobject_del(&sysfs_entry->kobj); -+ kobject_put(&sysfs_entry->kobj); -+} -+ -+/* -+ * Statistics files do not need to send uevents. -+ */ -+static int dmabuf_sysfs_uevent_filter(struct kset *kset, 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_stats_kset; -+static struct kset *dma_buf_per_buffer_stats_kset; -+int dma_buf_init_sysfs_statistics(void) -+{ -+ 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); -+ return -ENOMEM; -+ } -+ -+ return 0; -+} -+ -+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) -+{ -+ struct dma_buf_sysfs_entry *sysfs_entry; -+ int ret; -+ struct kset *attach_stats_kset; -+ -+ if (!dmabuf || !dmabuf->file) -+ return -EINVAL; -+ -+ if (!dmabuf->exp_name) { -+ pr_err("exporter name must not be empty if stats needed\n"); -+ return -EINVAL; -+ } -+ -+ sysfs_entry = kzalloc(sizeof(struct dma_buf_sysfs_entry), GFP_KERNEL); -+ if (!sysfs_entry) -+ return -ENOMEM; -+ -+ sysfs_entry->kobj.kset = dma_buf_per_buffer_stats_kset; -+ sysfs_entry->dmabuf = dmabuf; -+ -+ dmabuf->sysfs_entry = sysfs_entry; -+ -+ /* create the directory for buffer stats */ -+ ret = kobject_init_and_add(&sysfs_entry->kobj, &dma_buf_ktype, NULL, -+ "%lu", file_inode(dmabuf->file)->i_ino); -+ if (ret) -+ goto err_sysfs_dmabuf; -+ -+ /* create the directory for attachment stats */ -+ attach_stats_kset = kset_create_and_add("attachments", -+ &dmabuf_sysfs_no_uevent_ops, -+ &sysfs_entry->kobj); -+ if (!attach_stats_kset) { -+ ret = -ENOMEM; -+ goto err_sysfs_attach; -+ } -+ -+ sysfs_entry->attach_stats_kset = attach_stats_kset; -+ -+ return 0; -+ -+err_sysfs_attach: -+ kobject_del(&sysfs_entry->kobj); -+err_sysfs_dmabuf: -+ kobject_put(&sysfs_entry->kobj); -+ dmabuf->sysfs_entry = NULL; -+ return ret; -+} -diff --git a/drivers/dma-buf/dma-buf-sysfs-stats.h b/drivers/dma-buf/dma-buf-sysfs-stats.h -new file mode 100755 -index 000000000..5f4703249 ---- /dev/null -+++ b/drivers/dma-buf/dma-buf-sysfs-stats.h -@@ -0,0 +1,62 @@ -+/* SPDX-License-Identifier: GPL-2.0-only */ -+/* -+ * DMA-BUF sysfs statistics. -+ * -+ * Copyright (C) 2021 Google LLC. -+ */ -+ -+#ifndef _DMA_BUF_SYSFS_STATS_H -+#define _DMA_BUF_SYSFS_STATS_H -+ -+#ifdef CONFIG_DMABUF_SYSFS_STATS -+ -+int dma_buf_init_sysfs_statistics(void); -+void dma_buf_uninit_sysfs_statistics(void); -+ -+int dma_buf_stats_setup(struct dma_buf *dmabuf); -+int dma_buf_attach_stats_setup(struct dma_buf_attachment *attach, -+ unsigned int uid); -+static inline void dma_buf_update_attachment_map_count(struct dma_buf_attachment *attach, -+ int delta) -+{ -+ struct dma_buf_attach_sysfs_entry *entry = attach->sysfs_entry; -+ -+ entry->map_counter += delta; -+} -+void dma_buf_stats_teardown(struct dma_buf *dmabuf); -+void dma_buf_attach_stats_teardown(struct dma_buf_attachment *attach); -+static inline unsigned int dma_buf_update_attach_uid(struct dma_buf *dmabuf) -+{ -+ struct dma_buf_sysfs_entry *entry = dmabuf->sysfs_entry; -+ -+ return entry->attachment_uid++; -+} -+#else -+ -+static inline int dma_buf_init_sysfs_statistics(void) -+{ -+ return 0; -+} -+ -+static inline void dma_buf_uninit_sysfs_statistics(void) {} -+ -+static inline int dma_buf_stats_setup(struct dma_buf *dmabuf) -+{ -+ return 0; -+} -+static inline int dma_buf_attach_stats_setup(struct dma_buf_attachment *attach, -+ unsigned int uid) -+{ -+ return 0; -+} -+ -+static inline void dma_buf_stats_teardown(struct dma_buf *dmabuf) {} -+static inline void dma_buf_attach_stats_teardown(struct dma_buf_attachment *attach) {} -+static inline void dma_buf_update_attachment_map_count(struct dma_buf_attachment *attach, -+ int delta) {} -+static inline unsigned int dma_buf_update_attach_uid(struct dma_buf *dmabuf) -+{ -+ return 0; -+} -+#endif -+#endif // _DMA_BUF_SYSFS_STATS_H diff --git a/drivers/dma-buf/dma-buf.c b/drivers/dma-buf/dma-buf.c -index 922416b3a..0ab865543 100644 --- a/drivers/dma-buf/dma-buf.c +++ b/drivers/dma-buf/dma-buf.c -@@ -29,7 +29,7 @@ - #include - #include +@@ -31,8 +31,6 @@ --static inline int is_dma_buf_file(struct file *); -+#include "dma-buf-sysfs-stats.h" + #include "dma-buf-sysfs-stats.h" +-static inline int is_dma_buf_file(struct file *); +- struct dma_buf_list { struct list_head head; -@@ -38,6 +38,30 @@ struct dma_buf_list { + struct mutex lock; +@@ -40,6 +38,30 @@ struct dma_buf_list { static struct dma_buf_list db_list; @@ -128856,15 +128440,7 @@ index 922416b3a..0ab865543 100644 static char *dmabuffs_dname(struct dentry *dentry, char *buffer, int buflen) { struct dma_buf *dmabuf; -@@ -79,6 +103,7 @@ static void dma_buf_release(struct dentry *dentry) - if (dmabuf->resv == (struct dma_resv *)&dmabuf[1]) - dma_resv_fini(dmabuf->resv); - -+ dma_buf_stats_teardown(dmabuf); - module_put(dmabuf->owner); - kfree(dmabuf->name); - kfree(dmabuf); -@@ -124,6 +149,54 @@ static struct file_system_type dma_buf_fs_type = { +@@ -127,6 +149,54 @@ static struct file_system_type dma_buf_fs_type = { .kill_sb = kill_anon_super, }; @@ -128919,7 +128495,7 @@ index 922416b3a..0ab865543 100644 static int dma_buf_mmap_internal(struct file *file, struct vm_area_struct *vma) { struct dma_buf *dmabuf; -@@ -142,7 +215,7 @@ static int dma_buf_mmap_internal(struct file *file, struct vm_area_struct *vma) +@@ -145,7 +215,7 @@ static int dma_buf_mmap_internal(struct file *file, struct vm_area_struct *vma) dmabuf->size >> PAGE_SHIFT) return -EINVAL; @@ -128928,7 +128504,7 @@ index 922416b3a..0ab865543 100644 } static loff_t dma_buf_llseek(struct file *file, loff_t offset, int whence) -@@ -437,10 +510,11 @@ static const struct file_operations dma_buf_fops = { +@@ -440,10 +510,11 @@ static const struct file_operations dma_buf_fops = { /* * is_dma_buf_file - Check if struct file* is associated with dma_buf */ @@ -128941,106 +128517,7 @@ index 922416b3a..0ab865543 100644 static struct file *dma_buf_getfile(struct dma_buf *dmabuf, int flags) { -@@ -579,6 +653,10 @@ struct dma_buf *dma_buf_export(const struct dma_buf_export_info *exp_info) - file->f_mode |= FMODE_LSEEK; - dmabuf->file = file; - -+ ret = dma_buf_stats_setup(dmabuf); -+ if (ret) -+ goto err_sysfs; -+ - mutex_init(&dmabuf->lock); - INIT_LIST_HEAD(&dmabuf->attachments); - -@@ -588,6 +666,14 @@ struct dma_buf *dma_buf_export(const struct dma_buf_export_info *exp_info) - - return dmabuf; - -+err_sysfs: -+ /* -+ * Set file->f_path.dentry->d_fsdata to NULL so that when -+ * dma_buf_release() gets invoked by dentry_ops, it exits -+ * early before calling the release() dma_buf op. -+ */ -+ file->f_path.dentry->d_fsdata = NULL; -+ fput(file); - err_dmabuf: - kfree(dmabuf); - err_module: -@@ -692,6 +778,7 @@ dma_buf_dynamic_attach(struct dma_buf *dmabuf, struct device *dev, - { - struct dma_buf_attachment *attach; - int ret; -+ unsigned int attach_uid; - - if (WARN_ON(!dmabuf || !dev)) - return ERR_PTR(-EINVAL); -@@ -717,8 +804,13 @@ dma_buf_dynamic_attach(struct dma_buf *dmabuf, struct device *dev, - } - dma_resv_lock(dmabuf->resv, NULL); - list_add(&attach->node, &dmabuf->attachments); -+ attach_uid = dma_buf_update_attach_uid(dmabuf); - dma_resv_unlock(dmabuf->resv); - -+ ret = dma_buf_attach_stats_setup(attach, attach_uid); -+ if (ret) -+ goto err_sysfs; -+ - /* When either the importer or the exporter can't handle dynamic - * mappings we cache the mapping here to avoid issues with the - * reservation object lock. -@@ -745,6 +837,7 @@ dma_buf_dynamic_attach(struct dma_buf *dmabuf, struct device *dev, - dma_resv_unlock(attach->dmabuf->resv); - attach->sgt = sgt; - attach->dir = DMA_BIDIRECTIONAL; -+ dma_buf_update_attachment_map_count(attach, 1 /* delta */); - } - - return attach; -@@ -761,6 +854,7 @@ dma_buf_dynamic_attach(struct dma_buf *dmabuf, struct device *dev, - if (dma_buf_is_dynamic(attach->dmabuf)) - dma_resv_unlock(attach->dmabuf->resv); - -+err_sysfs: - dma_buf_detach(dmabuf, attach); - return ERR_PTR(ret); - } -@@ -799,6 +893,7 @@ void dma_buf_detach(struct dma_buf *dmabuf, struct dma_buf_attachment *attach) - dma_resv_lock(attach->dmabuf->resv, NULL); - - dmabuf->ops->unmap_dma_buf(attach, attach->sgt, attach->dir); -+ dma_buf_update_attachment_map_count(attach, -1 /* delta */); - - if (dma_buf_is_dynamic(attach->dmabuf)) { - dma_buf_unpin(attach); -@@ -812,6 +907,7 @@ void dma_buf_detach(struct dma_buf *dmabuf, struct dma_buf_attachment *attach) - if (dmabuf->ops->detach) - dmabuf->ops->detach(dmabuf, attach); - -+ dma_buf_attach_stats_teardown(attach); - kfree(attach); - } - EXPORT_SYMBOL_GPL(dma_buf_detach); -@@ -917,6 +1013,9 @@ struct sg_table *dma_buf_map_attachment(struct dma_buf_attachment *attach, - attach->dir = direction; - } - -+ if (!IS_ERR(sg_table)) -+ dma_buf_update_attachment_map_count(attach, 1 /* delta */); -+ - return sg_table; - } - EXPORT_SYMBOL_GPL(dma_buf_map_attachment); -@@ -954,6 +1053,8 @@ void dma_buf_unmap_attachment(struct dma_buf_attachment *attach, - if (dma_buf_is_dynamic(attach->dmabuf) && - !IS_ENABLED(CONFIG_DMABUF_MOVE_NOTIFY)) - dma_buf_unpin(attach); -+ -+ dma_buf_update_attachment_map_count(attach, -1 /* delta */); - } - EXPORT_SYMBOL_GPL(dma_buf_unmap_attachment); - -@@ -1114,6 +1215,30 @@ int dma_buf_begin_cpu_access(struct dma_buf *dmabuf, +@@ -1129,6 +1200,30 @@ int dma_buf_begin_cpu_access(struct dma_buf *dmabuf, } EXPORT_SYMBOL_GPL(dma_buf_begin_cpu_access); @@ -129071,7 +128548,7 @@ index 922416b3a..0ab865543 100644 /** * dma_buf_end_cpu_access - Must be called after accessing a dma_buf from the * cpu in the kernel context. Calls end_cpu_access to allow exporter-specific -@@ -1140,6 +1265,21 @@ int dma_buf_end_cpu_access(struct dma_buf *dmabuf, +@@ -1155,6 +1250,21 @@ int dma_buf_end_cpu_access(struct dma_buf *dmabuf, } EXPORT_SYMBOL_GPL(dma_buf_end_cpu_access); @@ -129093,7 +128570,7 @@ index 922416b3a..0ab865543 100644 /** * dma_buf_mmap - Setup up a userspace mmap with the given vma -@@ -1268,6 +1408,32 @@ void dma_buf_vunmap(struct dma_buf *dmabuf, void *vaddr) +@@ -1283,6 +1393,32 @@ void dma_buf_vunmap(struct dma_buf *dmabuf, void *vaddr) } EXPORT_SYMBOL_GPL(dma_buf_vunmap); @@ -129126,26 +128603,6 @@ index 922416b3a..0ab865543 100644 #ifdef CONFIG_DEBUG_FS static int dma_buf_debug_show(struct seq_file *s, void *unused) { -@@ -1402,6 +1568,12 @@ static inline void dma_buf_uninit_debugfs(void) - - static int __init dma_buf_init(void) - { -+ int ret; -+ -+ ret = dma_buf_init_sysfs_statistics(); -+ if (ret) -+ return ret; -+ - dma_buf_mnt = kern_mount(&dma_buf_fs_type); - if (IS_ERR(dma_buf_mnt)) - return PTR_ERR(dma_buf_mnt); -@@ -1417,5 +1589,6 @@ static void __exit dma_buf_deinit(void) - { - dma_buf_uninit_debugfs(); - kern_unmount(dma_buf_mnt); -+ dma_buf_uninit_sysfs_statistics(); - } - __exitcall(dma_buf_deinit); diff --git a/drivers/dma-buf/dma-fence.c b/drivers/dma-buf/dma-fence.c index 7475e09b0..d64fc0392 100644 --- a/drivers/dma-buf/dma-fence.c @@ -129376,7 +128833,7 @@ index afd22c9db..4fb22001b 100644 if (fd < 0) return fd; -@@ -189,11 +238,64 @@ void *dma_heap_get_drvdata(struct dma_heap *heap) +@@ -189,6 +238,47 @@ void *dma_heap_get_drvdata(struct dma_heap *heap) { return heap->priv; } @@ -129421,18 +128878,13 @@ index afd22c9db..4fb22001b 100644 + return heap->heap_dev; +} +EXPORT_SYMBOL_GPL(dma_heap_get_dev); -+ -+/** -+ * dma_heap_get_name() - get heap name -+ * @heap: DMA-Heap to retrieve private data for -+ * -+ * Returns: -+ * The char* for the heap name. -+ */ -+const char *dma_heap_get_name(struct dma_heap *heap) -+{ -+ return heap->name; -+} + + /** + * dma_heap_get_name() - get heap name +@@ -201,11 +291,11 @@ const char *dma_heap_get_name(struct dma_heap *heap) + { + return heap->name; + } +EXPORT_SYMBOL_GPL(dma_heap_get_name); struct dma_heap *dma_heap_add(const struct dma_heap_export_info *exp_info) @@ -129443,7 +128895,7 @@ index afd22c9db..4fb22001b 100644 unsigned int minor; int ret; -@@ -208,21 +310,19 @@ struct dma_heap *dma_heap_add(const struct dma_heap_export_info *exp_info) +@@ -220,21 +310,19 @@ struct dma_heap *dma_heap_add(const struct dma_heap_export_info *exp_info) } /* check the name is unique */ @@ -129472,7 +128924,7 @@ index afd22c9db..4fb22001b 100644 heap->name = exp_info->name; heap->ops = exp_info->ops; heap->priv = exp_info->priv; -@@ -247,16 +347,20 @@ struct dma_heap *dma_heap_add(const struct dma_heap_export_info *exp_info) +@@ -259,16 +347,20 @@ struct dma_heap *dma_heap_add(const struct dma_heap_export_info *exp_info) goto err1; } @@ -129500,7 +128952,7 @@ index afd22c9db..4fb22001b 100644 /* Add heap to the list */ mutex_lock(&heap_list_lock); list_add(&heap->list, &heap_list); -@@ -272,27 +376,88 @@ struct dma_heap *dma_heap_add(const struct dma_heap_export_info *exp_info) +@@ -284,27 +376,88 @@ struct dma_heap *dma_heap_add(const struct dma_heap_export_info *exp_info) kfree(heap); return err_ret; } @@ -130257,7 +129709,9 @@ deleted file mode 100644 index d0696cf93..000000000 --- a/drivers/dma-buf/heaps/heap-helpers.c +++ /dev/null -@@ -1,270 +0,0 @@ +--- a/drivers/dma-buf/heaps/heap-helpers.c ++++ /dev/null +@@ -1,271 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -#include -#include @@ -130290,6 +129744,7 @@ index d0696cf93..000000000 -{ - DEFINE_DMA_BUF_EXPORT_INFO(exp_info); - +- exp_info.exp_name = dma_heap_get_name(buffer->heap); - exp_info.ops = &heap_helper_ops; - exp_info.size = buffer->size; - exp_info.flags = fd_flags; @@ -1650170,39 +1649625,29 @@ index 957b398d3..f1242b50f 100644 }; /** -@@ -292,6 +378,12 @@ struct dma_buf_ops { - * @poll: for userspace poll support +@@ -293,8 +379,9 @@ struct dma_buf_ops { * @cb_excl: for userspace poll support * @cb_shared: for userspace poll support -+ * @sysfs_entry: for exposing information about this buffer in sysfs. -+ * The attachment_uid member of @sysfs_entry is protected by dma_resv lock -+ * and is incremented on each attach. + * @sysfs_entry: for exposing information about this buffer in sysfs. +- * The attachment_uid member of @sysfs_entry is protected by dma_resv lock +- * and is incremented on each attach. + * @mmap_count: number of times buffer has been mmapped. + * @exp_vm_ops: the vm ops provided by the buffer exporter. + * @vm_ops: the overridden vm_ops used to track mmap_count of the buffer. * * This represents a shared buffer, created by calling dma_buf_export(). The * userspace representation is a normal file descriptor, which can be created by -@@ -327,6 +419,18 @@ struct dma_buf { - - __poll_t active; - } cb_excl, cb_shared; -+#ifdef CONFIG_DMABUF_SYSFS_STATS -+ /* for sysfs stats */ -+ struct dma_buf_sysfs_entry { -+ struct kobject kobj; -+ struct dma_buf *dmabuf; -+ unsigned int attachment_uid; -+ struct kset *attach_stats_kset; -+ } *sysfs_entry; +@@ -336,6 +423,9 @@ struct dma_buf { + struct kobject kobj; + struct dma_buf *dmabuf; + } *sysfs_entry; + int mmap_count; + const struct vm_operations_struct *exp_vm_ops; + struct vm_operations_struct vm_ops; -+#endif + #endif }; - /** -@@ -376,6 +480,9 @@ struct dma_buf_attach_ops { +@@ -386,6 +476,9 @@ struct dma_buf_attach_ops { * @importer_ops: importer operations for this attachment, if provided * dma_buf_map/unmap_attachment() must be called with the dma_resv lock held. * @importer_priv: importer specific attachment data. @@ -1650212,7 +1649657,7 @@ index 957b398d3..f1242b50f 100644 * * This structure holds the attachment information between the dma_buf buffer * and its user device(s). The list contains one attachment struct per device -@@ -396,6 +503,14 @@ struct dma_buf_attachment { +@@ -406,6 +499,14 @@ struct dma_buf_attachment { const struct dma_buf_attach_ops *importer_ops; void *importer_priv; void *priv; @@ -1650227,7 +1649672,7 @@ index 957b398d3..f1242b50f 100644 }; /** -@@ -473,6 +588,9 @@ dma_buf_attachment_is_dynamic(struct dma_buf_attachment *attach) +@@ -483,6 +584,9 @@ dma_buf_attachment_is_dynamic(struct dma_buf_attachment *attach) return !!attach->importer_ops; } @@ -1650237,7 +1649682,7 @@ index 957b398d3..f1242b50f 100644 struct dma_buf_attachment *dma_buf_attach(struct dma_buf *dmabuf, struct device *dev); struct dma_buf_attachment * -@@ -497,11 +615,20 @@ void dma_buf_unmap_attachment(struct dma_buf_attachment *, struct sg_table *, +@@ -507,11 +611,20 @@ void dma_buf_unmap_attachment(struct dma_buf_attachment *, struct sg_table *, void dma_buf_move_notify(struct dma_buf *dma_buf); int dma_buf_begin_cpu_access(struct dma_buf *dma_buf, enum dma_data_direction dir); @@ -1650297,7 +1649742,7 @@ index 454e354d1..e8f0e92c2 100644 }; /** -@@ -50,10 +52,73 @@ struct dma_heap_export_info { +@@ -50,6 +52,15 @@ struct dma_heap_export_info { */ void *dma_heap_get_drvdata(struct dma_heap *heap); @@ -1650309,19 +1649754,11 @@ index 454e354d1..e8f0e92c2 100644 + * The device struct for the heap. + */ +struct device *dma_heap_get_dev(struct dma_heap *heap); -+ -+/** -+ * dma_heap_get_name() - get heap name -+ * @heap: DMA-Heap to retrieve private data for -+ * -+ * Returns: -+ * The char* for the heap name. -+ */ -+const char *dma_heap_get_name(struct dma_heap *heap); + /** - * dma_heap_add - adds a heap to dmabuf heaps - * @exp_info: information needed to register this heap + * dma_heap_get_name() - get heap name + * @heap: DMA-Heap to retrieve private data for +@@ -65,4 +76,49 @@ const char *dma_heap_get_name(struct dma_heap *heap); */ struct dma_heap *dma_heap_add(const struct dma_heap_export_info *exp_info); -- Gitee