Module Name: src Committed By: riastradh Date: Mon Aug 27 14:43:15 UTC 2018
Modified Files: src/sys/external/bsd/drm2/dist/drm: drm_irq.c Log Message: Fix scope of locks in drm_handle_vblank. To generate a diff of this commit: cvs rdiff -u -r1.13 -r1.14 src/sys/external/bsd/drm2/dist/drm/drm_irq.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_irq.c diff -u src/sys/external/bsd/drm2/dist/drm/drm_irq.c:1.13 src/sys/external/bsd/drm2/dist/drm/drm_irq.c:1.14 --- src/sys/external/bsd/drm2/dist/drm/drm_irq.c:1.13 Mon Aug 27 14:42:43 2018 +++ src/sys/external/bsd/drm2/dist/drm/drm_irq.c Mon Aug 27 14:43:15 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: drm_irq.c,v 1.13 2018/08/27 14:42:43 riastradh Exp $ */ +/* $NetBSD: drm_irq.c,v 1.14 2018/08/27 14:43:15 riastradh Exp $ */ /* * drm_irq.c IRQ and vblank support @@ -35,7 +35,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: drm_irq.c,v 1.13 2018/08/27 14:42:43 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: drm_irq.c,v 1.14 2018/08/27 14:43:15 riastradh Exp $"); #include <drm/drmP.h> #include "drm_trace.h" @@ -2092,6 +2092,7 @@ bool drm_handle_vblank(struct drm_device return false; spin_lock_irqsave(&dev->event_lock, irqflags); + spin_lock(&dev->vbl_lock); /* Need timestamp lock to prevent concurrent execution with * vblank enable/disable, as this would cause inconsistent @@ -2102,6 +2103,7 @@ bool drm_handle_vblank(struct drm_device /* Vblank irq handling disabled. Nothing to do. */ if (!vblank->enabled) { spin_unlock(&dev->vblank_time_lock); + spin_unlock(&dev->vbl_lock); spin_unlock_irqrestore(&dev->event_lock, irqflags); return false; } @@ -2111,9 +2113,7 @@ bool drm_handle_vblank(struct drm_device spin_unlock(&dev->vblank_time_lock); #ifdef __NetBSD__ - spin_lock(&dev->vbl_lock); DRM_SPIN_WAKEUP_ONE(&vblank->queue, &dev->vbl_lock); - spin_unlock(&dev->vbl_lock); #else wake_up(&vblank->queue); #endif @@ -2127,8 +2127,9 @@ bool drm_handle_vblank(struct drm_device if (dev->vblank_disable_immediate && drm_vblank_offdelay > 0 && !atomic_read(&vblank->refcount)) - vblank_disable_fn((unsigned long)vblank); + vblank_disable_locked(vblank, dev, pipe); + spin_unlock(&dev->vbl_lock); spin_unlock_irqrestore(&dev->event_lock, irqflags); return true;