Module Name: src
Committed By: riastradh
Date: Mon Aug 27 14:14:29 UTC 2018
Modified Files:
src/sys/external/bsd/drm2/dist/drm: drm_auth.c drm_context.c drm_crtc.c
drm_gem.c
src/sys/external/bsd/drm2/dist/drm/amd/amdgpu: amdgpu_bo_list.c
amdgpu_ctx.c
src/sys/external/bsd/drm2/dist/drm/i915: i915_gem.c i915_gem_context.c
src/sys/external/bsd/drm2/dist/drm/sis: sis_mm.c
src/sys/external/bsd/drm2/dist/drm/via: via_mm.c
Log Message:
Sprinkle idr_preload/idr_preload_end.
Try to do these outside all mutex locks.
Tricky case is i915_gem_context, where the struct mutex is held for a
long time.
To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 src/sys/external/bsd/drm2/dist/drm/drm_auth.c
cvs rdiff -u -r1.4 -r1.5 src/sys/external/bsd/drm2/dist/drm/drm_context.c
cvs rdiff -u -r1.8 -r1.9 src/sys/external/bsd/drm2/dist/drm/drm_crtc.c \
src/sys/external/bsd/drm2/dist/drm/drm_gem.c
cvs rdiff -u -r1.3 -r1.4 \
src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_bo_list.c \
src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_ctx.c
cvs rdiff -u -r1.49 -r1.50 src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c
cvs rdiff -u -r1.8 -r1.9 \
src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_context.c
cvs rdiff -u -r1.2 -r1.3 src/sys/external/bsd/drm2/dist/drm/sis/sis_mm.c
cvs rdiff -u -r1.3 -r1.4 src/sys/external/bsd/drm2/dist/drm/via/via_mm.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/external/bsd/drm2/dist/drm/drm_auth.c
diff -u src/sys/external/bsd/drm2/dist/drm/drm_auth.c:1.3 src/sys/external/bsd/drm2/dist/drm/drm_auth.c:1.4
--- src/sys/external/bsd/drm2/dist/drm/drm_auth.c:1.3 Mon Aug 27 04:58:19 2018
+++ src/sys/external/bsd/drm2/dist/drm/drm_auth.c Mon Aug 27 14:14:29 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: drm_auth.c,v 1.3 2018/08/27 04:58:19 riastradh Exp $ */
+/* $NetBSD: drm_auth.c,v 1.4 2018/08/27 14:14:29 riastradh Exp $ */
/*
* Created: Tue Feb 2 08:37:54 1999 by [email protected]
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: drm_auth.c,v 1.3 2018/08/27 04:58:19 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: drm_auth.c,v 1.4 2018/08/27 14:14:29 riastradh Exp $");
#include <drm/drmP.h>
#include "drm_internal.h"
@@ -53,6 +53,7 @@ int drm_getmagic(struct drm_device *dev,
struct drm_auth *auth = data;
int ret = 0;
+ idr_preload(GFP_KERNEL);
mutex_lock(&dev->struct_mutex);
if (!file_priv->magic) {
ret = idr_alloc(&file_priv->master->magic_map, file_priv,
@@ -62,6 +63,7 @@ int drm_getmagic(struct drm_device *dev,
}
auth->magic = file_priv->magic;
mutex_unlock(&dev->struct_mutex);
+ idr_preload_end();
DRM_DEBUG("%u\n", auth->magic);
Index: src/sys/external/bsd/drm2/dist/drm/drm_context.c
diff -u src/sys/external/bsd/drm2/dist/drm/drm_context.c:1.4 src/sys/external/bsd/drm2/dist/drm/drm_context.c:1.5
--- src/sys/external/bsd/drm2/dist/drm/drm_context.c:1.4 Mon Aug 27 04:58:19 2018
+++ src/sys/external/bsd/drm2/dist/drm/drm_context.c Mon Aug 27 14:14:29 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: drm_context.c,v 1.4 2018/08/27 04:58:19 riastradh Exp $ */
+/* $NetBSD: drm_context.c,v 1.5 2018/08/27 14:14:29 riastradh Exp $ */
/*
* Legacy: Generic DRM Contexts
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: drm_context.c,v 1.4 2018/08/27 04:58:19 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: drm_context.c,v 1.5 2018/08/27 14:14:29 riastradh Exp $");
#include <linux/err.h>
@@ -82,10 +82,12 @@ static int drm_legacy_ctxbitmap_next(str
{
int ret;
+ idr_preload(GFP_KERNEL);
mutex_lock(&dev->struct_mutex);
ret = idr_alloc(&dev->ctx_idr, NULL, DRM_RESERVED_CONTEXTS, 0,
GFP_KERNEL);
mutex_unlock(&dev->struct_mutex);
+ idr_preload_end();
return ret;
}
Index: src/sys/external/bsd/drm2/dist/drm/drm_crtc.c
diff -u src/sys/external/bsd/drm2/dist/drm/drm_crtc.c:1.8 src/sys/external/bsd/drm2/dist/drm/drm_crtc.c:1.9
--- src/sys/external/bsd/drm2/dist/drm/drm_crtc.c:1.8 Mon Aug 27 06:55:13 2018
+++ src/sys/external/bsd/drm2/dist/drm/drm_crtc.c Mon Aug 27 14:14:29 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: drm_crtc.c,v 1.8 2018/08/27 06:55:13 riastradh Exp $ */
+/* $NetBSD: drm_crtc.c,v 1.9 2018/08/27 14:14:29 riastradh Exp $ */
/*
* Copyright (c) 2006-2008 Intel Corporation
@@ -32,7 +32,7 @@
* Jesse Barnes <[email protected]>
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: drm_crtc.c,v 1.8 2018/08/27 06:55:13 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: drm_crtc.c,v 1.9 2018/08/27 14:14:29 riastradh Exp $");
#include <linux/err.h>
#include <linux/spinlock.h>
@@ -5987,6 +5987,7 @@ struct drm_tile_group *drm_mode_create_t
memcpy(tg->group_data, topology, 8);
tg->dev = dev;
+ idr_preload(GFP_KERNEL);
mutex_lock(&dev->mode_config.idr_mutex);
ret = idr_alloc(&dev->mode_config.tile_idr, tg, 1, 0, GFP_KERNEL);
if (ret >= 0) {
@@ -5997,6 +5998,7 @@ struct drm_tile_group *drm_mode_create_t
}
mutex_unlock(&dev->mode_config.idr_mutex);
+ idr_preload_end();
return tg;
}
EXPORT_SYMBOL(drm_mode_create_tile_group);
Index: src/sys/external/bsd/drm2/dist/drm/drm_gem.c
diff -u src/sys/external/bsd/drm2/dist/drm/drm_gem.c:1.8 src/sys/external/bsd/drm2/dist/drm/drm_gem.c:1.9
--- src/sys/external/bsd/drm2/dist/drm/drm_gem.c:1.8 Mon Aug 27 07:19:01 2018
+++ src/sys/external/bsd/drm2/dist/drm/drm_gem.c Mon Aug 27 14:14:29 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: drm_gem.c,v 1.8 2018/08/27 07:19:01 riastradh Exp $ */
+/* $NetBSD: drm_gem.c,v 1.9 2018/08/27 14:14:29 riastradh Exp $ */
/*
* Copyright © 2008 Intel Corporation
@@ -28,7 +28,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: drm_gem.c,v 1.8 2018/08/27 07:19:01 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: drm_gem.c,v 1.9 2018/08/27 14:14:29 riastradh Exp $");
#include <linux/types.h>
#include <linux/slab.h>
@@ -723,8 +723,8 @@ drm_gem_flink_ioctl(struct drm_device *d
if (obj == NULL)
return -ENOENT;
- mutex_lock(&dev->object_name_lock);
idr_preload(GFP_KERNEL);
+ mutex_lock(&dev->object_name_lock);
/* prevent races with concurrent gem_close. */
if (obj->handle_count == 0) {
ret = -ENOENT;
@@ -743,8 +743,8 @@ drm_gem_flink_ioctl(struct drm_device *d
ret = 0;
err:
- idr_preload_end();
mutex_unlock(&dev->object_name_lock);
+ idr_preload_end();
drm_gem_object_unreference_unlocked(obj);
return ret;
}
Index: src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_bo_list.c
diff -u src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_bo_list.c:1.3 src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_bo_list.c:1.4
--- src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_bo_list.c:1.3 Mon Aug 27 14:04:50 2018
+++ src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_bo_list.c Mon Aug 27 14:14:28 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: amdgpu_bo_list.c,v 1.3 2018/08/27 14:04:50 riastradh Exp $ */
+/* $NetBSD: amdgpu_bo_list.c,v 1.4 2018/08/27 14:14:28 riastradh Exp $ */
/*
* Copyright 2015 Advanced Micro Devices, Inc.
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: amdgpu_bo_list.c,v 1.3 2018/08/27 14:04:50 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: amdgpu_bo_list.c,v 1.4 2018/08/27 14:14:28 riastradh Exp $");
#include <drm/drmP.h>
#include "amdgpu.h"
@@ -47,14 +47,17 @@ static int amdgpu_bo_list_create(struct
if (!*result)
return -ENOMEM;
+ idr_preload(GFP_KERNEL);
mutex_lock(&fpriv->bo_list_lock);
r = idr_alloc(&fpriv->bo_list_handles, *result,
1, 0, GFP_KERNEL);
if (r < 0) {
mutex_unlock(&fpriv->bo_list_lock);
+ idr_preload_end();
kfree(*result);
return r;
}
+ idr_preload_end();
*id = r;
#ifdef __NetBSD__
Index: src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_ctx.c
diff -u src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_ctx.c:1.3 src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_ctx.c:1.4
--- src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_ctx.c:1.3 Mon Aug 27 14:04:50 2018
+++ src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_ctx.c Mon Aug 27 14:14:28 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: amdgpu_ctx.c,v 1.3 2018/08/27 14:04:50 riastradh Exp $ */
+/* $NetBSD: amdgpu_ctx.c,v 1.4 2018/08/27 14:14:28 riastradh Exp $ */
/*
* Copyright 2015 Advanced Micro Devices, Inc.
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: amdgpu_ctx.c,v 1.3 2018/08/27 14:04:50 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: amdgpu_ctx.c,v 1.4 2018/08/27 14:14:28 riastradh Exp $");
#include <drm/drmP.h>
#include "amdgpu.h"
@@ -100,16 +100,19 @@ static int amdgpu_ctx_alloc(struct amdgp
if (!ctx)
return -ENOMEM;
+ idr_preload(GFP_KERNEL);
mutex_lock(&mgr->lock);
r = idr_alloc(&mgr->ctx_handles, ctx, 1, 0, GFP_KERNEL);
if (r < 0) {
mutex_unlock(&mgr->lock);
+ idr_preload_end();
kfree(ctx);
return r;
}
*id = (uint32_t)r;
r = amdgpu_ctx_init(adev, false, ctx);
mutex_unlock(&mgr->lock);
+ idr_preload_end();
return r;
}
Index: src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c:1.49 src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c:1.50
--- src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c:1.49 Mon Aug 27 13:44:29 2018
+++ src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c Mon Aug 27 14:14:29 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: i915_gem.c,v 1.49 2018/08/27 13:44:29 riastradh Exp $ */
+/* $NetBSD: i915_gem.c,v 1.50 2018/08/27 14:14:29 riastradh Exp $ */
/*
* Copyright © 2008-2015 Intel Corporation
@@ -28,7 +28,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: i915_gem.c,v 1.49 2018/08/27 13:44:29 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i915_gem.c,v 1.50 2018/08/27 14:14:29 riastradh Exp $");
#ifdef __NetBSD__
#if 0 /* XXX uvmhist option? */
@@ -5472,6 +5472,7 @@ int i915_gem_init(struct drm_device *dev
i915.enable_execlists = intel_sanitize_enable_execlists(dev,
i915.enable_execlists);
+ idr_preload(GFP_KERNEL); /* gem context */
mutex_lock(&dev->struct_mutex);
if (IS_VALLEYVIEW(dev)) {
@@ -5530,6 +5531,7 @@ int i915_gem_init(struct drm_device *dev
out_unlock:
intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL);
mutex_unlock(&dev->struct_mutex);
+ idr_preload_end();
return ret;
}
Index: src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_context.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_context.c:1.8 src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_context.c:1.9
--- src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_context.c:1.8 Mon Aug 27 06:07:58 2018
+++ src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_context.c Mon Aug 27 14:14:29 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: i915_gem_context.c,v 1.8 2018/08/27 06:07:58 riastradh Exp $ */
+/* $NetBSD: i915_gem_context.c,v 1.9 2018/08/27 14:14:29 riastradh Exp $ */
/*
* Copyright © 2011-2012 Intel Corporation
@@ -88,7 +88,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: i915_gem_context.c,v 1.8 2018/08/27 06:07:58 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i915_gem_context.c,v 1.9 2018/08/27 14:14:29 riastradh Exp $");
#include <linux/err.h>
#include <drm/drmP.h>
@@ -236,10 +236,8 @@ __create_hw_context(struct drm_device *d
/* Default context will never have a file_priv */
if (file_priv != NULL) {
- idr_preload(GFP_KERNEL);
ret = idr_alloc(&file_priv->context_idr, ctx,
DEFAULT_CONTEXT_HANDLE, 0, GFP_KERNEL);
- idr_preload_end();
if (ret < 0)
goto err_out;
} else
@@ -485,9 +483,11 @@ int i915_gem_context_open(struct drm_dev
idr_init(&file_priv->context_idr);
+ idr_preload(GFP_KERNEL);
mutex_lock(&dev->struct_mutex);
ctx = i915_gem_create_context(dev, file_priv);
mutex_unlock(&dev->struct_mutex);
+ idr_preload_end();
if (IS_ERR(ctx)) {
idr_destroy(&file_priv->context_idr);
@@ -865,12 +865,16 @@ int i915_gem_context_create_ioctl(struct
if (!contexts_enabled(dev))
return -ENODEV;
+ idr_preload(GFP_KERNEL);
ret = i915_mutex_lock_interruptible(dev);
- if (ret)
+ if (ret) {
+ idr_preload_end();
return ret;
+ }
ctx = i915_gem_create_context(dev, file_priv);
mutex_unlock(&dev->struct_mutex);
+ idr_preload_end();
if (IS_ERR(ctx))
return PTR_ERR(ctx);
Index: src/sys/external/bsd/drm2/dist/drm/sis/sis_mm.c
diff -u src/sys/external/bsd/drm2/dist/drm/sis/sis_mm.c:1.2 src/sys/external/bsd/drm2/dist/drm/sis/sis_mm.c:1.3
--- src/sys/external/bsd/drm2/dist/drm/sis/sis_mm.c:1.2 Mon Aug 27 04:58:36 2018
+++ src/sys/external/bsd/drm2/dist/drm/sis/sis_mm.c Mon Aug 27 14:14:29 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: sis_mm.c,v 1.2 2018/08/27 04:58:36 riastradh Exp $ */
+/* $NetBSD: sis_mm.c,v 1.3 2018/08/27 14:14:29 riastradh Exp $ */
/**************************************************************************
*
@@ -34,7 +34,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sis_mm.c,v 1.2 2018/08/27 04:58:36 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sis_mm.c,v 1.3 2018/08/27 14:14:29 riastradh Exp $");
#include <drm/drmP.h>
#include <drm/sis_drm.h>
@@ -94,6 +94,7 @@ static int sis_drm_alloc(struct drm_devi
struct sis_file_private *file_priv = file->driver_priv;
unsigned long offset;
+ idr_preload(GFP_KERNEL);
mutex_lock(&dev->struct_mutex);
if (0 == ((pool == 0) ? dev_priv->vram_initialized :
@@ -101,6 +102,7 @@ static int sis_drm_alloc(struct drm_devi
DRM_ERROR
("Attempt to allocate from uninitialized memory manager.\n");
mutex_unlock(&dev->struct_mutex);
+ idr_preload_end();
return -EINVAL;
}
@@ -142,6 +144,7 @@ static int sis_drm_alloc(struct drm_devi
list_add(&item->owner_list, &file_priv->obj_list);
mutex_unlock(&dev->struct_mutex);
+ idr_preload_end();
mem->offset = ((pool == 0) ?
dev_priv->vram_offset : dev_priv->agp_offset) +
@@ -156,6 +159,7 @@ fail_idr:
fail_alloc:
kfree(item);
mutex_unlock(&dev->struct_mutex);
+ idr_preload_end();
mem->offset = 0;
mem->size = 0;
Index: src/sys/external/bsd/drm2/dist/drm/via/via_mm.c
diff -u src/sys/external/bsd/drm2/dist/drm/via/via_mm.c:1.3 src/sys/external/bsd/drm2/dist/drm/via/via_mm.c:1.4
--- src/sys/external/bsd/drm2/dist/drm/via/via_mm.c:1.3 Mon Aug 27 04:58:37 2018
+++ src/sys/external/bsd/drm2/dist/drm/via/via_mm.c Mon Aug 27 14:14:29 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: via_mm.c,v 1.3 2018/08/27 04:58:37 riastradh Exp $ */
+/* $NetBSD: via_mm.c,v 1.4 2018/08/27 14:14:29 riastradh Exp $ */
/*
* Copyright 2006 Tungsten Graphics Inc., Bismarck, ND., USA.
@@ -28,7 +28,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: via_mm.c,v 1.3 2018/08/27 04:58:37 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: via_mm.c,v 1.4 2018/08/27 14:14:29 riastradh Exp $");
#include <drm/drmP.h>
#include <drm/via_drm.h>
@@ -126,12 +126,14 @@ int via_mem_alloc(struct drm_device *dev
DRM_ERROR("Unknown memory type allocation\n");
return -EINVAL;
}
+ idr_preload(GFP_KERNEL);
mutex_lock(&dev->struct_mutex);
if (0 == ((mem->type == VIA_MEM_VIDEO) ? dev_priv->vram_initialized :
dev_priv->agp_initialized)) {
DRM_ERROR
("Attempt to allocate from uninitialized memory manager.\n");
mutex_unlock(&dev->struct_mutex);
+ idr_preload_end();
return -EINVAL;
}
@@ -160,6 +162,7 @@ int via_mem_alloc(struct drm_device *dev
list_add(&item->owner_list, &file_priv->obj_list);
mutex_unlock(&dev->struct_mutex);
+ idr_preload_end();
mem->offset = ((mem->type == VIA_MEM_VIDEO) ?
dev_priv->vram_offset : dev_priv->agp_offset) +
@@ -173,6 +176,7 @@ fail_idr:
fail_alloc:
kfree(item);
mutex_unlock(&dev->struct_mutex);
+ idr_preload_end();
mem->offset = 0;
mem->size = 0;