|
@@ -433,15 +433,7 @@ static void drm_vm_open(struct vm_area_struct *vma)
|
|
|
mutex_unlock(&dev->struct_mutex);
|
|
|
}
|
|
|
|
|
|
-/**
|
|
|
- * \c close method for all virtual memory types.
|
|
|
- *
|
|
|
- * \param vma virtual memory area.
|
|
|
- *
|
|
|
- * Search the \p vma private data entry in drm_device::vmalist, unlink it, and
|
|
|
- * free it.
|
|
|
- */
|
|
|
-static void drm_vm_close(struct vm_area_struct *vma)
|
|
|
+void drm_vm_close_locked(struct vm_area_struct *vma)
|
|
|
{
|
|
|
struct drm_file *priv = vma->vm_file->private_data;
|
|
|
struct drm_device *dev = priv->minor->dev;
|
|
@@ -451,7 +443,6 @@ static void drm_vm_close(struct vm_area_struct *vma)
|
|
|
vma->vm_start, vma->vm_end - vma->vm_start);
|
|
|
atomic_dec(&dev->vma_count);
|
|
|
|
|
|
- mutex_lock(&dev->struct_mutex);
|
|
|
list_for_each_entry_safe(pt, temp, &dev->vmalist, head) {
|
|
|
if (pt->vma == vma) {
|
|
|
list_del(&pt->head);
|
|
@@ -459,6 +450,23 @@ static void drm_vm_close(struct vm_area_struct *vma)
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * \c close method for all virtual memory types.
|
|
|
+ *
|
|
|
+ * \param vma virtual memory area.
|
|
|
+ *
|
|
|
+ * Search the \p vma private data entry in drm_device::vmalist, unlink it, and
|
|
|
+ * free it.
|
|
|
+ */
|
|
|
+static void drm_vm_close(struct vm_area_struct *vma)
|
|
|
+{
|
|
|
+ struct drm_file *priv = vma->vm_file->private_data;
|
|
|
+ struct drm_device *dev = priv->minor->dev;
|
|
|
+
|
|
|
+ mutex_lock(&dev->struct_mutex);
|
|
|
+ drm_vm_close_locked(vma);
|
|
|
mutex_unlock(&dev->struct_mutex);
|
|
|
}
|
|
|
|