Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 27bf60db authored by Dave Airlie's avatar Dave Airlie
Browse files

Merge tag 'drm-amdkfd-fixes-2016-06-03' of...

Merge tag 'drm-amdkfd-fixes-2016-06-03' of git://people.freedesktop.org/~gabbayo/linux into drm-fixes

* tag 'drm-amdkfd-fixes-2016-06-03' of git://people.freedesktop.org/~gabbayo/linux:
  drm/amdkfd: print once about mem_banks truncation
  drm/amdkfd: destroy dbgmgr in notifier release
  drm/amdkfd: unbind only existing processes
parents 7ff6977b 0fbbbf8b
Loading
Loading
Loading
Loading
+43 −27
Original line number Diff line number Diff line
@@ -242,13 +242,19 @@ static void kfd_process_notifier_release(struct mmu_notifier *mn,
	pqm_uninit(&p->pqm);

	/* Iterate over all process device data structure and check
	 * if we should reset all wavefronts */
	list_for_each_entry(pdd, &p->per_device_data, per_device_list)
	 * if we should delete debug managers and reset all wavefronts
	 */
	list_for_each_entry(pdd, &p->per_device_data, per_device_list) {
		if ((pdd->dev->dbgmgr) &&
				(pdd->dev->dbgmgr->pasid == p->pasid))
			kfd_dbgmgr_destroy(pdd->dev->dbgmgr);

		if (pdd->reset_wavefronts) {
			pr_warn("amdkfd: Resetting all wave fronts\n");
			dbgdev_wave_reset_wavefronts(pdd->dev, p);
			pdd->reset_wavefronts = false;
		}
	}

	mutex_unlock(&p->mutex);

@@ -404,13 +410,17 @@ void kfd_unbind_process_from_device(struct kfd_dev *dev, unsigned int pasid)

	idx = srcu_read_lock(&kfd_processes_srcu);

	/*
	 * Look for the process that matches the pasid. If there is no such
	 * process, we either released it in amdkfd's own notifier, or there
	 * is a bug. Unfortunately, there is no way to tell...
	 */
	hash_for_each_rcu(kfd_processes_table, i, p, kfd_processes)
		if (p->pasid == pasid)
			break;
		if (p->pasid == pasid) {

			srcu_read_unlock(&kfd_processes_srcu, idx);

	BUG_ON(p->pasid != pasid);
			pr_debug("Unbinding process %d from IOMMU\n", pasid);

			mutex_lock(&p->mutex);

@@ -432,14 +442,20 @@ void kfd_unbind_process_from_device(struct kfd_dev *dev, unsigned int pasid)
			}

			/*
	 * Just mark pdd as unbound, because we still need it to call
	 * amd_iommu_unbind_pasid() in when the process exits.
			 * Just mark pdd as unbound, because we still need it
			 * to call amd_iommu_unbind_pasid() in when the
			 * process exits.
			 * We don't call amd_iommu_unbind_pasid() here
			 * because the IOMMU called us.
			 */
			pdd->bound = false;

			mutex_unlock(&p->mutex);

			return;
		}

	srcu_read_unlock(&kfd_processes_srcu, idx);
}

struct kfd_process_device *kfd_get_first_process_device_data(struct kfd_process *p)
+1 −1
Original line number Diff line number Diff line
@@ -666,7 +666,7 @@ static ssize_t node_show(struct kobject *kobj, struct attribute *attr,
			dev->node_props.simd_count);

	if (dev->mem_bank_count < dev->node_props.mem_banks_count) {
		pr_warn("kfd: mem_banks_count truncated from %d to %d\n",
		pr_info_once("kfd: mem_banks_count truncated from %d to %d\n",
				dev->node_props.mem_banks_count,
				dev->mem_bank_count);
		sysfs_show_32bit_prop(buffer, "mem_banks_count",