Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0 OR MIT
0002 /*
0003  * Copyright 2014-2022 Advanced Micro Devices, Inc.
0004  *
0005  * Permission is hereby granted, free of charge, to any person obtaining a
0006  * copy of this software and associated documentation files (the "Software"),
0007  * to deal in the Software without restriction, including without limitation
0008  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
0009  * and/or sell copies of the Software, and to permit persons to whom the
0010  * Software is furnished to do so, subject to the following conditions:
0011  *
0012  * The above copyright notice and this permission notice shall be included in
0013  * all copies or substantial portions of the Software.
0014  *
0015  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
0016  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
0017  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
0018  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
0019  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
0020  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
0021  * OTHER DEALINGS IN THE SOFTWARE.
0022  */
0023 
0024 #include <linux/mutex.h>
0025 #include <linux/log2.h>
0026 #include <linux/sched.h>
0027 #include <linux/sched/mm.h>
0028 #include <linux/sched/task.h>
0029 #include <linux/mmu_context.h>
0030 #include <linux/slab.h>
0031 #include <linux/amd-iommu.h>
0032 #include <linux/notifier.h>
0033 #include <linux/compat.h>
0034 #include <linux/mman.h>
0035 #include <linux/file.h>
0036 #include <linux/pm_runtime.h>
0037 #include "amdgpu_amdkfd.h"
0038 #include "amdgpu.h"
0039 
0040 struct mm_struct;
0041 
0042 #include "kfd_priv.h"
0043 #include "kfd_device_queue_manager.h"
0044 #include "kfd_iommu.h"
0045 #include "kfd_svm.h"
0046 #include "kfd_smi_events.h"
0047 
0048 /*
0049  * List of struct kfd_process (field kfd_process).
0050  * Unique/indexed by mm_struct*
0051  */
0052 DEFINE_HASHTABLE(kfd_processes_table, KFD_PROCESS_TABLE_SIZE);
0053 static DEFINE_MUTEX(kfd_processes_mutex);
0054 
0055 DEFINE_SRCU(kfd_processes_srcu);
0056 
0057 /* For process termination handling */
0058 static struct workqueue_struct *kfd_process_wq;
0059 
0060 /* Ordered, single-threaded workqueue for restoring evicted
0061  * processes. Restoring multiple processes concurrently under memory
0062  * pressure can lead to processes blocking each other from validating
0063  * their BOs and result in a live-lock situation where processes
0064  * remain evicted indefinitely.
0065  */
0066 static struct workqueue_struct *kfd_restore_wq;
0067 
0068 static struct kfd_process *find_process(const struct task_struct *thread,
0069                     bool ref);
0070 static void kfd_process_ref_release(struct kref *ref);
0071 static struct kfd_process *create_process(const struct task_struct *thread);
0072 static int kfd_process_init_cwsr_apu(struct kfd_process *p, struct file *filep);
0073 
0074 static void evict_process_worker(struct work_struct *work);
0075 static void restore_process_worker(struct work_struct *work);
0076 
0077 static void kfd_process_device_destroy_cwsr_dgpu(struct kfd_process_device *pdd);
0078 
0079 struct kfd_procfs_tree {
0080     struct kobject *kobj;
0081 };
0082 
0083 static struct kfd_procfs_tree procfs;
0084 
0085 /*
0086  * Structure for SDMA activity tracking
0087  */
0088 struct kfd_sdma_activity_handler_workarea {
0089     struct work_struct sdma_activity_work;
0090     struct kfd_process_device *pdd;
0091     uint64_t sdma_activity_counter;
0092 };
0093 
0094 struct temp_sdma_queue_list {
0095     uint64_t __user *rptr;
0096     uint64_t sdma_val;
0097     unsigned int queue_id;
0098     struct list_head list;
0099 };
0100 
0101 static void kfd_sdma_activity_worker(struct work_struct *work)
0102 {
0103     struct kfd_sdma_activity_handler_workarea *workarea;
0104     struct kfd_process_device *pdd;
0105     uint64_t val;
0106     struct mm_struct *mm;
0107     struct queue *q;
0108     struct qcm_process_device *qpd;
0109     struct device_queue_manager *dqm;
0110     int ret = 0;
0111     struct temp_sdma_queue_list sdma_q_list;
0112     struct temp_sdma_queue_list *sdma_q, *next;
0113 
0114     workarea = container_of(work, struct kfd_sdma_activity_handler_workarea,
0115                 sdma_activity_work);
0116 
0117     pdd = workarea->pdd;
0118     if (!pdd)
0119         return;
0120     dqm = pdd->dev->dqm;
0121     qpd = &pdd->qpd;
0122     if (!dqm || !qpd)
0123         return;
0124     /*
0125      * Total SDMA activity is current SDMA activity + past SDMA activity
0126      * Past SDMA count is stored in pdd.
0127      * To get the current activity counters for all active SDMA queues,
0128      * we loop over all SDMA queues and get their counts from user-space.
0129      *
0130      * We cannot call get_user() with dqm_lock held as it can cause
0131      * a circular lock dependency situation. To read the SDMA stats,
0132      * we need to do the following:
0133      *
0134      * 1. Create a temporary list of SDMA queue nodes from the qpd->queues_list,
0135      *    with dqm_lock/dqm_unlock().
0136      * 2. Call get_user() for each node in temporary list without dqm_lock.
0137      *    Save the SDMA count for each node and also add the count to the total
0138      *    SDMA count counter.
0139      *    Its possible, during this step, a few SDMA queue nodes got deleted
0140      *    from the qpd->queues_list.
0141      * 3. Do a second pass over qpd->queues_list to check if any nodes got deleted.
0142      *    If any node got deleted, its SDMA count would be captured in the sdma
0143      *    past activity counter. So subtract the SDMA counter stored in step 2
0144      *    for this node from the total SDMA count.
0145      */
0146     INIT_LIST_HEAD(&sdma_q_list.list);
0147 
0148     /*
0149      * Create the temp list of all SDMA queues
0150      */
0151     dqm_lock(dqm);
0152 
0153     list_for_each_entry(q, &qpd->queues_list, list) {
0154         if ((q->properties.type != KFD_QUEUE_TYPE_SDMA) &&
0155             (q->properties.type != KFD_QUEUE_TYPE_SDMA_XGMI))
0156             continue;
0157 
0158         sdma_q = kzalloc(sizeof(struct temp_sdma_queue_list), GFP_KERNEL);
0159         if (!sdma_q) {
0160             dqm_unlock(dqm);
0161             goto cleanup;
0162         }
0163 
0164         INIT_LIST_HEAD(&sdma_q->list);
0165         sdma_q->rptr = (uint64_t __user *)q->properties.read_ptr;
0166         sdma_q->queue_id = q->properties.queue_id;
0167         list_add_tail(&sdma_q->list, &sdma_q_list.list);
0168     }
0169 
0170     /*
0171      * If the temp list is empty, then no SDMA queues nodes were found in
0172      * qpd->queues_list. Return the past activity count as the total sdma
0173      * count
0174      */
0175     if (list_empty(&sdma_q_list.list)) {
0176         workarea->sdma_activity_counter = pdd->sdma_past_activity_counter;
0177         dqm_unlock(dqm);
0178         return;
0179     }
0180 
0181     dqm_unlock(dqm);
0182 
0183     /*
0184      * Get the usage count for each SDMA queue in temp_list.
0185      */
0186     mm = get_task_mm(pdd->process->lead_thread);
0187     if (!mm)
0188         goto cleanup;
0189 
0190     kthread_use_mm(mm);
0191 
0192     list_for_each_entry(sdma_q, &sdma_q_list.list, list) {
0193         val = 0;
0194         ret = read_sdma_queue_counter(sdma_q->rptr, &val);
0195         if (ret) {
0196             pr_debug("Failed to read SDMA queue active counter for queue id: %d",
0197                  sdma_q->queue_id);
0198         } else {
0199             sdma_q->sdma_val = val;
0200             workarea->sdma_activity_counter += val;
0201         }
0202     }
0203 
0204     kthread_unuse_mm(mm);
0205     mmput(mm);
0206 
0207     /*
0208      * Do a second iteration over qpd_queues_list to check if any SDMA
0209      * nodes got deleted while fetching SDMA counter.
0210      */
0211     dqm_lock(dqm);
0212 
0213     workarea->sdma_activity_counter += pdd->sdma_past_activity_counter;
0214 
0215     list_for_each_entry(q, &qpd->queues_list, list) {
0216         if (list_empty(&sdma_q_list.list))
0217             break;
0218 
0219         if ((q->properties.type != KFD_QUEUE_TYPE_SDMA) &&
0220             (q->properties.type != KFD_QUEUE_TYPE_SDMA_XGMI))
0221             continue;
0222 
0223         list_for_each_entry_safe(sdma_q, next, &sdma_q_list.list, list) {
0224             if (((uint64_t __user *)q->properties.read_ptr == sdma_q->rptr) &&
0225                  (sdma_q->queue_id == q->properties.queue_id)) {
0226                 list_del(&sdma_q->list);
0227                 kfree(sdma_q);
0228                 break;
0229             }
0230         }
0231     }
0232 
0233     dqm_unlock(dqm);
0234 
0235     /*
0236      * If temp list is not empty, it implies some queues got deleted
0237      * from qpd->queues_list during SDMA usage read. Subtract the SDMA
0238      * count for each node from the total SDMA count.
0239      */
0240     list_for_each_entry_safe(sdma_q, next, &sdma_q_list.list, list) {
0241         workarea->sdma_activity_counter -= sdma_q->sdma_val;
0242         list_del(&sdma_q->list);
0243         kfree(sdma_q);
0244     }
0245 
0246     return;
0247 
0248 cleanup:
0249     list_for_each_entry_safe(sdma_q, next, &sdma_q_list.list, list) {
0250         list_del(&sdma_q->list);
0251         kfree(sdma_q);
0252     }
0253 }
0254 
0255 /**
0256  * kfd_get_cu_occupancy - Collect number of waves in-flight on this device
0257  * by current process. Translates acquired wave count into number of compute units
0258  * that are occupied.
0259  *
0260  * @attr: Handle of attribute that allows reporting of wave count. The attribute
0261  * handle encapsulates GPU device it is associated with, thereby allowing collection
0262  * of waves in flight, etc
0263  * @buffer: Handle of user provided buffer updated with wave count
0264  *
0265  * Return: Number of bytes written to user buffer or an error value
0266  */
0267 static int kfd_get_cu_occupancy(struct attribute *attr, char *buffer)
0268 {
0269     int cu_cnt;
0270     int wave_cnt;
0271     int max_waves_per_cu;
0272     struct kfd_dev *dev = NULL;
0273     struct kfd_process *proc = NULL;
0274     struct kfd_process_device *pdd = NULL;
0275 
0276     pdd = container_of(attr, struct kfd_process_device, attr_cu_occupancy);
0277     dev = pdd->dev;
0278     if (dev->kfd2kgd->get_cu_occupancy == NULL)
0279         return -EINVAL;
0280 
0281     cu_cnt = 0;
0282     proc = pdd->process;
0283     if (pdd->qpd.queue_count == 0) {
0284         pr_debug("Gpu-Id: %d has no active queues for process %d\n",
0285              dev->id, proc->pasid);
0286         return snprintf(buffer, PAGE_SIZE, "%d\n", cu_cnt);
0287     }
0288 
0289     /* Collect wave count from device if it supports */
0290     wave_cnt = 0;
0291     max_waves_per_cu = 0;
0292     dev->kfd2kgd->get_cu_occupancy(dev->adev, proc->pasid, &wave_cnt,
0293             &max_waves_per_cu);
0294 
0295     /* Translate wave count to number of compute units */
0296     cu_cnt = (wave_cnt + (max_waves_per_cu - 1)) / max_waves_per_cu;
0297     return snprintf(buffer, PAGE_SIZE, "%d\n", cu_cnt);
0298 }
0299 
0300 static ssize_t kfd_procfs_show(struct kobject *kobj, struct attribute *attr,
0301                    char *buffer)
0302 {
0303     if (strcmp(attr->name, "pasid") == 0) {
0304         struct kfd_process *p = container_of(attr, struct kfd_process,
0305                              attr_pasid);
0306 
0307         return snprintf(buffer, PAGE_SIZE, "%d\n", p->pasid);
0308     } else if (strncmp(attr->name, "vram_", 5) == 0) {
0309         struct kfd_process_device *pdd = container_of(attr, struct kfd_process_device,
0310                                   attr_vram);
0311         return snprintf(buffer, PAGE_SIZE, "%llu\n", READ_ONCE(pdd->vram_usage));
0312     } else if (strncmp(attr->name, "sdma_", 5) == 0) {
0313         struct kfd_process_device *pdd = container_of(attr, struct kfd_process_device,
0314                                   attr_sdma);
0315         struct kfd_sdma_activity_handler_workarea sdma_activity_work_handler;
0316 
0317         INIT_WORK(&sdma_activity_work_handler.sdma_activity_work,
0318                     kfd_sdma_activity_worker);
0319 
0320         sdma_activity_work_handler.pdd = pdd;
0321         sdma_activity_work_handler.sdma_activity_counter = 0;
0322 
0323         schedule_work(&sdma_activity_work_handler.sdma_activity_work);
0324 
0325         flush_work(&sdma_activity_work_handler.sdma_activity_work);
0326 
0327         return snprintf(buffer, PAGE_SIZE, "%llu\n",
0328                 (sdma_activity_work_handler.sdma_activity_counter)/
0329                  SDMA_ACTIVITY_DIVISOR);
0330     } else {
0331         pr_err("Invalid attribute");
0332         return -EINVAL;
0333     }
0334 
0335     return 0;
0336 }
0337 
0338 static void kfd_procfs_kobj_release(struct kobject *kobj)
0339 {
0340     kfree(kobj);
0341 }
0342 
0343 static const struct sysfs_ops kfd_procfs_ops = {
0344     .show = kfd_procfs_show,
0345 };
0346 
0347 static struct kobj_type procfs_type = {
0348     .release = kfd_procfs_kobj_release,
0349     .sysfs_ops = &kfd_procfs_ops,
0350 };
0351 
0352 void kfd_procfs_init(void)
0353 {
0354     int ret = 0;
0355 
0356     procfs.kobj = kfd_alloc_struct(procfs.kobj);
0357     if (!procfs.kobj)
0358         return;
0359 
0360     ret = kobject_init_and_add(procfs.kobj, &procfs_type,
0361                    &kfd_device->kobj, "proc");
0362     if (ret) {
0363         pr_warn("Could not create procfs proc folder");
0364         /* If we fail to create the procfs, clean up */
0365         kfd_procfs_shutdown();
0366     }
0367 }
0368 
0369 void kfd_procfs_shutdown(void)
0370 {
0371     if (procfs.kobj) {
0372         kobject_del(procfs.kobj);
0373         kobject_put(procfs.kobj);
0374         procfs.kobj = NULL;
0375     }
0376 }
0377 
0378 static ssize_t kfd_procfs_queue_show(struct kobject *kobj,
0379                      struct attribute *attr, char *buffer)
0380 {
0381     struct queue *q = container_of(kobj, struct queue, kobj);
0382 
0383     if (!strcmp(attr->name, "size"))
0384         return snprintf(buffer, PAGE_SIZE, "%llu",
0385                 q->properties.queue_size);
0386     else if (!strcmp(attr->name, "type"))
0387         return snprintf(buffer, PAGE_SIZE, "%d", q->properties.type);
0388     else if (!strcmp(attr->name, "gpuid"))
0389         return snprintf(buffer, PAGE_SIZE, "%u", q->device->id);
0390     else
0391         pr_err("Invalid attribute");
0392 
0393     return 0;
0394 }
0395 
0396 static ssize_t kfd_procfs_stats_show(struct kobject *kobj,
0397                      struct attribute *attr, char *buffer)
0398 {
0399     if (strcmp(attr->name, "evicted_ms") == 0) {
0400         struct kfd_process_device *pdd = container_of(attr,
0401                 struct kfd_process_device,
0402                 attr_evict);
0403         uint64_t evict_jiffies;
0404 
0405         evict_jiffies = atomic64_read(&pdd->evict_duration_counter);
0406 
0407         return snprintf(buffer,
0408                 PAGE_SIZE,
0409                 "%llu\n",
0410                 jiffies64_to_msecs(evict_jiffies));
0411 
0412     /* Sysfs handle that gets CU occupancy is per device */
0413     } else if (strcmp(attr->name, "cu_occupancy") == 0) {
0414         return kfd_get_cu_occupancy(attr, buffer);
0415     } else {
0416         pr_err("Invalid attribute");
0417     }
0418 
0419     return 0;
0420 }
0421 
0422 static ssize_t kfd_sysfs_counters_show(struct kobject *kobj,
0423                        struct attribute *attr, char *buf)
0424 {
0425     struct kfd_process_device *pdd;
0426 
0427     if (!strcmp(attr->name, "faults")) {
0428         pdd = container_of(attr, struct kfd_process_device,
0429                    attr_faults);
0430         return sysfs_emit(buf, "%llu\n", READ_ONCE(pdd->faults));
0431     }
0432     if (!strcmp(attr->name, "page_in")) {
0433         pdd = container_of(attr, struct kfd_process_device,
0434                    attr_page_in);
0435         return sysfs_emit(buf, "%llu\n", READ_ONCE(pdd->page_in));
0436     }
0437     if (!strcmp(attr->name, "page_out")) {
0438         pdd = container_of(attr, struct kfd_process_device,
0439                    attr_page_out);
0440         return sysfs_emit(buf, "%llu\n", READ_ONCE(pdd->page_out));
0441     }
0442     return 0;
0443 }
0444 
0445 static struct attribute attr_queue_size = {
0446     .name = "size",
0447     .mode = KFD_SYSFS_FILE_MODE
0448 };
0449 
0450 static struct attribute attr_queue_type = {
0451     .name = "type",
0452     .mode = KFD_SYSFS_FILE_MODE
0453 };
0454 
0455 static struct attribute attr_queue_gpuid = {
0456     .name = "gpuid",
0457     .mode = KFD_SYSFS_FILE_MODE
0458 };
0459 
0460 static struct attribute *procfs_queue_attrs[] = {
0461     &attr_queue_size,
0462     &attr_queue_type,
0463     &attr_queue_gpuid,
0464     NULL
0465 };
0466 ATTRIBUTE_GROUPS(procfs_queue);
0467 
0468 static const struct sysfs_ops procfs_queue_ops = {
0469     .show = kfd_procfs_queue_show,
0470 };
0471 
0472 static struct kobj_type procfs_queue_type = {
0473     .sysfs_ops = &procfs_queue_ops,
0474     .default_groups = procfs_queue_groups,
0475 };
0476 
0477 static const struct sysfs_ops procfs_stats_ops = {
0478     .show = kfd_procfs_stats_show,
0479 };
0480 
0481 static struct kobj_type procfs_stats_type = {
0482     .sysfs_ops = &procfs_stats_ops,
0483     .release = kfd_procfs_kobj_release,
0484 };
0485 
0486 static const struct sysfs_ops sysfs_counters_ops = {
0487     .show = kfd_sysfs_counters_show,
0488 };
0489 
0490 static struct kobj_type sysfs_counters_type = {
0491     .sysfs_ops = &sysfs_counters_ops,
0492     .release = kfd_procfs_kobj_release,
0493 };
0494 
0495 int kfd_procfs_add_queue(struct queue *q)
0496 {
0497     struct kfd_process *proc;
0498     int ret;
0499 
0500     if (!q || !q->process)
0501         return -EINVAL;
0502     proc = q->process;
0503 
0504     /* Create proc/<pid>/queues/<queue id> folder */
0505     if (!proc->kobj_queues)
0506         return -EFAULT;
0507     ret = kobject_init_and_add(&q->kobj, &procfs_queue_type,
0508             proc->kobj_queues, "%u", q->properties.queue_id);
0509     if (ret < 0) {
0510         pr_warn("Creating proc/<pid>/queues/%u failed",
0511             q->properties.queue_id);
0512         kobject_put(&q->kobj);
0513         return ret;
0514     }
0515 
0516     return 0;
0517 }
0518 
0519 static void kfd_sysfs_create_file(struct kobject *kobj, struct attribute *attr,
0520                  char *name)
0521 {
0522     int ret;
0523 
0524     if (!kobj || !attr || !name)
0525         return;
0526 
0527     attr->name = name;
0528     attr->mode = KFD_SYSFS_FILE_MODE;
0529     sysfs_attr_init(attr);
0530 
0531     ret = sysfs_create_file(kobj, attr);
0532     if (ret)
0533         pr_warn("Create sysfs %s/%s failed %d", kobj->name, name, ret);
0534 }
0535 
0536 static void kfd_procfs_add_sysfs_stats(struct kfd_process *p)
0537 {
0538     int ret;
0539     int i;
0540     char stats_dir_filename[MAX_SYSFS_FILENAME_LEN];
0541 
0542     if (!p || !p->kobj)
0543         return;
0544 
0545     /*
0546      * Create sysfs files for each GPU:
0547      * - proc/<pid>/stats_<gpuid>/
0548      * - proc/<pid>/stats_<gpuid>/evicted_ms
0549      * - proc/<pid>/stats_<gpuid>/cu_occupancy
0550      */
0551     for (i = 0; i < p->n_pdds; i++) {
0552         struct kfd_process_device *pdd = p->pdds[i];
0553 
0554         snprintf(stats_dir_filename, MAX_SYSFS_FILENAME_LEN,
0555                 "stats_%u", pdd->dev->id);
0556         pdd->kobj_stats = kfd_alloc_struct(pdd->kobj_stats);
0557         if (!pdd->kobj_stats)
0558             return;
0559 
0560         ret = kobject_init_and_add(pdd->kobj_stats,
0561                        &procfs_stats_type,
0562                        p->kobj,
0563                        stats_dir_filename);
0564 
0565         if (ret) {
0566             pr_warn("Creating KFD proc/stats_%s folder failed",
0567                 stats_dir_filename);
0568             kobject_put(pdd->kobj_stats);
0569             pdd->kobj_stats = NULL;
0570             return;
0571         }
0572 
0573         kfd_sysfs_create_file(pdd->kobj_stats, &pdd->attr_evict,
0574                       "evicted_ms");
0575         /* Add sysfs file to report compute unit occupancy */
0576         if (pdd->dev->kfd2kgd->get_cu_occupancy)
0577             kfd_sysfs_create_file(pdd->kobj_stats,
0578                           &pdd->attr_cu_occupancy,
0579                           "cu_occupancy");
0580     }
0581 }
0582 
0583 static void kfd_procfs_add_sysfs_counters(struct kfd_process *p)
0584 {
0585     int ret = 0;
0586     int i;
0587     char counters_dir_filename[MAX_SYSFS_FILENAME_LEN];
0588 
0589     if (!p || !p->kobj)
0590         return;
0591 
0592     /*
0593      * Create sysfs files for each GPU which supports SVM
0594      * - proc/<pid>/counters_<gpuid>/
0595      * - proc/<pid>/counters_<gpuid>/faults
0596      * - proc/<pid>/counters_<gpuid>/page_in
0597      * - proc/<pid>/counters_<gpuid>/page_out
0598      */
0599     for_each_set_bit(i, p->svms.bitmap_supported, p->n_pdds) {
0600         struct kfd_process_device *pdd = p->pdds[i];
0601         struct kobject *kobj_counters;
0602 
0603         snprintf(counters_dir_filename, MAX_SYSFS_FILENAME_LEN,
0604             "counters_%u", pdd->dev->id);
0605         kobj_counters = kfd_alloc_struct(kobj_counters);
0606         if (!kobj_counters)
0607             return;
0608 
0609         ret = kobject_init_and_add(kobj_counters, &sysfs_counters_type,
0610                        p->kobj, counters_dir_filename);
0611         if (ret) {
0612             pr_warn("Creating KFD proc/%s folder failed",
0613                 counters_dir_filename);
0614             kobject_put(kobj_counters);
0615             return;
0616         }
0617 
0618         pdd->kobj_counters = kobj_counters;
0619         kfd_sysfs_create_file(kobj_counters, &pdd->attr_faults,
0620                       "faults");
0621         kfd_sysfs_create_file(kobj_counters, &pdd->attr_page_in,
0622                       "page_in");
0623         kfd_sysfs_create_file(kobj_counters, &pdd->attr_page_out,
0624                       "page_out");
0625     }
0626 }
0627 
0628 static void kfd_procfs_add_sysfs_files(struct kfd_process *p)
0629 {
0630     int i;
0631 
0632     if (!p || !p->kobj)
0633         return;
0634 
0635     /*
0636      * Create sysfs files for each GPU:
0637      * - proc/<pid>/vram_<gpuid>
0638      * - proc/<pid>/sdma_<gpuid>
0639      */
0640     for (i = 0; i < p->n_pdds; i++) {
0641         struct kfd_process_device *pdd = p->pdds[i];
0642 
0643         snprintf(pdd->vram_filename, MAX_SYSFS_FILENAME_LEN, "vram_%u",
0644              pdd->dev->id);
0645         kfd_sysfs_create_file(p->kobj, &pdd->attr_vram,
0646                       pdd->vram_filename);
0647 
0648         snprintf(pdd->sdma_filename, MAX_SYSFS_FILENAME_LEN, "sdma_%u",
0649              pdd->dev->id);
0650         kfd_sysfs_create_file(p->kobj, &pdd->attr_sdma,
0651                         pdd->sdma_filename);
0652     }
0653 }
0654 
0655 void kfd_procfs_del_queue(struct queue *q)
0656 {
0657     if (!q)
0658         return;
0659 
0660     kobject_del(&q->kobj);
0661     kobject_put(&q->kobj);
0662 }
0663 
0664 int kfd_process_create_wq(void)
0665 {
0666     if (!kfd_process_wq)
0667         kfd_process_wq = alloc_workqueue("kfd_process_wq", 0, 0);
0668     if (!kfd_restore_wq)
0669         kfd_restore_wq = alloc_ordered_workqueue("kfd_restore_wq", 0);
0670 
0671     if (!kfd_process_wq || !kfd_restore_wq) {
0672         kfd_process_destroy_wq();
0673         return -ENOMEM;
0674     }
0675 
0676     return 0;
0677 }
0678 
0679 void kfd_process_destroy_wq(void)
0680 {
0681     if (kfd_process_wq) {
0682         destroy_workqueue(kfd_process_wq);
0683         kfd_process_wq = NULL;
0684     }
0685     if (kfd_restore_wq) {
0686         destroy_workqueue(kfd_restore_wq);
0687         kfd_restore_wq = NULL;
0688     }
0689 }
0690 
0691 static void kfd_process_free_gpuvm(struct kgd_mem *mem,
0692             struct kfd_process_device *pdd, void *kptr)
0693 {
0694     struct kfd_dev *dev = pdd->dev;
0695 
0696     if (kptr) {
0697         amdgpu_amdkfd_gpuvm_unmap_gtt_bo_from_kernel(mem);
0698         kptr = NULL;
0699     }
0700 
0701     amdgpu_amdkfd_gpuvm_unmap_memory_from_gpu(dev->adev, mem, pdd->drm_priv);
0702     amdgpu_amdkfd_gpuvm_free_memory_of_gpu(dev->adev, mem, pdd->drm_priv,
0703                            NULL);
0704 }
0705 
0706 /* kfd_process_alloc_gpuvm - Allocate GPU VM for the KFD process
0707  *  This function should be only called right after the process
0708  *  is created and when kfd_processes_mutex is still being held
0709  *  to avoid concurrency. Because of that exclusiveness, we do
0710  *  not need to take p->mutex.
0711  */
0712 static int kfd_process_alloc_gpuvm(struct kfd_process_device *pdd,
0713                    uint64_t gpu_va, uint32_t size,
0714                    uint32_t flags, struct kgd_mem **mem, void **kptr)
0715 {
0716     struct kfd_dev *kdev = pdd->dev;
0717     int err;
0718 
0719     err = amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu(kdev->adev, gpu_va, size,
0720                          pdd->drm_priv, mem, NULL,
0721                          flags, false);
0722     if (err)
0723         goto err_alloc_mem;
0724 
0725     err = amdgpu_amdkfd_gpuvm_map_memory_to_gpu(kdev->adev, *mem,
0726             pdd->drm_priv);
0727     if (err)
0728         goto err_map_mem;
0729 
0730     err = amdgpu_amdkfd_gpuvm_sync_memory(kdev->adev, *mem, true);
0731     if (err) {
0732         pr_debug("Sync memory failed, wait interrupted by user signal\n");
0733         goto sync_memory_failed;
0734     }
0735 
0736     if (kptr) {
0737         err = amdgpu_amdkfd_gpuvm_map_gtt_bo_to_kernel(
0738                 (struct kgd_mem *)*mem, kptr, NULL);
0739         if (err) {
0740             pr_debug("Map GTT BO to kernel failed\n");
0741             goto sync_memory_failed;
0742         }
0743     }
0744 
0745     return err;
0746 
0747 sync_memory_failed:
0748     amdgpu_amdkfd_gpuvm_unmap_memory_from_gpu(kdev->adev, *mem, pdd->drm_priv);
0749 
0750 err_map_mem:
0751     amdgpu_amdkfd_gpuvm_free_memory_of_gpu(kdev->adev, *mem, pdd->drm_priv,
0752                            NULL);
0753 err_alloc_mem:
0754     *mem = NULL;
0755     *kptr = NULL;
0756     return err;
0757 }
0758 
0759 /* kfd_process_device_reserve_ib_mem - Reserve memory inside the
0760  *  process for IB usage The memory reserved is for KFD to submit
0761  *  IB to AMDGPU from kernel.  If the memory is reserved
0762  *  successfully, ib_kaddr will have the CPU/kernel
0763  *  address. Check ib_kaddr before accessing the memory.
0764  */
0765 static int kfd_process_device_reserve_ib_mem(struct kfd_process_device *pdd)
0766 {
0767     struct qcm_process_device *qpd = &pdd->qpd;
0768     uint32_t flags = KFD_IOC_ALLOC_MEM_FLAGS_GTT |
0769             KFD_IOC_ALLOC_MEM_FLAGS_NO_SUBSTITUTE |
0770             KFD_IOC_ALLOC_MEM_FLAGS_WRITABLE |
0771             KFD_IOC_ALLOC_MEM_FLAGS_EXECUTABLE;
0772     struct kgd_mem *mem;
0773     void *kaddr;
0774     int ret;
0775 
0776     if (qpd->ib_kaddr || !qpd->ib_base)
0777         return 0;
0778 
0779     /* ib_base is only set for dGPU */
0780     ret = kfd_process_alloc_gpuvm(pdd, qpd->ib_base, PAGE_SIZE, flags,
0781                       &mem, &kaddr);
0782     if (ret)
0783         return ret;
0784 
0785     qpd->ib_mem = mem;
0786     qpd->ib_kaddr = kaddr;
0787 
0788     return 0;
0789 }
0790 
0791 static void kfd_process_device_destroy_ib_mem(struct kfd_process_device *pdd)
0792 {
0793     struct qcm_process_device *qpd = &pdd->qpd;
0794 
0795     if (!qpd->ib_kaddr || !qpd->ib_base)
0796         return;
0797 
0798     kfd_process_free_gpuvm(qpd->ib_mem, pdd, qpd->ib_kaddr);
0799 }
0800 
0801 struct kfd_process *kfd_create_process(struct file *filep)
0802 {
0803     struct kfd_process *process;
0804     struct task_struct *thread = current;
0805     int ret;
0806 
0807     if (!thread->mm)
0808         return ERR_PTR(-EINVAL);
0809 
0810     /* Only the pthreads threading model is supported. */
0811     if (thread->group_leader->mm != thread->mm)
0812         return ERR_PTR(-EINVAL);
0813 
0814     /*
0815      * take kfd processes mutex before starting of process creation
0816      * so there won't be a case where two threads of the same process
0817      * create two kfd_process structures
0818      */
0819     mutex_lock(&kfd_processes_mutex);
0820 
0821     /* A prior open of /dev/kfd could have already created the process. */
0822     process = find_process(thread, false);
0823     if (process) {
0824         pr_debug("Process already found\n");
0825     } else {
0826         process = create_process(thread);
0827         if (IS_ERR(process))
0828             goto out;
0829 
0830         ret = kfd_process_init_cwsr_apu(process, filep);
0831         if (ret)
0832             goto out_destroy;
0833 
0834         if (!procfs.kobj)
0835             goto out;
0836 
0837         process->kobj = kfd_alloc_struct(process->kobj);
0838         if (!process->kobj) {
0839             pr_warn("Creating procfs kobject failed");
0840             goto out;
0841         }
0842         ret = kobject_init_and_add(process->kobj, &procfs_type,
0843                        procfs.kobj, "%d",
0844                        (int)process->lead_thread->pid);
0845         if (ret) {
0846             pr_warn("Creating procfs pid directory failed");
0847             kobject_put(process->kobj);
0848             goto out;
0849         }
0850 
0851         kfd_sysfs_create_file(process->kobj, &process->attr_pasid,
0852                       "pasid");
0853 
0854         process->kobj_queues = kobject_create_and_add("queues",
0855                             process->kobj);
0856         if (!process->kobj_queues)
0857             pr_warn("Creating KFD proc/queues folder failed");
0858 
0859         kfd_procfs_add_sysfs_stats(process);
0860         kfd_procfs_add_sysfs_files(process);
0861         kfd_procfs_add_sysfs_counters(process);
0862     }
0863 out:
0864     if (!IS_ERR(process))
0865         kref_get(&process->ref);
0866     mutex_unlock(&kfd_processes_mutex);
0867 
0868     return process;
0869 
0870 out_destroy:
0871     hash_del_rcu(&process->kfd_processes);
0872     mutex_unlock(&kfd_processes_mutex);
0873     synchronize_srcu(&kfd_processes_srcu);
0874     /* kfd_process_free_notifier will trigger the cleanup */
0875     mmu_notifier_put(&process->mmu_notifier);
0876     return ERR_PTR(ret);
0877 }
0878 
0879 struct kfd_process *kfd_get_process(const struct task_struct *thread)
0880 {
0881     struct kfd_process *process;
0882 
0883     if (!thread->mm)
0884         return ERR_PTR(-EINVAL);
0885 
0886     /* Only the pthreads threading model is supported. */
0887     if (thread->group_leader->mm != thread->mm)
0888         return ERR_PTR(-EINVAL);
0889 
0890     process = find_process(thread, false);
0891     if (!process)
0892         return ERR_PTR(-EINVAL);
0893 
0894     return process;
0895 }
0896 
0897 static struct kfd_process *find_process_by_mm(const struct mm_struct *mm)
0898 {
0899     struct kfd_process *process;
0900 
0901     hash_for_each_possible_rcu(kfd_processes_table, process,
0902                     kfd_processes, (uintptr_t)mm)
0903         if (process->mm == mm)
0904             return process;
0905 
0906     return NULL;
0907 }
0908 
0909 static struct kfd_process *find_process(const struct task_struct *thread,
0910                     bool ref)
0911 {
0912     struct kfd_process *p;
0913     int idx;
0914 
0915     idx = srcu_read_lock(&kfd_processes_srcu);
0916     p = find_process_by_mm(thread->mm);
0917     if (p && ref)
0918         kref_get(&p->ref);
0919     srcu_read_unlock(&kfd_processes_srcu, idx);
0920 
0921     return p;
0922 }
0923 
0924 void kfd_unref_process(struct kfd_process *p)
0925 {
0926     kref_put(&p->ref, kfd_process_ref_release);
0927 }
0928 
0929 /* This increments the process->ref counter. */
0930 struct kfd_process *kfd_lookup_process_by_pid(struct pid *pid)
0931 {
0932     struct task_struct *task = NULL;
0933     struct kfd_process *p    = NULL;
0934 
0935     if (!pid) {
0936         task = current;
0937         get_task_struct(task);
0938     } else {
0939         task = get_pid_task(pid, PIDTYPE_PID);
0940     }
0941 
0942     if (task) {
0943         p = find_process(task, true);
0944         put_task_struct(task);
0945     }
0946 
0947     return p;
0948 }
0949 
0950 static void kfd_process_device_free_bos(struct kfd_process_device *pdd)
0951 {
0952     struct kfd_process *p = pdd->process;
0953     void *mem;
0954     int id;
0955     int i;
0956 
0957     /*
0958      * Remove all handles from idr and release appropriate
0959      * local memory object
0960      */
0961     idr_for_each_entry(&pdd->alloc_idr, mem, id) {
0962 
0963         for (i = 0; i < p->n_pdds; i++) {
0964             struct kfd_process_device *peer_pdd = p->pdds[i];
0965 
0966             if (!peer_pdd->drm_priv)
0967                 continue;
0968             amdgpu_amdkfd_gpuvm_unmap_memory_from_gpu(
0969                 peer_pdd->dev->adev, mem, peer_pdd->drm_priv);
0970         }
0971 
0972         amdgpu_amdkfd_gpuvm_free_memory_of_gpu(pdd->dev->adev, mem,
0973                                pdd->drm_priv, NULL);
0974         kfd_process_device_remove_obj_handle(pdd, id);
0975     }
0976 }
0977 
0978 /*
0979  * Just kunmap and unpin signal BO here. It will be freed in
0980  * kfd_process_free_outstanding_kfd_bos()
0981  */
0982 static void kfd_process_kunmap_signal_bo(struct kfd_process *p)
0983 {
0984     struct kfd_process_device *pdd;
0985     struct kfd_dev *kdev;
0986     void *mem;
0987 
0988     kdev = kfd_device_by_id(GET_GPU_ID(p->signal_handle));
0989     if (!kdev)
0990         return;
0991 
0992     mutex_lock(&p->mutex);
0993 
0994     pdd = kfd_get_process_device_data(kdev, p);
0995     if (!pdd)
0996         goto out;
0997 
0998     mem = kfd_process_device_translate_handle(
0999         pdd, GET_IDR_HANDLE(p->signal_handle));
1000     if (!mem)
1001         goto out;
1002 
1003     amdgpu_amdkfd_gpuvm_unmap_gtt_bo_from_kernel(mem);
1004 
1005 out:
1006     mutex_unlock(&p->mutex);
1007 }
1008 
1009 static void kfd_process_free_outstanding_kfd_bos(struct kfd_process *p)
1010 {
1011     int i;
1012 
1013     for (i = 0; i < p->n_pdds; i++)
1014         kfd_process_device_free_bos(p->pdds[i]);
1015 }
1016 
1017 static void kfd_process_destroy_pdds(struct kfd_process *p)
1018 {
1019     int i;
1020 
1021     for (i = 0; i < p->n_pdds; i++) {
1022         struct kfd_process_device *pdd = p->pdds[i];
1023 
1024         pr_debug("Releasing pdd (topology id %d) for process (pasid 0x%x)\n",
1025                 pdd->dev->id, p->pasid);
1026 
1027         kfd_process_device_destroy_cwsr_dgpu(pdd);
1028         kfd_process_device_destroy_ib_mem(pdd);
1029 
1030         if (pdd->drm_file) {
1031             amdgpu_amdkfd_gpuvm_release_process_vm(
1032                     pdd->dev->adev, pdd->drm_priv);
1033             fput(pdd->drm_file);
1034         }
1035 
1036         if (pdd->qpd.cwsr_kaddr && !pdd->qpd.cwsr_base)
1037             free_pages((unsigned long)pdd->qpd.cwsr_kaddr,
1038                 get_order(KFD_CWSR_TBA_TMA_SIZE));
1039 
1040         bitmap_free(pdd->qpd.doorbell_bitmap);
1041         idr_destroy(&pdd->alloc_idr);
1042 
1043         kfd_free_process_doorbells(pdd->dev, pdd->doorbell_index);
1044 
1045         if (pdd->dev->shared_resources.enable_mes)
1046             amdgpu_amdkfd_free_gtt_mem(pdd->dev->adev,
1047                            pdd->proc_ctx_bo);
1048         /*
1049          * before destroying pdd, make sure to report availability
1050          * for auto suspend
1051          */
1052         if (pdd->runtime_inuse) {
1053             pm_runtime_mark_last_busy(pdd->dev->ddev->dev);
1054             pm_runtime_put_autosuspend(pdd->dev->ddev->dev);
1055             pdd->runtime_inuse = false;
1056         }
1057 
1058         kfree(pdd);
1059         p->pdds[i] = NULL;
1060     }
1061     p->n_pdds = 0;
1062 }
1063 
1064 static void kfd_process_remove_sysfs(struct kfd_process *p)
1065 {
1066     struct kfd_process_device *pdd;
1067     int i;
1068 
1069     if (!p->kobj)
1070         return;
1071 
1072     sysfs_remove_file(p->kobj, &p->attr_pasid);
1073     kobject_del(p->kobj_queues);
1074     kobject_put(p->kobj_queues);
1075     p->kobj_queues = NULL;
1076 
1077     for (i = 0; i < p->n_pdds; i++) {
1078         pdd = p->pdds[i];
1079 
1080         sysfs_remove_file(p->kobj, &pdd->attr_vram);
1081         sysfs_remove_file(p->kobj, &pdd->attr_sdma);
1082 
1083         sysfs_remove_file(pdd->kobj_stats, &pdd->attr_evict);
1084         if (pdd->dev->kfd2kgd->get_cu_occupancy)
1085             sysfs_remove_file(pdd->kobj_stats,
1086                       &pdd->attr_cu_occupancy);
1087         kobject_del(pdd->kobj_stats);
1088         kobject_put(pdd->kobj_stats);
1089         pdd->kobj_stats = NULL;
1090     }
1091 
1092     for_each_set_bit(i, p->svms.bitmap_supported, p->n_pdds) {
1093         pdd = p->pdds[i];
1094 
1095         sysfs_remove_file(pdd->kobj_counters, &pdd->attr_faults);
1096         sysfs_remove_file(pdd->kobj_counters, &pdd->attr_page_in);
1097         sysfs_remove_file(pdd->kobj_counters, &pdd->attr_page_out);
1098         kobject_del(pdd->kobj_counters);
1099         kobject_put(pdd->kobj_counters);
1100         pdd->kobj_counters = NULL;
1101     }
1102 
1103     kobject_del(p->kobj);
1104     kobject_put(p->kobj);
1105     p->kobj = NULL;
1106 }
1107 
1108 /* No process locking is needed in this function, because the process
1109  * is not findable any more. We must assume that no other thread is
1110  * using it any more, otherwise we couldn't safely free the process
1111  * structure in the end.
1112  */
1113 static void kfd_process_wq_release(struct work_struct *work)
1114 {
1115     struct kfd_process *p = container_of(work, struct kfd_process,
1116                          release_work);
1117 
1118     kfd_process_dequeue_from_all_devices(p);
1119     pqm_uninit(&p->pqm);
1120 
1121     /* Signal the eviction fence after user mode queues are
1122      * destroyed. This allows any BOs to be freed without
1123      * triggering pointless evictions or waiting for fences.
1124      */
1125     dma_fence_signal(p->ef);
1126 
1127     kfd_process_remove_sysfs(p);
1128     kfd_iommu_unbind_process(p);
1129 
1130     kfd_process_kunmap_signal_bo(p);
1131     kfd_process_free_outstanding_kfd_bos(p);
1132     svm_range_list_fini(p);
1133 
1134     kfd_process_destroy_pdds(p);
1135     dma_fence_put(p->ef);
1136 
1137     kfd_event_free_process(p);
1138 
1139     kfd_pasid_free(p->pasid);
1140     mutex_destroy(&p->mutex);
1141 
1142     put_task_struct(p->lead_thread);
1143 
1144     kfree(p);
1145 }
1146 
1147 static void kfd_process_ref_release(struct kref *ref)
1148 {
1149     struct kfd_process *p = container_of(ref, struct kfd_process, ref);
1150 
1151     INIT_WORK(&p->release_work, kfd_process_wq_release);
1152     queue_work(kfd_process_wq, &p->release_work);
1153 }
1154 
1155 static struct mmu_notifier *kfd_process_alloc_notifier(struct mm_struct *mm)
1156 {
1157     int idx = srcu_read_lock(&kfd_processes_srcu);
1158     struct kfd_process *p = find_process_by_mm(mm);
1159 
1160     srcu_read_unlock(&kfd_processes_srcu, idx);
1161 
1162     return p ? &p->mmu_notifier : ERR_PTR(-ESRCH);
1163 }
1164 
1165 static void kfd_process_free_notifier(struct mmu_notifier *mn)
1166 {
1167     kfd_unref_process(container_of(mn, struct kfd_process, mmu_notifier));
1168 }
1169 
1170 static void kfd_process_notifier_release(struct mmu_notifier *mn,
1171                     struct mm_struct *mm)
1172 {
1173     struct kfd_process *p;
1174 
1175     /*
1176      * The kfd_process structure can not be free because the
1177      * mmu_notifier srcu is read locked
1178      */
1179     p = container_of(mn, struct kfd_process, mmu_notifier);
1180     if (WARN_ON(p->mm != mm))
1181         return;
1182 
1183     mutex_lock(&kfd_processes_mutex);
1184     hash_del_rcu(&p->kfd_processes);
1185     mutex_unlock(&kfd_processes_mutex);
1186     synchronize_srcu(&kfd_processes_srcu);
1187 
1188     cancel_delayed_work_sync(&p->eviction_work);
1189     cancel_delayed_work_sync(&p->restore_work);
1190 
1191     /* Indicate to other users that MM is no longer valid */
1192     p->mm = NULL;
1193 
1194     mmu_notifier_put(&p->mmu_notifier);
1195 }
1196 
1197 static const struct mmu_notifier_ops kfd_process_mmu_notifier_ops = {
1198     .release = kfd_process_notifier_release,
1199     .alloc_notifier = kfd_process_alloc_notifier,
1200     .free_notifier = kfd_process_free_notifier,
1201 };
1202 
1203 static int kfd_process_init_cwsr_apu(struct kfd_process *p, struct file *filep)
1204 {
1205     unsigned long  offset;
1206     int i;
1207 
1208     for (i = 0; i < p->n_pdds; i++) {
1209         struct kfd_dev *dev = p->pdds[i]->dev;
1210         struct qcm_process_device *qpd = &p->pdds[i]->qpd;
1211 
1212         if (!dev->cwsr_enabled || qpd->cwsr_kaddr || qpd->cwsr_base)
1213             continue;
1214 
1215         offset = KFD_MMAP_TYPE_RESERVED_MEM | KFD_MMAP_GPU_ID(dev->id);
1216         qpd->tba_addr = (int64_t)vm_mmap(filep, 0,
1217             KFD_CWSR_TBA_TMA_SIZE, PROT_READ | PROT_EXEC,
1218             MAP_SHARED, offset);
1219 
1220         if (IS_ERR_VALUE(qpd->tba_addr)) {
1221             int err = qpd->tba_addr;
1222 
1223             pr_err("Failure to set tba address. error %d.\n", err);
1224             qpd->tba_addr = 0;
1225             qpd->cwsr_kaddr = NULL;
1226             return err;
1227         }
1228 
1229         memcpy(qpd->cwsr_kaddr, dev->cwsr_isa, dev->cwsr_isa_size);
1230 
1231         qpd->tma_addr = qpd->tba_addr + KFD_CWSR_TMA_OFFSET;
1232         pr_debug("set tba :0x%llx, tma:0x%llx, cwsr_kaddr:%p for pqm.\n",
1233             qpd->tba_addr, qpd->tma_addr, qpd->cwsr_kaddr);
1234     }
1235 
1236     return 0;
1237 }
1238 
1239 static int kfd_process_device_init_cwsr_dgpu(struct kfd_process_device *pdd)
1240 {
1241     struct kfd_dev *dev = pdd->dev;
1242     struct qcm_process_device *qpd = &pdd->qpd;
1243     uint32_t flags = KFD_IOC_ALLOC_MEM_FLAGS_GTT
1244             | KFD_IOC_ALLOC_MEM_FLAGS_NO_SUBSTITUTE
1245             | KFD_IOC_ALLOC_MEM_FLAGS_EXECUTABLE;
1246     struct kgd_mem *mem;
1247     void *kaddr;
1248     int ret;
1249 
1250     if (!dev->cwsr_enabled || qpd->cwsr_kaddr || !qpd->cwsr_base)
1251         return 0;
1252 
1253     /* cwsr_base is only set for dGPU */
1254     ret = kfd_process_alloc_gpuvm(pdd, qpd->cwsr_base,
1255                       KFD_CWSR_TBA_TMA_SIZE, flags, &mem, &kaddr);
1256     if (ret)
1257         return ret;
1258 
1259     qpd->cwsr_mem = mem;
1260     qpd->cwsr_kaddr = kaddr;
1261     qpd->tba_addr = qpd->cwsr_base;
1262 
1263     memcpy(qpd->cwsr_kaddr, dev->cwsr_isa, dev->cwsr_isa_size);
1264 
1265     qpd->tma_addr = qpd->tba_addr + KFD_CWSR_TMA_OFFSET;
1266     pr_debug("set tba :0x%llx, tma:0x%llx, cwsr_kaddr:%p for pqm.\n",
1267          qpd->tba_addr, qpd->tma_addr, qpd->cwsr_kaddr);
1268 
1269     return 0;
1270 }
1271 
1272 static void kfd_process_device_destroy_cwsr_dgpu(struct kfd_process_device *pdd)
1273 {
1274     struct kfd_dev *dev = pdd->dev;
1275     struct qcm_process_device *qpd = &pdd->qpd;
1276 
1277     if (!dev->cwsr_enabled || !qpd->cwsr_kaddr || !qpd->cwsr_base)
1278         return;
1279 
1280     kfd_process_free_gpuvm(qpd->cwsr_mem, pdd, qpd->cwsr_kaddr);
1281 }
1282 
1283 void kfd_process_set_trap_handler(struct qcm_process_device *qpd,
1284                   uint64_t tba_addr,
1285                   uint64_t tma_addr)
1286 {
1287     if (qpd->cwsr_kaddr) {
1288         /* KFD trap handler is bound, record as second-level TBA/TMA
1289          * in first-level TMA. First-level trap will jump to second.
1290          */
1291         uint64_t *tma =
1292             (uint64_t *)(qpd->cwsr_kaddr + KFD_CWSR_TMA_OFFSET);
1293         tma[0] = tba_addr;
1294         tma[1] = tma_addr;
1295     } else {
1296         /* No trap handler bound, bind as first-level TBA/TMA. */
1297         qpd->tba_addr = tba_addr;
1298         qpd->tma_addr = tma_addr;
1299     }
1300 }
1301 
1302 bool kfd_process_xnack_mode(struct kfd_process *p, bool supported)
1303 {
1304     int i;
1305 
1306     /* On most GFXv9 GPUs, the retry mode in the SQ must match the
1307      * boot time retry setting. Mixing processes with different
1308      * XNACK/retry settings can hang the GPU.
1309      *
1310      * Different GPUs can have different noretry settings depending
1311      * on HW bugs or limitations. We need to find at least one
1312      * XNACK mode for this process that's compatible with all GPUs.
1313      * Fortunately GPUs with retry enabled (noretry=0) can run code
1314      * built for XNACK-off. On GFXv9 it may perform slower.
1315      *
1316      * Therefore applications built for XNACK-off can always be
1317      * supported and will be our fallback if any GPU does not
1318      * support retry.
1319      */
1320     for (i = 0; i < p->n_pdds; i++) {
1321         struct kfd_dev *dev = p->pdds[i]->dev;
1322 
1323         /* Only consider GFXv9 and higher GPUs. Older GPUs don't
1324          * support the SVM APIs and don't need to be considered
1325          * for the XNACK mode selection.
1326          */
1327         if (!KFD_IS_SOC15(dev))
1328             continue;
1329         /* Aldebaran can always support XNACK because it can support
1330          * per-process XNACK mode selection. But let the dev->noretry
1331          * setting still influence the default XNACK mode.
1332          */
1333         if (supported && KFD_GC_VERSION(dev) == IP_VERSION(9, 4, 2))
1334             continue;
1335 
1336         /* GFXv10 and later GPUs do not support shader preemption
1337          * during page faults. This can lead to poor QoS for queue
1338          * management and memory-manager-related preemptions or
1339          * even deadlocks.
1340          */
1341         if (KFD_GC_VERSION(dev) >= IP_VERSION(10, 1, 1))
1342             return false;
1343 
1344         if (dev->noretry)
1345             return false;
1346     }
1347 
1348     return true;
1349 }
1350 
1351 /*
1352  * On return the kfd_process is fully operational and will be freed when the
1353  * mm is released
1354  */
1355 static struct kfd_process *create_process(const struct task_struct *thread)
1356 {
1357     struct kfd_process *process;
1358     struct mmu_notifier *mn;
1359     int err = -ENOMEM;
1360 
1361     process = kzalloc(sizeof(*process), GFP_KERNEL);
1362     if (!process)
1363         goto err_alloc_process;
1364 
1365     kref_init(&process->ref);
1366     mutex_init(&process->mutex);
1367     process->mm = thread->mm;
1368     process->lead_thread = thread->group_leader;
1369     process->n_pdds = 0;
1370     process->queues_paused = false;
1371     INIT_DELAYED_WORK(&process->eviction_work, evict_process_worker);
1372     INIT_DELAYED_WORK(&process->restore_work, restore_process_worker);
1373     process->last_restore_timestamp = get_jiffies_64();
1374     err = kfd_event_init_process(process);
1375     if (err)
1376         goto err_event_init;
1377     process->is_32bit_user_mode = in_compat_syscall();
1378 
1379     process->pasid = kfd_pasid_alloc();
1380     if (process->pasid == 0) {
1381         err = -ENOSPC;
1382         goto err_alloc_pasid;
1383     }
1384 
1385     err = pqm_init(&process->pqm, process);
1386     if (err != 0)
1387         goto err_process_pqm_init;
1388 
1389     /* init process apertures*/
1390     err = kfd_init_apertures(process);
1391     if (err != 0)
1392         goto err_init_apertures;
1393 
1394     /* Check XNACK support after PDDs are created in kfd_init_apertures */
1395     process->xnack_enabled = kfd_process_xnack_mode(process, false);
1396 
1397     err = svm_range_list_init(process);
1398     if (err)
1399         goto err_init_svm_range_list;
1400 
1401     /* alloc_notifier needs to find the process in the hash table */
1402     hash_add_rcu(kfd_processes_table, &process->kfd_processes,
1403             (uintptr_t)process->mm);
1404 
1405     /* Avoid free_notifier to start kfd_process_wq_release if
1406      * mmu_notifier_get failed because of pending signal.
1407      */
1408     kref_get(&process->ref);
1409 
1410     /* MMU notifier registration must be the last call that can fail
1411      * because after this point we cannot unwind the process creation.
1412      * After this point, mmu_notifier_put will trigger the cleanup by
1413      * dropping the last process reference in the free_notifier.
1414      */
1415     mn = mmu_notifier_get(&kfd_process_mmu_notifier_ops, process->mm);
1416     if (IS_ERR(mn)) {
1417         err = PTR_ERR(mn);
1418         goto err_register_notifier;
1419     }
1420     BUG_ON(mn != &process->mmu_notifier);
1421 
1422     kfd_unref_process(process);
1423     get_task_struct(process->lead_thread);
1424 
1425     return process;
1426 
1427 err_register_notifier:
1428     hash_del_rcu(&process->kfd_processes);
1429     svm_range_list_fini(process);
1430 err_init_svm_range_list:
1431     kfd_process_free_outstanding_kfd_bos(process);
1432     kfd_process_destroy_pdds(process);
1433 err_init_apertures:
1434     pqm_uninit(&process->pqm);
1435 err_process_pqm_init:
1436     kfd_pasid_free(process->pasid);
1437 err_alloc_pasid:
1438     kfd_event_free_process(process);
1439 err_event_init:
1440     mutex_destroy(&process->mutex);
1441     kfree(process);
1442 err_alloc_process:
1443     return ERR_PTR(err);
1444 }
1445 
1446 static int init_doorbell_bitmap(struct qcm_process_device *qpd,
1447             struct kfd_dev *dev)
1448 {
1449     unsigned int i;
1450     int range_start = dev->shared_resources.non_cp_doorbells_start;
1451     int range_end = dev->shared_resources.non_cp_doorbells_end;
1452 
1453     if (!KFD_IS_SOC15(dev))
1454         return 0;
1455 
1456     qpd->doorbell_bitmap = bitmap_zalloc(KFD_MAX_NUM_OF_QUEUES_PER_PROCESS,
1457                          GFP_KERNEL);
1458     if (!qpd->doorbell_bitmap)
1459         return -ENOMEM;
1460 
1461     /* Mask out doorbells reserved for SDMA, IH, and VCN on SOC15. */
1462     pr_debug("reserved doorbell 0x%03x - 0x%03x\n", range_start, range_end);
1463     pr_debug("reserved doorbell 0x%03x - 0x%03x\n",
1464             range_start + KFD_QUEUE_DOORBELL_MIRROR_OFFSET,
1465             range_end + KFD_QUEUE_DOORBELL_MIRROR_OFFSET);
1466 
1467     for (i = 0; i < KFD_MAX_NUM_OF_QUEUES_PER_PROCESS / 2; i++) {
1468         if (i >= range_start && i <= range_end) {
1469             __set_bit(i, qpd->doorbell_bitmap);
1470             __set_bit(i + KFD_QUEUE_DOORBELL_MIRROR_OFFSET,
1471                   qpd->doorbell_bitmap);
1472         }
1473     }
1474 
1475     return 0;
1476 }
1477 
1478 struct kfd_process_device *kfd_get_process_device_data(struct kfd_dev *dev,
1479                             struct kfd_process *p)
1480 {
1481     int i;
1482 
1483     for (i = 0; i < p->n_pdds; i++)
1484         if (p->pdds[i]->dev == dev)
1485             return p->pdds[i];
1486 
1487     return NULL;
1488 }
1489 
1490 struct kfd_process_device *kfd_create_process_device_data(struct kfd_dev *dev,
1491                             struct kfd_process *p)
1492 {
1493     struct kfd_process_device *pdd = NULL;
1494     int retval = 0;
1495 
1496     if (WARN_ON_ONCE(p->n_pdds >= MAX_GPU_INSTANCE))
1497         return NULL;
1498     pdd = kzalloc(sizeof(*pdd), GFP_KERNEL);
1499     if (!pdd)
1500         return NULL;
1501 
1502     if (kfd_alloc_process_doorbells(dev, &pdd->doorbell_index) < 0) {
1503         pr_err("Failed to alloc doorbell for pdd\n");
1504         goto err_free_pdd;
1505     }
1506 
1507     if (init_doorbell_bitmap(&pdd->qpd, dev)) {
1508         pr_err("Failed to init doorbell for process\n");
1509         goto err_free_pdd;
1510     }
1511 
1512     pdd->dev = dev;
1513     INIT_LIST_HEAD(&pdd->qpd.queues_list);
1514     INIT_LIST_HEAD(&pdd->qpd.priv_queue_list);
1515     pdd->qpd.dqm = dev->dqm;
1516     pdd->qpd.pqm = &p->pqm;
1517     pdd->qpd.evicted = 0;
1518     pdd->qpd.mapped_gws_queue = false;
1519     pdd->process = p;
1520     pdd->bound = PDD_UNBOUND;
1521     pdd->already_dequeued = false;
1522     pdd->runtime_inuse = false;
1523     pdd->vram_usage = 0;
1524     pdd->sdma_past_activity_counter = 0;
1525     pdd->user_gpu_id = dev->id;
1526     atomic64_set(&pdd->evict_duration_counter, 0);
1527 
1528     if (dev->shared_resources.enable_mes) {
1529         retval = amdgpu_amdkfd_alloc_gtt_mem(dev->adev,
1530                         AMDGPU_MES_PROC_CTX_SIZE,
1531                         &pdd->proc_ctx_bo,
1532                         &pdd->proc_ctx_gpu_addr,
1533                         &pdd->proc_ctx_cpu_ptr,
1534                         false);
1535         if (retval) {
1536             pr_err("failed to allocate process context bo\n");
1537             goto err_free_pdd;
1538         }
1539         memset(pdd->proc_ctx_cpu_ptr, 0, AMDGPU_MES_PROC_CTX_SIZE);
1540     }
1541 
1542     p->pdds[p->n_pdds++] = pdd;
1543 
1544     /* Init idr used for memory handle translation */
1545     idr_init(&pdd->alloc_idr);
1546 
1547     return pdd;
1548 
1549 err_free_pdd:
1550     kfree(pdd);
1551     return NULL;
1552 }
1553 
1554 /**
1555  * kfd_process_device_init_vm - Initialize a VM for a process-device
1556  *
1557  * @pdd: The process-device
1558  * @drm_file: Optional pointer to a DRM file descriptor
1559  *
1560  * If @drm_file is specified, it will be used to acquire the VM from
1561  * that file descriptor. If successful, the @pdd takes ownership of
1562  * the file descriptor.
1563  *
1564  * If @drm_file is NULL, a new VM is created.
1565  *
1566  * Returns 0 on success, -errno on failure.
1567  */
1568 int kfd_process_device_init_vm(struct kfd_process_device *pdd,
1569                    struct file *drm_file)
1570 {
1571     struct kfd_process *p;
1572     struct kfd_dev *dev;
1573     int ret;
1574 
1575     if (!drm_file)
1576         return -EINVAL;
1577 
1578     if (pdd->drm_priv)
1579         return -EBUSY;
1580 
1581     p = pdd->process;
1582     dev = pdd->dev;
1583 
1584     ret = amdgpu_amdkfd_gpuvm_acquire_process_vm(
1585         dev->adev, drm_file, p->pasid,
1586         &p->kgd_process_info, &p->ef);
1587     if (ret) {
1588         pr_err("Failed to create process VM object\n");
1589         return ret;
1590     }
1591     pdd->drm_priv = drm_file->private_data;
1592     atomic64_set(&pdd->tlb_seq, 0);
1593 
1594     ret = kfd_process_device_reserve_ib_mem(pdd);
1595     if (ret)
1596         goto err_reserve_ib_mem;
1597     ret = kfd_process_device_init_cwsr_dgpu(pdd);
1598     if (ret)
1599         goto err_init_cwsr;
1600 
1601     pdd->drm_file = drm_file;
1602 
1603     return 0;
1604 
1605 err_init_cwsr:
1606 err_reserve_ib_mem:
1607     kfd_process_device_free_bos(pdd);
1608     pdd->drm_priv = NULL;
1609 
1610     return ret;
1611 }
1612 
1613 /*
1614  * Direct the IOMMU to bind the process (specifically the pasid->mm)
1615  * to the device.
1616  * Unbinding occurs when the process dies or the device is removed.
1617  *
1618  * Assumes that the process lock is held.
1619  */
1620 struct kfd_process_device *kfd_bind_process_to_device(struct kfd_dev *dev,
1621                             struct kfd_process *p)
1622 {
1623     struct kfd_process_device *pdd;
1624     int err;
1625 
1626     pdd = kfd_get_process_device_data(dev, p);
1627     if (!pdd) {
1628         pr_err("Process device data doesn't exist\n");
1629         return ERR_PTR(-ENOMEM);
1630     }
1631 
1632     if (!pdd->drm_priv)
1633         return ERR_PTR(-ENODEV);
1634 
1635     /*
1636      * signal runtime-pm system to auto resume and prevent
1637      * further runtime suspend once device pdd is created until
1638      * pdd is destroyed.
1639      */
1640     if (!pdd->runtime_inuse) {
1641         err = pm_runtime_get_sync(dev->ddev->dev);
1642         if (err < 0) {
1643             pm_runtime_put_autosuspend(dev->ddev->dev);
1644             return ERR_PTR(err);
1645         }
1646     }
1647 
1648     err = kfd_iommu_bind_process_to_device(pdd);
1649     if (err)
1650         goto out;
1651 
1652     /*
1653      * make sure that runtime_usage counter is incremented just once
1654      * per pdd
1655      */
1656     pdd->runtime_inuse = true;
1657 
1658     return pdd;
1659 
1660 out:
1661     /* balance runpm reference count and exit with error */
1662     if (!pdd->runtime_inuse) {
1663         pm_runtime_mark_last_busy(dev->ddev->dev);
1664         pm_runtime_put_autosuspend(dev->ddev->dev);
1665     }
1666 
1667     return ERR_PTR(err);
1668 }
1669 
1670 /* Create specific handle mapped to mem from process local memory idr
1671  * Assumes that the process lock is held.
1672  */
1673 int kfd_process_device_create_obj_handle(struct kfd_process_device *pdd,
1674                     void *mem)
1675 {
1676     return idr_alloc(&pdd->alloc_idr, mem, 0, 0, GFP_KERNEL);
1677 }
1678 
1679 /* Translate specific handle from process local memory idr
1680  * Assumes that the process lock is held.
1681  */
1682 void *kfd_process_device_translate_handle(struct kfd_process_device *pdd,
1683                     int handle)
1684 {
1685     if (handle < 0)
1686         return NULL;
1687 
1688     return idr_find(&pdd->alloc_idr, handle);
1689 }
1690 
1691 /* Remove specific handle from process local memory idr
1692  * Assumes that the process lock is held.
1693  */
1694 void kfd_process_device_remove_obj_handle(struct kfd_process_device *pdd,
1695                     int handle)
1696 {
1697     if (handle >= 0)
1698         idr_remove(&pdd->alloc_idr, handle);
1699 }
1700 
1701 /* This increments the process->ref counter. */
1702 struct kfd_process *kfd_lookup_process_by_pasid(u32 pasid)
1703 {
1704     struct kfd_process *p, *ret_p = NULL;
1705     unsigned int temp;
1706 
1707     int idx = srcu_read_lock(&kfd_processes_srcu);
1708 
1709     hash_for_each_rcu(kfd_processes_table, temp, p, kfd_processes) {
1710         if (p->pasid == pasid) {
1711             kref_get(&p->ref);
1712             ret_p = p;
1713             break;
1714         }
1715     }
1716 
1717     srcu_read_unlock(&kfd_processes_srcu, idx);
1718 
1719     return ret_p;
1720 }
1721 
1722 /* This increments the process->ref counter. */
1723 struct kfd_process *kfd_lookup_process_by_mm(const struct mm_struct *mm)
1724 {
1725     struct kfd_process *p;
1726 
1727     int idx = srcu_read_lock(&kfd_processes_srcu);
1728 
1729     p = find_process_by_mm(mm);
1730     if (p)
1731         kref_get(&p->ref);
1732 
1733     srcu_read_unlock(&kfd_processes_srcu, idx);
1734 
1735     return p;
1736 }
1737 
1738 /* kfd_process_evict_queues - Evict all user queues of a process
1739  *
1740  * Eviction is reference-counted per process-device. This means multiple
1741  * evictions from different sources can be nested safely.
1742  */
1743 int kfd_process_evict_queues(struct kfd_process *p, uint32_t trigger)
1744 {
1745     int r = 0;
1746     int i;
1747     unsigned int n_evicted = 0;
1748 
1749     for (i = 0; i < p->n_pdds; i++) {
1750         struct kfd_process_device *pdd = p->pdds[i];
1751 
1752         kfd_smi_event_queue_eviction(pdd->dev, p->lead_thread->pid,
1753                          trigger);
1754 
1755         r = pdd->dev->dqm->ops.evict_process_queues(pdd->dev->dqm,
1756                                 &pdd->qpd);
1757         /* evict return -EIO if HWS is hang or asic is resetting, in this case
1758          * we would like to set all the queues to be in evicted state to prevent
1759          * them been add back since they actually not be saved right now.
1760          */
1761         if (r && r != -EIO) {
1762             pr_err("Failed to evict process queues\n");
1763             goto fail;
1764         }
1765         n_evicted++;
1766     }
1767 
1768     return r;
1769 
1770 fail:
1771     /* To keep state consistent, roll back partial eviction by
1772      * restoring queues
1773      */
1774     for (i = 0; i < p->n_pdds; i++) {
1775         struct kfd_process_device *pdd = p->pdds[i];
1776 
1777         if (n_evicted == 0)
1778             break;
1779 
1780         kfd_smi_event_queue_restore(pdd->dev, p->lead_thread->pid);
1781 
1782         if (pdd->dev->dqm->ops.restore_process_queues(pdd->dev->dqm,
1783                                   &pdd->qpd))
1784             pr_err("Failed to restore queues\n");
1785 
1786         n_evicted--;
1787     }
1788 
1789     return r;
1790 }
1791 
1792 /* kfd_process_restore_queues - Restore all user queues of a process */
1793 int kfd_process_restore_queues(struct kfd_process *p)
1794 {
1795     int r, ret = 0;
1796     int i;
1797 
1798     for (i = 0; i < p->n_pdds; i++) {
1799         struct kfd_process_device *pdd = p->pdds[i];
1800 
1801         kfd_smi_event_queue_restore(pdd->dev, p->lead_thread->pid);
1802 
1803         r = pdd->dev->dqm->ops.restore_process_queues(pdd->dev->dqm,
1804                                   &pdd->qpd);
1805         if (r) {
1806             pr_err("Failed to restore process queues\n");
1807             if (!ret)
1808                 ret = r;
1809         }
1810     }
1811 
1812     return ret;
1813 }
1814 
1815 int kfd_process_gpuidx_from_gpuid(struct kfd_process *p, uint32_t gpu_id)
1816 {
1817     int i;
1818 
1819     for (i = 0; i < p->n_pdds; i++)
1820         if (p->pdds[i] && gpu_id == p->pdds[i]->user_gpu_id)
1821             return i;
1822     return -EINVAL;
1823 }
1824 
1825 int
1826 kfd_process_gpuid_from_adev(struct kfd_process *p, struct amdgpu_device *adev,
1827                uint32_t *gpuid, uint32_t *gpuidx)
1828 {
1829     int i;
1830 
1831     for (i = 0; i < p->n_pdds; i++)
1832         if (p->pdds[i] && p->pdds[i]->dev->adev == adev) {
1833             *gpuid = p->pdds[i]->user_gpu_id;
1834             *gpuidx = i;
1835             return 0;
1836         }
1837     return -EINVAL;
1838 }
1839 
1840 static void evict_process_worker(struct work_struct *work)
1841 {
1842     int ret;
1843     struct kfd_process *p;
1844     struct delayed_work *dwork;
1845 
1846     dwork = to_delayed_work(work);
1847 
1848     /* Process termination destroys this worker thread. So during the
1849      * lifetime of this thread, kfd_process p will be valid
1850      */
1851     p = container_of(dwork, struct kfd_process, eviction_work);
1852     WARN_ONCE(p->last_eviction_seqno != p->ef->seqno,
1853           "Eviction fence mismatch\n");
1854 
1855     /* Narrow window of overlap between restore and evict work
1856      * item is possible. Once amdgpu_amdkfd_gpuvm_restore_process_bos
1857      * unreserves KFD BOs, it is possible to evicted again. But
1858      * restore has few more steps of finish. So lets wait for any
1859      * previous restore work to complete
1860      */
1861     flush_delayed_work(&p->restore_work);
1862 
1863     pr_debug("Started evicting pasid 0x%x\n", p->pasid);
1864     ret = kfd_process_evict_queues(p, KFD_QUEUE_EVICTION_TRIGGER_TTM);
1865     if (!ret) {
1866         dma_fence_signal(p->ef);
1867         dma_fence_put(p->ef);
1868         p->ef = NULL;
1869         queue_delayed_work(kfd_restore_wq, &p->restore_work,
1870                 msecs_to_jiffies(PROCESS_RESTORE_TIME_MS));
1871 
1872         pr_debug("Finished evicting pasid 0x%x\n", p->pasid);
1873     } else
1874         pr_err("Failed to evict queues of pasid 0x%x\n", p->pasid);
1875 }
1876 
1877 static void restore_process_worker(struct work_struct *work)
1878 {
1879     struct delayed_work *dwork;
1880     struct kfd_process *p;
1881     int ret = 0;
1882 
1883     dwork = to_delayed_work(work);
1884 
1885     /* Process termination destroys this worker thread. So during the
1886      * lifetime of this thread, kfd_process p will be valid
1887      */
1888     p = container_of(dwork, struct kfd_process, restore_work);
1889     pr_debug("Started restoring pasid 0x%x\n", p->pasid);
1890 
1891     /* Setting last_restore_timestamp before successful restoration.
1892      * Otherwise this would have to be set by KGD (restore_process_bos)
1893      * before KFD BOs are unreserved. If not, the process can be evicted
1894      * again before the timestamp is set.
1895      * If restore fails, the timestamp will be set again in the next
1896      * attempt. This would mean that the minimum GPU quanta would be
1897      * PROCESS_ACTIVE_TIME_MS - (time to execute the following two
1898      * functions)
1899      */
1900 
1901     p->last_restore_timestamp = get_jiffies_64();
1902     ret = amdgpu_amdkfd_gpuvm_restore_process_bos(p->kgd_process_info,
1903                              &p->ef);
1904     if (ret) {
1905         pr_debug("Failed to restore BOs of pasid 0x%x, retry after %d ms\n",
1906              p->pasid, PROCESS_BACK_OFF_TIME_MS);
1907         ret = queue_delayed_work(kfd_restore_wq, &p->restore_work,
1908                 msecs_to_jiffies(PROCESS_BACK_OFF_TIME_MS));
1909         WARN(!ret, "reschedule restore work failed\n");
1910         return;
1911     }
1912 
1913     ret = kfd_process_restore_queues(p);
1914     if (!ret)
1915         pr_debug("Finished restoring pasid 0x%x\n", p->pasid);
1916     else
1917         pr_err("Failed to restore queues of pasid 0x%x\n", p->pasid);
1918 }
1919 
1920 void kfd_suspend_all_processes(void)
1921 {
1922     struct kfd_process *p;
1923     unsigned int temp;
1924     int idx = srcu_read_lock(&kfd_processes_srcu);
1925 
1926     WARN(debug_evictions, "Evicting all processes");
1927     hash_for_each_rcu(kfd_processes_table, temp, p, kfd_processes) {
1928         cancel_delayed_work_sync(&p->eviction_work);
1929         cancel_delayed_work_sync(&p->restore_work);
1930 
1931         if (kfd_process_evict_queues(p, KFD_QUEUE_EVICTION_TRIGGER_SUSPEND))
1932             pr_err("Failed to suspend process 0x%x\n", p->pasid);
1933         dma_fence_signal(p->ef);
1934         dma_fence_put(p->ef);
1935         p->ef = NULL;
1936     }
1937     srcu_read_unlock(&kfd_processes_srcu, idx);
1938 }
1939 
1940 int kfd_resume_all_processes(void)
1941 {
1942     struct kfd_process *p;
1943     unsigned int temp;
1944     int ret = 0, idx = srcu_read_lock(&kfd_processes_srcu);
1945 
1946     hash_for_each_rcu(kfd_processes_table, temp, p, kfd_processes) {
1947         if (!queue_delayed_work(kfd_restore_wq, &p->restore_work, 0)) {
1948             pr_err("Restore process %d failed during resume\n",
1949                    p->pasid);
1950             ret = -EFAULT;
1951         }
1952     }
1953     srcu_read_unlock(&kfd_processes_srcu, idx);
1954     return ret;
1955 }
1956 
1957 int kfd_reserved_mem_mmap(struct kfd_dev *dev, struct kfd_process *process,
1958               struct vm_area_struct *vma)
1959 {
1960     struct kfd_process_device *pdd;
1961     struct qcm_process_device *qpd;
1962 
1963     if ((vma->vm_end - vma->vm_start) != KFD_CWSR_TBA_TMA_SIZE) {
1964         pr_err("Incorrect CWSR mapping size.\n");
1965         return -EINVAL;
1966     }
1967 
1968     pdd = kfd_get_process_device_data(dev, process);
1969     if (!pdd)
1970         return -EINVAL;
1971     qpd = &pdd->qpd;
1972 
1973     qpd->cwsr_kaddr = (void *)__get_free_pages(GFP_KERNEL | __GFP_ZERO,
1974                     get_order(KFD_CWSR_TBA_TMA_SIZE));
1975     if (!qpd->cwsr_kaddr) {
1976         pr_err("Error allocating per process CWSR buffer.\n");
1977         return -ENOMEM;
1978     }
1979 
1980     vma->vm_flags |= VM_IO | VM_DONTCOPY | VM_DONTEXPAND
1981         | VM_NORESERVE | VM_DONTDUMP | VM_PFNMAP;
1982     /* Mapping pages to user process */
1983     return remap_pfn_range(vma, vma->vm_start,
1984                    PFN_DOWN(__pa(qpd->cwsr_kaddr)),
1985                    KFD_CWSR_TBA_TMA_SIZE, vma->vm_page_prot);
1986 }
1987 
1988 void kfd_flush_tlb(struct kfd_process_device *pdd, enum TLB_FLUSH_TYPE type)
1989 {
1990     struct amdgpu_vm *vm = drm_priv_to_vm(pdd->drm_priv);
1991     uint64_t tlb_seq = amdgpu_vm_tlb_seq(vm);
1992     struct kfd_dev *dev = pdd->dev;
1993 
1994     /*
1995      * It can be that we race and lose here, but that is extremely unlikely
1996      * and the worst thing which could happen is that we flush the changes
1997      * into the TLB once more which is harmless.
1998      */
1999     if (atomic64_xchg(&pdd->tlb_seq, tlb_seq) == tlb_seq)
2000         return;
2001 
2002     if (dev->dqm->sched_policy == KFD_SCHED_POLICY_NO_HWS) {
2003         /* Nothing to flush until a VMID is assigned, which
2004          * only happens when the first queue is created.
2005          */
2006         if (pdd->qpd.vmid)
2007             amdgpu_amdkfd_flush_gpu_tlb_vmid(dev->adev,
2008                             pdd->qpd.vmid);
2009     } else {
2010         amdgpu_amdkfd_flush_gpu_tlb_pasid(dev->adev,
2011                     pdd->process->pasid, type);
2012     }
2013 }
2014 
2015 struct kfd_process_device *kfd_process_device_data_by_id(struct kfd_process *p, uint32_t gpu_id)
2016 {
2017     int i;
2018 
2019     if (gpu_id) {
2020         for (i = 0; i < p->n_pdds; i++) {
2021             struct kfd_process_device *pdd = p->pdds[i];
2022 
2023             if (pdd->user_gpu_id == gpu_id)
2024                 return pdd;
2025         }
2026     }
2027     return NULL;
2028 }
2029 
2030 int kfd_process_get_user_gpu_id(struct kfd_process *p, uint32_t actual_gpu_id)
2031 {
2032     int i;
2033 
2034     if (!actual_gpu_id)
2035         return 0;
2036 
2037     for (i = 0; i < p->n_pdds; i++) {
2038         struct kfd_process_device *pdd = p->pdds[i];
2039 
2040         if (pdd->dev->id == actual_gpu_id)
2041             return pdd->user_gpu_id;
2042     }
2043     return -EINVAL;
2044 }
2045 
2046 #if defined(CONFIG_DEBUG_FS)
2047 
2048 int kfd_debugfs_mqds_by_process(struct seq_file *m, void *data)
2049 {
2050     struct kfd_process *p;
2051     unsigned int temp;
2052     int r = 0;
2053 
2054     int idx = srcu_read_lock(&kfd_processes_srcu);
2055 
2056     hash_for_each_rcu(kfd_processes_table, temp, p, kfd_processes) {
2057         seq_printf(m, "Process %d PASID 0x%x:\n",
2058                p->lead_thread->tgid, p->pasid);
2059 
2060         mutex_lock(&p->mutex);
2061         r = pqm_debugfs_mqds(m, &p->pqm);
2062         mutex_unlock(&p->mutex);
2063 
2064         if (r)
2065             break;
2066     }
2067 
2068     srcu_read_unlock(&kfd_processes_srcu, idx);
2069 
2070     return r;
2071 }
2072 
2073 #endif
2074