On 10/30/2025 11:53 PM, Chen, Xiaogang wrote: > > On 10/29/2025 10:45 PM, Zhu Lingshan wrote: >> The pasid is a per-process-per-device attribute, >> therefore this commit implements per >> struct kfd_process_device->pasid in sysfs > This per device pasid is used internally in kfd, not used at user > space. So no need to exposing it.
current sysfs implementation exposing PASID to user space, but buggy value 0, this commit intends to fix this issue. Thanks Lingshan >> >> Signed-off-by: Zhu Lingshan <[email protected]> >> --- >> drivers/gpu/drm/amd/amdkfd/kfd_priv.h | 9 ++------- >> drivers/gpu/drm/amd/amdkfd/kfd_process.c | 18 +++++++++++------- >> 2 files changed, 13 insertions(+), 14 deletions(-) >> >> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h >> b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h >> index 70ef051511bb..6a3cfeccacd8 100644 >> --- a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h >> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h >> @@ -864,6 +864,8 @@ struct kfd_process_device { >> bool has_reset_queue; >> u32 pasid; >> + char pasid_filename[MAX_SYSFS_FILENAME_LEN]; >> + struct attribute attr_pasid; >> }; >> #define qpd_to_pdd(x) container_of(x, struct kfd_process_device, >> qpd) >> @@ -983,7 +985,6 @@ struct kfd_process { >> /* Kobj for our procfs */ >> struct kobject *kobj; >> struct kobject *kobj_queues; >> - struct attribute attr_pasid; > We keep it to have use space tools(ex rocm-smi) work as the tools > still read it before they change. >> /* Keep track cwsr init */ >> bool has_cwsr; >> @@ -1100,12 +1101,6 @@ void >> kfd_process_device_remove_obj_handle(struct kfd_process_device *pdd, >> int handle); >> struct kfd_process *kfd_lookup_process_by_pid(struct pid *pid); >> -/* PASIDs */ >> -int kfd_pasid_init(void); >> -void kfd_pasid_exit(void); >> -u32 kfd_pasid_alloc(void); >> -void kfd_pasid_free(u32 pasid); > This part is right, these declarations were forgotten to remove. >> - >> /* Doorbells */ >> size_t kfd_doorbell_process_slice(struct kfd_dev *kfd); >> int kfd_doorbell_init(struct kfd_dev *kfd); >> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process.c >> b/drivers/gpu/drm/amd/amdkfd/kfd_process.c >> index ddfe30c13e9d..24cf3b250b37 100644 >> --- a/drivers/gpu/drm/amd/amdkfd/kfd_process.c >> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_process.c >> @@ -328,9 +328,11 @@ static int kfd_get_cu_occupancy(struct attribute >> *attr, char *buffer) >> static ssize_t kfd_procfs_show(struct kobject *kobj, struct >> attribute *attr, >> char *buffer) >> { >> - if (strcmp(attr->name, "pasid") == 0) >> - return snprintf(buffer, PAGE_SIZE, "%d\n", 0); > > Same as above we keep it to have compatibility with current tools. > > Regards > > Xiaogang > >> - else if (strncmp(attr->name, "vram_", 5) == 0) { >> + if (strncmp(attr->name, "pasid_", 6) == 0) { >> + struct kfd_process_device *pdd = container_of(attr, struct >> kfd_process_device, >> + attr_pasid); >> + return snprintf(buffer, PAGE_SIZE, "%u\n", pdd->pasid); >> + } else if (strncmp(attr->name, "vram_", 5) == 0) { >> struct kfd_process_device *pdd = container_of(attr, struct >> kfd_process_device, >> attr_vram); >> return snprintf(buffer, PAGE_SIZE, "%llu\n", >> atomic64_read(&pdd->vram_usage)); >> @@ -662,6 +664,7 @@ static void kfd_procfs_add_sysfs_files(struct >> kfd_process *p) >> * Create sysfs files for each GPU: >> * - proc/<pid>/vram_<gpuid> >> * - proc/<pid>/sdma_<gpuid> >> + * - proc/<pid>/pasid_<gpuid> >> */ >> for (i = 0; i < p->n_pdds; i++) { >> struct kfd_process_device *pdd = p->pdds[i]; >> @@ -675,6 +678,10 @@ static void kfd_procfs_add_sysfs_files(struct >> kfd_process *p) >> pdd->dev->id); >> kfd_sysfs_create_file(p->kobj, &pdd->attr_sdma, >> pdd->sdma_filename); >> + >> + snprintf(pdd->pasid_filename, MAX_SYSFS_FILENAME_LEN, >> "pasid_%u", >> + pdd->dev->id); >> + kfd_sysfs_create_file(p->kobj, &pdd->attr_pasid, >> pdd->pasid_filename); >> } >> } >> @@ -888,9 +895,6 @@ struct kfd_process *kfd_create_process(struct >> task_struct *thread) >> goto out; >> } >> - kfd_sysfs_create_file(process->kobj, &process->attr_pasid, >> - "pasid"); >> - >> process->kobj_queues = kobject_create_and_add("queues", >> process->kobj); >> if (!process->kobj_queues) >> @@ -1104,7 +1108,6 @@ static void kfd_process_remove_sysfs(struct >> kfd_process *p) >> if (!p->kobj) >> return; >> - sysfs_remove_file(p->kobj, &p->attr_pasid); >> kobject_del(p->kobj_queues); >> kobject_put(p->kobj_queues); >> p->kobj_queues = NULL; >> @@ -1114,6 +1117,7 @@ static void kfd_process_remove_sysfs(struct >> kfd_process *p) >> sysfs_remove_file(p->kobj, &pdd->attr_vram); >> sysfs_remove_file(p->kobj, &pdd->attr_sdma); >> + sysfs_remove_file(p->kobj, &pdd->attr_pasid); >> sysfs_remove_file(pdd->kobj_stats, &pdd->attr_evict); >> if (pdd->dev->kfd2kgd->get_cu_occupancy)
