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;