On Tue, Nov 28, 2017 at 1:29 AM, Felix Kuehling <Felix.Kuehling at amd.com> wrote: > This commit adds several debugfs entries for kfd: > > kfd/hqds: dumps all HQDs on all GPUs for KFD-controlled compute and > SDMA RLC queues > > kfd/mqds: dumps all MQDs of all KFD processes on all GPUs > > kfd/rls: dumps HWS runlists on all GPUs > > Signed-off-by: Yong Zhao <yong.zhao at amd.com> > Signed-off-by: Felix Kuehling <Felix.Kuehling at amd.com> > --- > drivers/gpu/drm/amd/amdkfd/Makefile | 2 + > drivers/gpu/drm/amd/amdkfd/kfd_debugfs.c | 75 ++++++++++++++++++++++ > .../gpu/drm/amd/amdkfd/kfd_device_queue_manager.c | 71 ++++++++++++++++++++ > drivers/gpu/drm/amd/amdkfd/kfd_module.c | 3 + > drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.h | 4 ++ > drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_cik.c | 27 ++++++++ > drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_vi.c | 25 ++++++++ > drivers/gpu/drm/amd/amdkfd/kfd_packet_manager.c | 24 +++++++ > drivers/gpu/drm/amd/amdkfd/kfd_priv.h | 21 ++++++ > drivers/gpu/drm/amd/amdkfd/kfd_process.c | 29 +++++++++ > .../gpu/drm/amd/amdkfd/kfd_process_queue_manager.c | 63 ++++++++++++++++++ > drivers/gpu/drm/amd/amdkfd/kfd_topology.c | 55 ++++++++++++++++ > 12 files changed, 399 insertions(+) > create mode 100644 drivers/gpu/drm/amd/amdkfd/kfd_debugfs.c > > diff --git a/drivers/gpu/drm/amd/amdkfd/Makefile b/drivers/gpu/drm/amd/amdkfd/Makefile > index b400d56..5263e4d 100644 > --- a/drivers/gpu/drm/amd/amdkfd/Makefile > +++ b/drivers/gpu/drm/amd/amdkfd/Makefile > @@ -16,4 +16,6 @@ amdkfd-y := kfd_module.o kfd_device.o kfd_chardev.o kfd_topology.o \ > kfd_interrupt.o kfd_events.o cik_event_interrupt.o \ > kfd_dbgdev.o kfd_dbgmgr.o > > +amdkfd-$(CONFIG_DEBUG_FS) += kfd_debugfs.o > + > obj-$(CONFIG_HSA_AMD) += amdkfd.o > diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_debugfs.c b/drivers/gpu/drm/amd/amdkfd/kfd_debugfs.c > new file mode 100644 > index 0000000..4bd6ebf > --- /dev/null > +++ b/drivers/gpu/drm/amd/amdkfd/kfd_debugfs.c > @@ -0,0 +1,75 @@ > +/* > + * Copyright 2016-2017 Advanced Micro Devices, Inc. > + * > + * Permission is hereby granted, free of charge, to any person obtaining a > + * copy of this software and associated documentation files (the "Software"), > + * to deal in the Software without restriction, including without limitation > + * the rights to use, copy, modify, merge, publish, distribute, sublicense, > + * and/or sell copies of the Software, and to permit persons to whom the > + * Software is furnished to do so, subject to the following conditions: > + * > + * The above copyright notice and this permission notice shall be included in > + * all copies or substantial portions of the Software. > + * > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR > + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, > + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL > + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR > + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, > + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR > + * OTHER DEALINGS IN THE SOFTWARE. > + */ > + > +#include <linux/debugfs.h> > +#include "kfd_priv.h" > + > +static struct dentry *debugfs_root; > + > +static int kfd_debugfs_open(struct inode *inode, struct file *file) > +{ > + int (*show)(struct seq_file *, void *) = inode->i_private; > + > + return single_open(file, show, NULL); > +} > + > +static const struct file_operations kfd_debugfs_fops = { > + .owner = THIS_MODULE, > + .open = kfd_debugfs_open, > + .read = seq_read, > + .llseek = seq_lseek, > + .release = single_release, > +}; > + > +void kfd_debugfs_init(void) > +{ > + struct dentry *ent; > + > + debugfs_root = debugfs_create_dir("kfd", NULL); > + if (!debugfs_root || debugfs_root == ERR_PTR(-ENODEV)) { > + pr_warn("Failed to create kfd debugfs dir\n"); > + return; > + } > + > + ent = debugfs_create_file("mqds", S_IFREG | 0444, debugfs_root, > + kfd_debugfs_mqds_by_process, > + &kfd_debugfs_fops); > + if (!ent) > + pr_warn("Failed to create mqds in kfd debugfs\n"); > + > + ent = debugfs_create_file("hqds", S_IFREG | 0444, debugfs_root, > + kfd_debugfs_hqds_by_device, > + &kfd_debugfs_fops); > + if (!ent) > + pr_warn("Failed to create hqds in kfd debugfs\n"); > + > + ent = debugfs_create_file("rls", S_IFREG | 0444, debugfs_root, > + kfd_debugfs_rls_by_device, > + &kfd_debugfs_fops); > + if (!ent) > + pr_warn("Failed to create rls in kfd debugfs\n"); > +} > + > +void kfd_debugfs_fini(void) > +{ > + debugfs_remove_recursive(debugfs_root); > +} > diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c > index 8447810..eef8b98 100644 > --- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c > +++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c > @@ -1318,3 +1318,74 @@ void device_queue_manager_uninit(struct device_queue_manager *dqm) > dqm->ops.uninitialize(dqm); > kfree(dqm); > } > + > +#if defined(CONFIG_DEBUG_FS) > + > +static void seq_reg_dump(struct seq_file *m, > + uint32_t (*dump)[2], uint32_t n_regs) > +{ > + uint32_t i, count; > + > + for (i = 0, count = 0; i < n_regs; i++) { > + if (count == 0 || > + dump[i-1][0] + sizeof(uint32_t) != dump[i][0]) { > + seq_printf(m, "%s %08x: %08x", > + i ? "\n" : "", > + dump[i][0], dump[i][1]); > + count = 7; > + } else { > + seq_printf(m, " %08x", dump[i][1]); > + count--; > + } > + } > + > + seq_puts(m, "\n"); > +} > + > +int dqm_debugfs_hqds(struct seq_file *m, void *data) > +{ > + struct device_queue_manager *dqm = data; > + uint32_t (*dump)[2], n_regs; > + int pipe, queue; > + int r = 0; > + > + for (pipe = 0; pipe < get_pipes_per_mec(dqm); pipe++) { > + int pipe_offset = pipe * get_queues_per_pipe(dqm); > + > + for (queue = 0; queue < get_queues_per_pipe(dqm); queue++) { > + if (!test_bit(pipe_offset + queue, > + dqm->dev->shared_resources.queue_bitmap)) > + continue; > + > + r = dqm->dev->kfd2kgd->hqd_dump( > + dqm->dev->kgd, pipe, queue, &dump, &n_regs); > + if (r) > + break; > + > + seq_printf(m, " CP Pipe %d, Queue %d\n", > + pipe, queue); > + seq_reg_dump(m, dump, n_regs); > + > + kfree(dump); > + } > + } > + > + for (pipe = 0; pipe < CIK_SDMA_ENGINE_NUM; pipe++) { > + for (queue = 0; queue < CIK_SDMA_QUEUES_PER_ENGINE; queue++) { > + r = dqm->dev->kfd2kgd->hqd_sdma_dump( > + dqm->dev->kgd, pipe, queue, &dump, &n_regs); > + if (r) > + break; > + > + seq_printf(m, " SDMA Engine %d, RLC %d\n", > + pipe, queue); > + seq_reg_dump(m, dump, n_regs); > + > + kfree(dump); > + } > + } > + > + return r; > +} > + > +#endif > diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_module.c b/drivers/gpu/drm/amd/amdkfd/kfd_module.c > index 4e060c8..f50e494 100644 > --- a/drivers/gpu/drm/amd/amdkfd/kfd_module.c > +++ b/drivers/gpu/drm/amd/amdkfd/kfd_module.c > @@ -123,6 +123,8 @@ static int __init kfd_module_init(void) > > kfd_process_create_wq(); > > + kfd_debugfs_init(); > + > amdkfd_init_completed = 1; > > dev_info(kfd_device, "Initialized module\n"); > @@ -139,6 +141,7 @@ static void __exit kfd_module_exit(void) > { > amdkfd_init_completed = 0; > > + kfd_debugfs_fini(); > kfd_process_destroy_wq(); > kfd_topology_shutdown(); > kfd_chardev_exit(); > diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.h b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.h > index 1f3a6ba..8972bcf 100644 > --- a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.h > +++ b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.h > @@ -85,6 +85,10 @@ struct mqd_manager { > uint64_t queue_address, uint32_t pipe_id, > uint32_t queue_id); > > +#if defined(CONFIG_DEBUG_FS) > + int (*debugfs_show_mqd)(struct seq_file *m, void *data); > +#endif > + > struct mutex mqd_mutex; > struct kfd_dev *dev; > }; > diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_cik.c b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_cik.c > index 7aa57ab..f8ef4a0 100644 > --- a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_cik.c > +++ b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_cik.c > @@ -365,6 +365,24 @@ static int update_mqd_hiq(struct mqd_manager *mm, void *mqd, > return 0; > } > > +#if defined(CONFIG_DEBUG_FS) > + > +static int debugfs_show_mqd(struct seq_file *m, void *data) > +{ > + seq_hex_dump(m, " ", DUMP_PREFIX_OFFSET, 32, 4, > + data, sizeof(struct cik_mqd), false); > + return 0; > +} > + > +static int debugfs_show_mqd_sdma(struct seq_file *m, void *data) > +{ > + seq_hex_dump(m, " ", DUMP_PREFIX_OFFSET, 32, 4, > + data, sizeof(struct cik_sdma_rlc_registers), false); > + return 0; > +} > + > +#endif > + > > struct mqd_manager *mqd_manager_init_cik(enum KFD_MQD_TYPE type, > struct kfd_dev *dev) > @@ -389,6 +407,9 @@ struct mqd_manager *mqd_manager_init_cik(enum KFD_MQD_TYPE type, > mqd->update_mqd = update_mqd; > mqd->destroy_mqd = destroy_mqd; > mqd->is_occupied = is_occupied; > +#if defined(CONFIG_DEBUG_FS) > + mqd->debugfs_show_mqd = debugfs_show_mqd; > +#endif > break; > case KFD_MQD_TYPE_HIQ: > mqd->init_mqd = init_mqd_hiq; > @@ -397,6 +418,9 @@ struct mqd_manager *mqd_manager_init_cik(enum KFD_MQD_TYPE type, > mqd->update_mqd = update_mqd_hiq; > mqd->destroy_mqd = destroy_mqd; > mqd->is_occupied = is_occupied; > +#if defined(CONFIG_DEBUG_FS) > + mqd->debugfs_show_mqd = debugfs_show_mqd; > +#endif > break; > case KFD_MQD_TYPE_SDMA: > mqd->init_mqd = init_mqd_sdma; > @@ -405,6 +429,9 @@ struct mqd_manager *mqd_manager_init_cik(enum KFD_MQD_TYPE type, > mqd->update_mqd = update_mqd_sdma; > mqd->destroy_mqd = destroy_mqd_sdma; > mqd->is_occupied = is_occupied_sdma; > +#if defined(CONFIG_DEBUG_FS) > + mqd->debugfs_show_mqd = debugfs_show_mqd_sdma; > +#endif > break; > default: > kfree(mqd); > diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_vi.c b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_vi.c > index 00e1f1a..971aec0 100644 > --- a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_vi.c > +++ b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_vi.c > @@ -358,7 +358,23 @@ static bool is_occupied_sdma(struct mqd_manager *mm, void *mqd, > return mm->dev->kfd2kgd->hqd_sdma_is_occupied(mm->dev->kgd, mqd); > } > > +#if defined(CONFIG_DEBUG_FS) > > +static int debugfs_show_mqd(struct seq_file *m, void *data) > +{ > + seq_hex_dump(m, " ", DUMP_PREFIX_OFFSET, 32, 4, > + data, sizeof(struct vi_mqd), false); > + return 0; > +} > + > +static int debugfs_show_mqd_sdma(struct seq_file *m, void *data) > +{ > + seq_hex_dump(m, " ", DUMP_PREFIX_OFFSET, 32, 4, > + data, sizeof(struct vi_sdma_mqd), false); > + return 0; > +} > + > +#endif > > struct mqd_manager *mqd_manager_init_vi(enum KFD_MQD_TYPE type, > struct kfd_dev *dev) > @@ -383,6 +399,9 @@ struct mqd_manager *mqd_manager_init_vi(enum KFD_MQD_TYPE type, > mqd->update_mqd = update_mqd; > mqd->destroy_mqd = destroy_mqd; > mqd->is_occupied = is_occupied; > +#if defined(CONFIG_DEBUG_FS) > + mqd->debugfs_show_mqd = debugfs_show_mqd; > +#endif > break; > case KFD_MQD_TYPE_HIQ: > mqd->init_mqd = init_mqd_hiq; > @@ -391,6 +410,9 @@ struct mqd_manager *mqd_manager_init_vi(enum KFD_MQD_TYPE type, > mqd->update_mqd = update_mqd_hiq; > mqd->destroy_mqd = destroy_mqd; > mqd->is_occupied = is_occupied; > +#if defined(CONFIG_DEBUG_FS) > + mqd->debugfs_show_mqd = debugfs_show_mqd; > +#endif > break; > case KFD_MQD_TYPE_SDMA: > mqd->init_mqd = init_mqd_sdma; > @@ -399,6 +421,9 @@ struct mqd_manager *mqd_manager_init_vi(enum KFD_MQD_TYPE type, > mqd->update_mqd = update_mqd_sdma; > mqd->destroy_mqd = destroy_mqd_sdma; > mqd->is_occupied = is_occupied_sdma; > +#if defined(CONFIG_DEBUG_FS) > + mqd->debugfs_show_mqd = debugfs_show_mqd_sdma; > +#endif > break; > default: > kfree(mqd); > diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_packet_manager.c b/drivers/gpu/drm/amd/amdkfd/kfd_packet_manager.c > index c3230b9..0ecbd1f 100644 > --- a/drivers/gpu/drm/amd/amdkfd/kfd_packet_manager.c > +++ b/drivers/gpu/drm/amd/amdkfd/kfd_packet_manager.c > @@ -278,6 +278,7 @@ static int pm_create_runlist_ib(struct packet_manager *pm, > return retval; > > *rl_size_bytes = alloc_size_bytes; > + pm->ib_size_bytes = alloc_size_bytes; > > pr_debug("Building runlist ib process count: %d queues count %d\n", > pm->dqm->processes_count, pm->dqm->queue_count); > @@ -591,3 +592,26 @@ void pm_release_ib(struct packet_manager *pm) > } > mutex_unlock(&pm->lock); > } > + > +#if defined(CONFIG_DEBUG_FS) > + > +int pm_debugfs_runlist(struct seq_file *m, void *data) > +{ > + struct packet_manager *pm = data; > + > + mutex_lock(&pm->lock); > + > + if (!pm->allocated) { > + seq_puts(m, " No active runlist\n"); > + goto out; > + } > + > + seq_hex_dump(m, " ", DUMP_PREFIX_OFFSET, 32, 4, > + pm->ib_buffer_obj->cpu_ptr, pm->ib_size_bytes, false); > + > +out: > + mutex_unlock(&pm->lock); > + return 0; > +} > + > +#endif > diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h > index 1edab21..dca493b 100644 > --- a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h > +++ b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h > @@ -33,6 +33,7 @@ > #include <linux/kfd_ioctl.h> > #include <linux/idr.h> > #include <linux/kfifo.h> > +#include <linux/seq_file.h> > #include <kgd_kfd_interface.h> > > #include "amd_shared.h" > @@ -735,6 +736,7 @@ struct packet_manager { > struct mutex lock; > bool allocated; > struct kfd_mem_obj *ib_buffer_obj; > + unsigned int ib_size_bytes; > }; > > int pm_init(struct packet_manager *pm, struct device_queue_manager *dqm); > @@ -781,4 +783,23 @@ int kfd_event_destroy(struct kfd_process *p, uint32_t event_id); > > int dbgdev_wave_reset_wavefronts(struct kfd_dev *dev, struct kfd_process *p); > > +/* Debugfs */ > +#if defined(CONFIG_DEBUG_FS) > + > +void kfd_debugfs_init(void); > +void kfd_debugfs_fini(void); > +int kfd_debugfs_mqds_by_process(struct seq_file *m, void *data); > +int pqm_debugfs_mqds(struct seq_file *m, void *data); > +int kfd_debugfs_hqds_by_device(struct seq_file *m, void *data); > +int dqm_debugfs_hqds(struct seq_file *m, void *data); > +int kfd_debugfs_rls_by_device(struct seq_file *m, void *data); > +int pm_debugfs_runlist(struct seq_file *m, void *data); > + > +#else > + > +static inline void kfd_debugfs_init(void) {} > +static inline void kfd_debugfs_fini(void) {} > + > +#endif > + > #endif > diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process.c b/drivers/gpu/drm/amd/amdkfd/kfd_process.c > index 39f4c19..99c18ee 100644 > --- a/drivers/gpu/drm/amd/amdkfd/kfd_process.c > +++ b/drivers/gpu/drm/amd/amdkfd/kfd_process.c > @@ -620,3 +620,32 @@ int kfd_reserved_mem_mmap(struct kfd_process *process, > PFN_DOWN(__pa(qpd->cwsr_kaddr)), > KFD_CWSR_TBA_TMA_SIZE, vma->vm_page_prot); > } > + > +#if defined(CONFIG_DEBUG_FS) > + > +int kfd_debugfs_mqds_by_process(struct seq_file *m, void *data) > +{ > + struct kfd_process *p; > + unsigned int temp; > + int r = 0; > + > + int idx = srcu_read_lock(&kfd_processes_srcu); > + > + hash_for_each_rcu(kfd_processes_table, temp, p, kfd_processes) { > + seq_printf(m, "Process %d PASID %d:\n", > + p->lead_thread->tgid, p->pasid); > + > + mutex_lock(&p->mutex); > + r = pqm_debugfs_mqds(m, &p->pqm); > + mutex_unlock(&p->mutex); > + > + if (r) > + break; > + } > + > + srcu_read_unlock(&kfd_processes_srcu, idx); > + > + return r; > +} > + > +#endif > diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c b/drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c > index 2c98858..2573455 100644 > --- a/drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c > +++ b/drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c > @@ -370,4 +370,67 @@ struct kernel_queue *pqm_get_kernel_queue( > return NULL; > } > > +#if defined(CONFIG_DEBUG_FS) > > +int pqm_debugfs_mqds(struct seq_file *m, void *data) > +{ > + struct process_queue_manager *pqm = data; > + struct process_queue_node *pqn; > + struct queue *q; > + enum KFD_MQD_TYPE mqd_type; > + struct mqd_manager *mqd_manager; > + int r = 0; > + > + list_for_each_entry(pqn, &pqm->queues, process_queue_list) { > + if (pqn->q) { > + q = pqn->q; > + switch (q->properties.type) { > + case KFD_QUEUE_TYPE_SDMA: > + seq_printf(m, " SDMA queue on device %x\n", > + q->device->id); > + mqd_type = KFD_MQD_TYPE_SDMA; > + break; > + case KFD_QUEUE_TYPE_COMPUTE: > + seq_printf(m, " Compute queue on device %x\n", > + q->device->id); > + mqd_type = KFD_MQD_TYPE_CP; > + break; > + default: > + seq_printf(m, > + " Bad user queue type %d on device %x\n", > + q->properties.type, q->device->id); > + continue; > + } > + mqd_manager = q->device->dqm->ops.get_mqd_manager( > + q->device->dqm, mqd_type); > + } else if (pqn->kq) { > + q = pqn->kq->queue; > + mqd_manager = pqn->kq->mqd; > + switch (q->properties.type) { > + case KFD_QUEUE_TYPE_DIQ: > + seq_printf(m, " DIQ on device %x\n", > + pqn->kq->dev->id); > + mqd_type = KFD_MQD_TYPE_HIQ; > + break; > + default: > + seq_printf(m, > + " Bad kernel queue type %d on device %x\n", > + q->properties.type, > + pqn->kq->dev->id); > + continue; > + } > + } else { > + seq_printf(m, > + " Weird: Queue node with neither kernel nor user queue\n"); > + continue; > + } > + > + r = mqd_manager->debugfs_show_mqd(m, q->mqd); > + if (r != 0) > + break; > + } > + > + return r; > +} > + > +#endif > diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_topology.c b/drivers/gpu/drm/amd/amdkfd/kfd_topology.c > index 19ce590..9d03a56 100644 > --- a/drivers/gpu/drm/amd/amdkfd/kfd_topology.c > +++ b/drivers/gpu/drm/amd/amdkfd/kfd_topology.c > @@ -32,6 +32,7 @@ > #include "kfd_priv.h" > #include "kfd_crat.h" > #include "kfd_topology.h" > +#include "kfd_device_queue_manager.h" > > static struct list_head topology_device_list; > static int topology_crat_parsed; > @@ -1233,3 +1234,57 @@ struct kfd_dev *kfd_topology_enum_kfd_devices(uint8_t idx) > return device; > > } > + > +#if defined(CONFIG_DEBUG_FS) > + > +int kfd_debugfs_hqds_by_device(struct seq_file *m, void *data) > +{ > + struct kfd_topology_device *dev; > + unsigned int i = 0; > + int r = 0; > + > + down_read(&topology_lock); > + > + list_for_each_entry(dev, &topology_device_list, list) { > + if (!dev->gpu) { > + i++; > + continue; > + } > + > + seq_printf(m, "Node %u, gpu_id %x:\n", i++, dev->gpu->id); > + r = dqm_debugfs_hqds(m, dev->gpu->dqm); > + if (r) > + break; > + } > + > + up_read(&topology_lock); > + > + return r; > +} > + > +int kfd_debugfs_rls_by_device(struct seq_file *m, void *data) > +{ > + struct kfd_topology_device *dev; > + unsigned int i = 0; > + int r = 0; > + > + down_read(&topology_lock); > + > + list_for_each_entry(dev, &topology_device_list, list) { > + if (!dev->gpu) { > + i++; > + continue; > + } > + > + seq_printf(m, "Node %u, gpu_id %x:\n", i++, dev->gpu->id); > + r = pm_debugfs_runlist(m, &dev->gpu->dqm->packets); > + if (r) > + break; > + } > + > + up_read(&topology_lock); > + > + return r; > +} > + > +#endif > -- > 2.7.4 > This patch is: Reviewed-by: Oded Gabbay <oded.gabbay at gmail.com>