Commit d1ef9671 authored by Matthew Brost's avatar Matthew Brost Committed by Lucas De Marchi
Browse files

drm/xe: Convert to USM lock to rwsem

parent cb589770
Loading
Loading
Loading
Loading
+1 −3
Original line number Diff line number Diff line
@@ -339,9 +339,7 @@ struct xe_device *xe_device_create(struct pci_dev *pdev,

	init_waitqueue_head(&xe->ufence_wq);

	err = drmm_mutex_init(&xe->drm, &xe->usm.lock);
	if (err)
		goto err;
	init_rwsem(&xe->usm.lock);

	xa_init_flags(&xe->usm.asid_to_vm, XA_FLAGS_ALLOC);

+1 −1
Original line number Diff line number Diff line
@@ -369,7 +369,7 @@ struct xe_device {
		/** @usm.next_asid: next ASID, used to cyclical alloc asids */
		u32 next_asid;
		/** @usm.lock: protects UM state */
		struct mutex lock;
		struct rw_semaphore lock;
	} usm;

	/** @pinned: pinned BO state */
+4 −4
Original line number Diff line number Diff line
@@ -198,13 +198,13 @@ static int handle_pagefault(struct xe_gt *gt, struct pagefault *pf)
		return -EFAULT;

	/* ASID to VM */
	mutex_lock(&xe->usm.lock);
	down_read(&xe->usm.lock);
	vm = xa_load(&xe->usm.asid_to_vm, pf->asid);
	if (vm && xe_vm_in_fault_mode(vm))
		xe_vm_get(vm);
	else
		vm = NULL;
	mutex_unlock(&xe->usm.lock);
	up_read(&xe->usm.lock);
	if (!vm)
		return -EINVAL;

@@ -549,11 +549,11 @@ static int handle_acc(struct xe_gt *gt, struct acc *acc)
		return -EINVAL;

	/* ASID to VM */
	mutex_lock(&xe->usm.lock);
	down_read(&xe->usm.lock);
	vm = xa_load(&xe->usm.asid_to_vm, acc->asid);
	if (vm)
		xe_vm_get(vm);
	mutex_unlock(&xe->usm.lock);
	up_read(&xe->usm.lock);
	if (!vm || !xe_vm_in_fault_mode(vm))
		return -EINVAL;

+4 −4
Original line number Diff line number Diff line
@@ -1613,7 +1613,7 @@ void xe_vm_close_and_put(struct xe_vm *vm)

	up_write(&vm->lock);

	mutex_lock(&xe->usm.lock);
	down_write(&xe->usm.lock);
	if (vm->usm.asid) {
		void *lookup;

@@ -1623,7 +1623,7 @@ void xe_vm_close_and_put(struct xe_vm *vm)
		lookup = xa_erase(&xe->usm.asid_to_vm, vm->usm.asid);
		xe_assert(xe, lookup == vm);
	}
	mutex_unlock(&xe->usm.lock);
	up_write(&xe->usm.lock);

	for_each_tile(tile, xe, id)
		xe_range_fence_tree_fini(&vm->rftree[id]);
@@ -1772,11 +1772,11 @@ int xe_vm_create_ioctl(struct drm_device *dev, void *data,
		goto err_close_and_put;

	if (xe->info.has_asid) {
		mutex_lock(&xe->usm.lock);
		down_write(&xe->usm.lock);
		err = xa_alloc_cyclic(&xe->usm.asid_to_vm, &asid, vm,
				      XA_LIMIT(1, XE_MAX_ASID - 1),
				      &xe->usm.next_asid, GFP_KERNEL);
		mutex_unlock(&xe->usm.lock);
		up_write(&xe->usm.lock);
		if (err < 0)
			goto err_free_id;