diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2801-drm-amdkfd-Add-procfs-style-information-for-KFD-proc.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2801-drm-amdkfd-Add-procfs-style-information-for-KFD-proc.patch | 220 |
1 files changed, 220 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2801-drm-amdkfd-Add-procfs-style-information-for-KFD-proc.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2801-drm-amdkfd-Add-procfs-style-information-for-KFD-proc.patch new file mode 100644 index 00000000..328e09b6 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2801-drm-amdkfd-Add-procfs-style-information-for-KFD-proc.patch @@ -0,0 +1,220 @@ +From 5d9cdfc28fe5fc636d1c0d4086ba871d46992d17 Mon Sep 17 00:00:00 2001 +From: Kent Russell <kent.russell@amd.com> +Date: Thu, 13 Jun 2019 09:55:40 -0400 +Subject: [PATCH 2801/2940] drm/amdkfd: Add procfs-style information for KFD + processes +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Add a folder structure to /sys/class/kfd/kfd/ called proc which contains +subfolders, each representing an active KFD process' PID, containing 1 +file: pasid. + +Change-Id: Id3dfab8a6250264434b34ccddbcdb459d1da7478 +Signed-off-by: Kent Russell <kent.russell@amd.com> +Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com> +Acked-by: Christian König <christian.koenig@amd.com> +--- + drivers/gpu/drm/amd/amdkfd/kfd_module.c | 6 ++ + drivers/gpu/drm/amd/amdkfd/kfd_priv.h | 10 +++ + drivers/gpu/drm/amd/amdkfd/kfd_process.c | 100 ++++++++++++++++++++++- + 3 files changed, 114 insertions(+), 2 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_module.c b/drivers/gpu/drm/amd/amdkfd/kfd_module.c +index 81cde3a34c14..e0ce8f31efb8 100644 +--- a/drivers/gpu/drm/amd/amdkfd/kfd_module.c ++++ b/drivers/gpu/drm/amd/amdkfd/kfd_module.c +@@ -105,6 +105,11 @@ static int kfd_init(void) + if (err < 0) + goto err_create_wq; + ++ /* Ignore the return value, so that we can continue ++ * to init the KFD, even if procfs isn't craated ++ */ ++ kfd_procfs_init(); ++ + kfd_init_peer_direct(); + + kfd_debugfs_init(); +@@ -125,6 +130,7 @@ static void kfd_exit(void) + kfd_debugfs_fini(); + kfd_close_peer_direct(); + kfd_process_destroy_wq(); ++ kfd_procfs_shutdown(); + kfd_topology_shutdown(); + kfd_chardev_exit(); + } +diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h +index 964f8c20cea3..2bb74312b15b 100644 +--- a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h ++++ b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h +@@ -35,6 +35,7 @@ + #include <linux/kfifo.h> + #include <linux/seq_file.h> + #include <linux/kref.h> ++#include <linux/sysfs.h> + #include <linux/pid.h> + #include <linux/interval_tree.h> + #include <linux/device_cgroup.h> +@@ -851,6 +852,11 @@ struct kfd_process { + * restored after an eviction + */ + unsigned long last_restore_timestamp; ++ ++ /* Kobj for our procfs */ ++ struct kobject *kobj; ++ struct attribute attr_pasid; ++ + unsigned long last_evict_timestamp; + }; + +@@ -967,6 +973,10 @@ int kfd_gtt_sa_free(struct kfd_dev *kfd, struct kfd_mem_obj *mem_obj); + + extern struct device *kfd_device; + ++/* KFD's procfs */ ++void kfd_procfs_init(void); ++void kfd_procfs_shutdown(void); ++ + /* Topology */ + int kfd_topology_init(void); + void kfd_topology_shutdown(void); +diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process.c b/drivers/gpu/drm/amd/amdkfd/kfd_process.c +index 6da0f3d8f3e9..b391f9406273 100644 +--- a/drivers/gpu/drm/amd/amdkfd/kfd_process.c ++++ b/drivers/gpu/drm/amd/amdkfd/kfd_process.c +@@ -72,6 +72,68 @@ static struct kfd_process *create_process(const struct task_struct *thread, + static void evict_process_worker(struct work_struct *work); + static void restore_process_worker(struct work_struct *work); + ++struct kfd_procfs_tree { ++ struct kobject *kobj; ++}; ++ ++static struct kfd_procfs_tree procfs; ++ ++static ssize_t kfd_procfs_show(struct kobject *kobj, struct attribute *attr, ++ char *buffer) ++{ ++ int val = 0; ++ ++ if (strcmp(attr->name, "pasid") == 0) { ++ struct kfd_process *p = container_of(attr, struct kfd_process, ++ attr_pasid); ++ val = p->pasid; ++ } else { ++ pr_err("Invalid attribute"); ++ return -EINVAL; ++ } ++ ++ return snprintf(buffer, PAGE_SIZE, "%d\n", val); ++} ++ ++static void kfd_procfs_kobj_release(struct kobject *kobj) ++{ ++ kfree(kobj); ++} ++ ++static const struct sysfs_ops kfd_procfs_ops = { ++ .show = kfd_procfs_show, ++}; ++ ++static struct kobj_type procfs_type = { ++ .release = kfd_procfs_kobj_release, ++ .sysfs_ops = &kfd_procfs_ops, ++}; ++ ++void kfd_procfs_init(void) ++{ ++ int ret = 0; ++ ++ procfs.kobj = kfd_alloc_struct(procfs.kobj); ++ if (!procfs.kobj) ++ return; ++ ++ ret = kobject_init_and_add(procfs.kobj, &procfs_type, ++ &kfd_device->kobj, "proc"); ++ if (ret) { ++ pr_warn("Could not create procfs proc folder"); ++ /* If we fail to create the procfs, clean up */ ++ kfd_procfs_shutdown(); ++ } ++} ++ ++void kfd_procfs_shutdown(void) ++{ ++ if (procfs.kobj) { ++ kobject_del(procfs.kobj); ++ kobject_put(procfs.kobj); ++ procfs.kobj = NULL; ++ } ++} + + int kfd_process_create_wq(void) + { +@@ -218,6 +280,7 @@ struct kfd_process *kfd_create_process(struct file *filep) + { + struct kfd_process *process; + struct task_struct *thread = current; ++ int ret; + + if (!thread->mm) + return ERR_PTR(-EINVAL); +@@ -235,11 +298,36 @@ struct kfd_process *kfd_create_process(struct file *filep) + + /* A prior open of /dev/kfd could have already created the process. */ + process = find_process(thread, false); +- if (process) ++ if (process) { + pr_debug("Process already found\n"); +- else ++ } else { + process = create_process(thread, filep); + ++ if (!procfs.kobj) ++ goto out; ++ ++ process->kobj = kfd_alloc_struct(process->kobj); ++ if (!process->kobj) { ++ pr_warn("Creating procfs kobject failed"); ++ goto out; ++ } ++ ret = kobject_init_and_add(process->kobj, &procfs_type, ++ procfs.kobj, "%d", ++ (int)process->lead_thread->pid); ++ if (ret) { ++ pr_warn("Creating procfs pid directory failed"); ++ goto out; ++ } ++ ++ process->attr_pasid.name = "pasid"; ++ process->attr_pasid.mode = KFD_SYSFS_FILE_MODE; ++ sysfs_attr_init(&process->attr_pasid); ++ ret = sysfs_create_file(process->kobj, &process->attr_pasid); ++ if (ret) ++ pr_warn("Creating pasid for pid %d failed", ++ (int)process->lead_thread->pid); ++ } ++out: + mutex_unlock(&kfd_processes_mutex); + + return process; +@@ -394,6 +482,14 @@ static void kfd_process_wq_release(struct work_struct *work) + struct kfd_process *p = container_of(work, struct kfd_process, + release_work); + ++ /* Remove the procfs files */ ++ if (p->kobj) { ++ sysfs_remove_file(p->kobj, &p->attr_pasid); ++ kobject_del(p->kobj); ++ kobject_put(p->kobj); ++ p->kobj = NULL; ++ } ++ + kfd_iommu_unbind_process(p); + + kfd_process_free_outstanding_kfd_bos(p); +-- +2.17.1 + |