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 fa...@valinux.com
@@ -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 <jesse.bar...@intel.com>
  */
 #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;

Reply via email to