Message ID | 20240916133223.1023773-3-pierre-eric.pelloux-prayer@amd.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v2,1/3] drm: add DRM_SET_NAME ioctl | expand |
Am 16.09.24 um 15:32 schrieb Pierre-Eric Pelloux-Prayer: > In debugfs gem_info/vm_info files, timeout handler and page fault reports. > > This information is useful with the virtio/native-context driver: this > allows the guest applications identifier to visible in amdgpu's output. > > The output in amdgpu_vm_info/amdgpu_gem_info looks like this: > pid:12255 Process:glxgears/test-set-fd-name ---------- > > Signed-off-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com> > --- > .../gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 2 +- > drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 2 +- > drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c | 16 +++++++++--- > drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 25 +++++++++++++++++-- > drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h | 4 +-- > 5 files changed, 40 insertions(+), 9 deletions(-) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c > index 6d5fd371d5ce..1712feb2c238 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c > @@ -1577,7 +1577,7 @@ int amdgpu_amdkfd_gpuvm_acquire_process_vm(struct amdgpu_device *adev, > if (ret) > return ret; > > - amdgpu_vm_set_task_info(avm); > + amdgpu_vm_set_task_info(avm, NULL); > > return 0; > } > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c > index 1e475eb01417..d32dc547cc80 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c > @@ -310,7 +310,7 @@ static int amdgpu_cs_pass1(struct amdgpu_cs_parser *p, > kvfree(chunk_array); > > /* Use this opportunity to fill in task info for the vm */ > - amdgpu_vm_set_task_info(vm); > + amdgpu_vm_set_task_info(vm, p->filp); > > return 0; > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c > index 0e617dff8765..0c52168edbaf 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c > @@ -997,6 +997,10 @@ static int amdgpu_debugfs_gem_info_show(struct seq_file *m, void *unused) > if (r) > return r; > > + r = mutex_lock_interruptible(&file->name_lock); > + if (r) > + goto out; > + > list_for_each_entry(file, &dev->filelist, lhead) { > struct task_struct *task; > struct drm_gem_object *gobj; > @@ -1012,8 +1016,13 @@ static int amdgpu_debugfs_gem_info_show(struct seq_file *m, void *unused) > rcu_read_lock(); > pid = rcu_dereference(file->pid); > task = pid_task(pid, PIDTYPE_TGID); > - seq_printf(m, "pid %8d command %s:\n", pid_nr(pid), > - task ? task->comm : "<unknown>"); > + seq_printf(m, "pid %8d command %s", pid_nr(pid), > + task ? task->comm : "<unknown>"); > + if (file->name) { > + seq_putc(m, '/'); > + seq_puts(m, file->name); > + } > + seq_puts(m, ":\n"); > rcu_read_unlock(); > > spin_lock(&file->table_lock); > @@ -1024,7 +1033,8 @@ static int amdgpu_debugfs_gem_info_show(struct seq_file *m, void *unused) > } > spin_unlock(&file->table_lock); > } > - > + mutex_unlock(&file->name_lock); > +out: > mutex_unlock(&dev->filelist_mutex); > return 0; > } > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c > index e20d19ae01b2..5701d74159d4 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c > @@ -2370,7 +2370,7 @@ static int amdgpu_vm_create_task_info(struct amdgpu_vm *vm) > * > * @vm: vm for which to set the info > */ > -void amdgpu_vm_set_task_info(struct amdgpu_vm *vm) > +void amdgpu_vm_set_task_info(struct amdgpu_vm *vm, struct drm_file *file) > { > if (!vm->task_info) > return; > @@ -2385,7 +2385,28 @@ void amdgpu_vm_set_task_info(struct amdgpu_vm *vm) > return; > > vm->task_info->tgid = current->group_leader->pid; > - get_task_comm(vm->task_info->process_name, current->group_leader); > + __get_task_comm(vm->task_info->process_name, TASK_COMM_LEN, > + current->group_leader); > + /* Append drm_client_name if set. */ > + if (file && file->name) { > + mutex_lock(&file->name_lock); > + > + /* Assert that process_name is big enough to store process_name, > + * so: (TASK_COMM_LEN - 1) + '/' + '\0'. > + * This way we can concat file->name without worrying about space. > + */ > + static_assert(sizeof(vm->task_info->process_name) >= TASK_COMM_LEN + 1); That won't work correctly. > + if (file->name) { > + int n; > + > + n = strlen(vm->task_info->process_name); > + vm->task_info->process_name[n] = '/'; > + strscpy_pad(&vm->task_info->process_name[n + 1], > + file->name, > + sizeof(vm->task_info->process_name) - (n + 1)); > + } > + mutex_unlock(&file->name_lock); > + } > } > > /** > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h > index d12d66dca8e9..cabec384b4d4 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h > @@ -232,7 +232,7 @@ struct amdgpu_vm_pte_funcs { > }; > > struct amdgpu_task_info { > - char process_name[TASK_COMM_LEN]; > + char process_name[NAME_MAX]; You would need here TASK_COMM_LEN + NAME_MAX + 1. But I'm really wondering if we shouldn't rework amdgpu_task_info to not be based on fixed strings, but rather use a single dynamically allocated string. Potentially even at the end of the structure after pid, tgid etc... Regards, Christian. > char task_name[TASK_COMM_LEN]; > pid_t pid; > pid_t tgid; > @@ -561,7 +561,7 @@ bool amdgpu_vm_handle_fault(struct amdgpu_device *adev, u32 pasid, > u32 vmid, u32 node_id, uint64_t addr, uint64_t ts, > bool write_fault); > > -void amdgpu_vm_set_task_info(struct amdgpu_vm *vm); > +void amdgpu_vm_set_task_info(struct amdgpu_vm *vm, struct drm_file *file); > > void amdgpu_vm_move_to_lru_tail(struct amdgpu_device *adev, > struct amdgpu_vm *vm);
On 16/09/2024 14:32, Pierre-Eric Pelloux-Prayer wrote: > In debugfs gem_info/vm_info files, timeout handler and page fault reports. > > This information is useful with the virtio/native-context driver: this > allows the guest applications identifier to visible in amdgpu's output. > > The output in amdgpu_vm_info/amdgpu_gem_info looks like this: > pid:12255 Process:glxgears/test-set-fd-name ---------- > > Signed-off-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com> > --- > .../gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 2 +- > drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 2 +- > drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c | 16 +++++++++--- > drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 25 +++++++++++++++++-- > drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h | 4 +-- > 5 files changed, 40 insertions(+), 9 deletions(-) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c > index 6d5fd371d5ce..1712feb2c238 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c > @@ -1577,7 +1577,7 @@ int amdgpu_amdkfd_gpuvm_acquire_process_vm(struct amdgpu_device *adev, > if (ret) > return ret; > > - amdgpu_vm_set_task_info(avm); > + amdgpu_vm_set_task_info(avm, NULL); > > return 0; > } > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c > index 1e475eb01417..d32dc547cc80 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c > @@ -310,7 +310,7 @@ static int amdgpu_cs_pass1(struct amdgpu_cs_parser *p, > kvfree(chunk_array); > > /* Use this opportunity to fill in task info for the vm */ > - amdgpu_vm_set_task_info(vm); > + amdgpu_vm_set_task_info(vm, p->filp); > > return 0; > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c > index 0e617dff8765..0c52168edbaf 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c > @@ -997,6 +997,10 @@ static int amdgpu_debugfs_gem_info_show(struct seq_file *m, void *unused) > if (r) > return r; > > + r = mutex_lock_interruptible(&file->name_lock); > + if (r) > + goto out; Shouldn't this be in the below loop? > + > list_for_each_entry(file, &dev->filelist, lhead) { > struct task_struct *task; > struct drm_gem_object *gobj; > @@ -1012,8 +1016,13 @@ static int amdgpu_debugfs_gem_info_show(struct seq_file *m, void *unused) > rcu_read_lock(); > pid = rcu_dereference(file->pid); > task = pid_task(pid, PIDTYPE_TGID); > - seq_printf(m, "pid %8d command %s:\n", pid_nr(pid), > - task ? task->comm : "<unknown>"); > + seq_printf(m, "pid %8d command %s", pid_nr(pid), > + task ? task->comm : "<unknown>"); > + if (file->name) { > + seq_putc(m, '/'); > + seq_puts(m, file->name); > + } > + seq_puts(m, ":\n"); > rcu_read_unlock(); > > spin_lock(&file->table_lock); > @@ -1024,7 +1033,8 @@ static int amdgpu_debugfs_gem_info_show(struct seq_file *m, void *unused) > } > spin_unlock(&file->table_lock); > } > - > + mutex_unlock(&file->name_lock); > +out: > mutex_unlock(&dev->filelist_mutex); > return 0; > } > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c > index e20d19ae01b2..5701d74159d4 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c > @@ -2370,7 +2370,7 @@ static int amdgpu_vm_create_task_info(struct amdgpu_vm *vm) > * > * @vm: vm for which to set the info > */ > -void amdgpu_vm_set_task_info(struct amdgpu_vm *vm) > +void amdgpu_vm_set_task_info(struct amdgpu_vm *vm, struct drm_file *file) > { > if (!vm->task_info) > return; > @@ -2385,7 +2385,28 @@ void amdgpu_vm_set_task_info(struct amdgpu_vm *vm) > return; > > vm->task_info->tgid = current->group_leader->pid; > - get_task_comm(vm->task_info->process_name, current->group_leader); > + __get_task_comm(vm->task_info->process_name, TASK_COMM_LEN, > + current->group_leader); > + /* Append drm_client_name if set. */ > + if (file && file->name) { > + mutex_lock(&file->name_lock); > + > + /* Assert that process_name is big enough to store process_name, > + * so: (TASK_COMM_LEN - 1) + '/' + '\0'. > + * This way we can concat file->name without worrying about space. > + */ > + static_assert(sizeof(vm->task_info->process_name) >= TASK_COMM_LEN + 1); > + if (file->name) { > + int n; > + > + n = strlen(vm->task_info->process_name); > + vm->task_info->process_name[n] = '/'; I think runtime asserts are unavoidable here. To make sure no OOB write if someone gets creative and decreases the storage for task_info->process_name. > + strscpy_pad(&vm->task_info->process_name[n + 1], > + file->name, > + sizeof(vm->task_info->process_name) - (n + 1)); > + } > + mutex_unlock(&file->name_lock); > + } > } > > /** > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h > index d12d66dca8e9..cabec384b4d4 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h > @@ -232,7 +232,7 @@ struct amdgpu_vm_pte_funcs { > }; > > struct amdgpu_task_info { > - char process_name[TASK_COMM_LEN]; > + char process_name[NAME_MAX]; Like this we already know the whole string will not fit if both sides use their max allowed size. So why not size this pessimistically to include both components, slash and null termination? Regards, Tvrtko > char task_name[TASK_COMM_LEN]; > pid_t pid; > pid_t tgid; > @@ -561,7 +561,7 @@ bool amdgpu_vm_handle_fault(struct amdgpu_device *adev, u32 pasid, > u32 vmid, u32 node_id, uint64_t addr, uint64_t ts, > bool write_fault); > > -void amdgpu_vm_set_task_info(struct amdgpu_vm *vm); > +void amdgpu_vm_set_task_info(struct amdgpu_vm *vm, struct drm_file *file); > > void amdgpu_vm_move_to_lru_tail(struct amdgpu_device *adev, > struct amdgpu_vm *vm);
Hi Pierre-Eric, kernel test robot noticed the following build warnings: [auto build test WARNING on drm-exynos/exynos-drm-next] [also build test WARNING on drm-intel/for-linux-next drm-intel/for-linux-next-fixes drm-misc/drm-misc-next drm-tip/drm-tip linus/master v6.11 next-20240919] [cannot apply to drm/drm-next] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Pierre-Eric-Pelloux-Prayer/drm-use-drm_file-name-in-fdinfo/20240916-213521 base: https://git.kernel.org/pub/scm/linux/kernel/git/daeinki/drm-exynos.git exynos-drm-next patch link: https://lore.kernel.org/r/20240916133223.1023773-3-pierre-eric.pelloux-prayer%40amd.com patch subject: [PATCH v2 3/3] drm/amdgpu: use drm_file name config: x86_64-allyesconfig (https://download.01.org/0day-ci/archive/20240920/202409200113.0AEe5YG9-lkp@intel.com/config) compiler: clang version 18.1.8 (https://github.com/llvm/llvm-project 3b5b5c1ec4a3095ab096dd780e84d7ab81f3d7ff) reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240920/202409200113.0AEe5YG9-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202409200113.0AEe5YG9-lkp@intel.com/ All warnings (new ones prefixed by >>): >> drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c:997:32: warning: variable 'file' is uninitialized when used here [-Wuninitialized] 997 | r = mutex_lock_interruptible(&file->name_lock); | ^~~~ include/linux/mutex.h:162:72: note: expanded from macro 'mutex_lock_interruptible' 162 | #define mutex_lock_interruptible(lock) mutex_lock_interruptible_nested(lock, 0) | ^~~~ drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c:990:23: note: initialize the variable 'file' to silence this warning 990 | struct drm_file *file; | ^ | = NULL 1 warning generated. vim +/file +997 drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c 984 985 #if defined(CONFIG_DEBUG_FS) 986 static int amdgpu_debugfs_gem_info_show(struct seq_file *m, void *unused) 987 { 988 struct amdgpu_device *adev = m->private; 989 struct drm_device *dev = adev_to_drm(adev); 990 struct drm_file *file; 991 int r; 992 993 r = mutex_lock_interruptible(&dev->filelist_mutex); 994 if (r) 995 return r; 996 > 997 r = mutex_lock_interruptible(&file->name_lock); 998 if (r) 999 goto out; 1000 1001 list_for_each_entry(file, &dev->filelist, lhead) { 1002 struct task_struct *task; 1003 struct drm_gem_object *gobj; 1004 struct pid *pid; 1005 int id; 1006 1007 /* 1008 * Although we have a valid reference on file->pid, that does 1009 * not guarantee that the task_struct who called get_pid() is 1010 * still alive (e.g. get_pid(current) => fork() => exit()). 1011 * Therefore, we need to protect this ->comm access using RCU. 1012 */ 1013 rcu_read_lock(); 1014 pid = rcu_dereference(file->pid); 1015 task = pid_task(pid, PIDTYPE_TGID); 1016 seq_printf(m, "pid %8d command %s", pid_nr(pid), 1017 task ? task->comm : "<unknown>"); 1018 if (file->name) { 1019 seq_putc(m, '/'); 1020 seq_puts(m, file->name); 1021 } 1022 seq_puts(m, ":\n"); 1023 rcu_read_unlock(); 1024 1025 spin_lock(&file->table_lock); 1026 idr_for_each_entry(&file->object_idr, gobj, id) { 1027 struct amdgpu_bo *bo = gem_to_amdgpu_bo(gobj); 1028 1029 amdgpu_bo_print_info(id, bo, m); 1030 } 1031 spin_unlock(&file->table_lock); 1032 } 1033 mutex_unlock(&file->name_lock); 1034 out: 1035 mutex_unlock(&dev->filelist_mutex); 1036 return 0; 1037 } 1038
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c index 6d5fd371d5ce..1712feb2c238 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c @@ -1577,7 +1577,7 @@ int amdgpu_amdkfd_gpuvm_acquire_process_vm(struct amdgpu_device *adev, if (ret) return ret; - amdgpu_vm_set_task_info(avm); + amdgpu_vm_set_task_info(avm, NULL); return 0; } diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c index 1e475eb01417..d32dc547cc80 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c @@ -310,7 +310,7 @@ static int amdgpu_cs_pass1(struct amdgpu_cs_parser *p, kvfree(chunk_array); /* Use this opportunity to fill in task info for the vm */ - amdgpu_vm_set_task_info(vm); + amdgpu_vm_set_task_info(vm, p->filp); return 0; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c index 0e617dff8765..0c52168edbaf 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c @@ -997,6 +997,10 @@ static int amdgpu_debugfs_gem_info_show(struct seq_file *m, void *unused) if (r) return r; + r = mutex_lock_interruptible(&file->name_lock); + if (r) + goto out; + list_for_each_entry(file, &dev->filelist, lhead) { struct task_struct *task; struct drm_gem_object *gobj; @@ -1012,8 +1016,13 @@ static int amdgpu_debugfs_gem_info_show(struct seq_file *m, void *unused) rcu_read_lock(); pid = rcu_dereference(file->pid); task = pid_task(pid, PIDTYPE_TGID); - seq_printf(m, "pid %8d command %s:\n", pid_nr(pid), - task ? task->comm : "<unknown>"); + seq_printf(m, "pid %8d command %s", pid_nr(pid), + task ? task->comm : "<unknown>"); + if (file->name) { + seq_putc(m, '/'); + seq_puts(m, file->name); + } + seq_puts(m, ":\n"); rcu_read_unlock(); spin_lock(&file->table_lock); @@ -1024,7 +1033,8 @@ static int amdgpu_debugfs_gem_info_show(struct seq_file *m, void *unused) } spin_unlock(&file->table_lock); } - + mutex_unlock(&file->name_lock); +out: mutex_unlock(&dev->filelist_mutex); return 0; } diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c index e20d19ae01b2..5701d74159d4 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c @@ -2370,7 +2370,7 @@ static int amdgpu_vm_create_task_info(struct amdgpu_vm *vm) * * @vm: vm for which to set the info */ -void amdgpu_vm_set_task_info(struct amdgpu_vm *vm) +void amdgpu_vm_set_task_info(struct amdgpu_vm *vm, struct drm_file *file) { if (!vm->task_info) return; @@ -2385,7 +2385,28 @@ void amdgpu_vm_set_task_info(struct amdgpu_vm *vm) return; vm->task_info->tgid = current->group_leader->pid; - get_task_comm(vm->task_info->process_name, current->group_leader); + __get_task_comm(vm->task_info->process_name, TASK_COMM_LEN, + current->group_leader); + /* Append drm_client_name if set. */ + if (file && file->name) { + mutex_lock(&file->name_lock); + + /* Assert that process_name is big enough to store process_name, + * so: (TASK_COMM_LEN - 1) + '/' + '\0'. + * This way we can concat file->name without worrying about space. + */ + static_assert(sizeof(vm->task_info->process_name) >= TASK_COMM_LEN + 1); + if (file->name) { + int n; + + n = strlen(vm->task_info->process_name); + vm->task_info->process_name[n] = '/'; + strscpy_pad(&vm->task_info->process_name[n + 1], + file->name, + sizeof(vm->task_info->process_name) - (n + 1)); + } + mutex_unlock(&file->name_lock); + } } /** diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h index d12d66dca8e9..cabec384b4d4 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h @@ -232,7 +232,7 @@ struct amdgpu_vm_pte_funcs { }; struct amdgpu_task_info { - char process_name[TASK_COMM_LEN]; + char process_name[NAME_MAX]; char task_name[TASK_COMM_LEN]; pid_t pid; pid_t tgid; @@ -561,7 +561,7 @@ bool amdgpu_vm_handle_fault(struct amdgpu_device *adev, u32 pasid, u32 vmid, u32 node_id, uint64_t addr, uint64_t ts, bool write_fault); -void amdgpu_vm_set_task_info(struct amdgpu_vm *vm); +void amdgpu_vm_set_task_info(struct amdgpu_vm *vm, struct drm_file *file); void amdgpu_vm_move_to_lru_tail(struct amdgpu_device *adev, struct amdgpu_vm *vm);
In debugfs gem_info/vm_info files, timeout handler and page fault reports. This information is useful with the virtio/native-context driver: this allows the guest applications identifier to visible in amdgpu's output. The output in amdgpu_vm_info/amdgpu_gem_info looks like this: pid:12255 Process:glxgears/test-set-fd-name ---------- Signed-off-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com> --- .../gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 2 +- drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 2 +- drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c | 16 +++++++++--- drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 25 +++++++++++++++++-- drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h | 4 +-- 5 files changed, 40 insertions(+), 9 deletions(-)