Module Name: src Committed By: riastradh Date: Sun Dec 26 21:00:14 UTC 2021
Modified Files: src/sys/external/bsd/drm2/dist/drm: drm_vblank.c src/sys/external/bsd/drm2/dist/drm/amd/display/amdgpu_dm: amdgpu_dm.c amdgpu_dm_crc.c src/sys/external/bsd/drm2/dist/drm/nouveau/dispnv50: nouveau_dispnv50_disp.c Log Message: drm: Fix locking around accurate vblank counts. - Make drm_crtc_accurate_vblank_count require the caller to hold the event lock, rather than take it internally. - Fix locking around drm_crtc_accurate_vblank_count and related operations in amdgpu and nouveau interrupt handlers. - Use drm_crtc_vblank_put_locked, not drm_crtc_vblank_put, when we already hold the event lock. PR kern/56557 To generate a diff of this commit: cvs rdiff -u -r1.15 -r1.16 src/sys/external/bsd/drm2/dist/drm/drm_vblank.c cvs rdiff -u -r1.4 -r1.5 \ src/sys/external/bsd/drm2/dist/drm/amd/display/amdgpu_dm/amdgpu_dm.c cvs rdiff -u -r1.2 -r1.3 \ src/sys/external/bsd/drm2/dist/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.c cvs rdiff -u -r1.6 -r1.7 \ src/sys/external/bsd/drm2/dist/drm/nouveau/dispnv50/nouveau_dispnv50_disp.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_vblank.c diff -u src/sys/external/bsd/drm2/dist/drm/drm_vblank.c:1.15 src/sys/external/bsd/drm2/dist/drm/drm_vblank.c:1.16 --- src/sys/external/bsd/drm2/dist/drm/drm_vblank.c:1.15 Sun Dec 19 12:36:31 2021 +++ src/sys/external/bsd/drm2/dist/drm/drm_vblank.c Sun Dec 26 21:00:14 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: drm_vblank.c,v 1.15 2021/12/19 12:36:31 riastradh Exp $ */ +/* $NetBSD: drm_vblank.c,v 1.16 2021/12/26 21:00:14 riastradh Exp $ */ /* * drm_irq.c IRQ and vblank support @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: drm_vblank.c,v 1.15 2021/12/19 12:36:31 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: drm_vblank.c,v 1.16 2021/12/26 21:00:14 riastradh Exp $"); #include <linux/export.h> #include <linux/moduleparam.h> @@ -337,7 +337,7 @@ static u64 drm_vblank_count(struct drm_d * This is mostly useful for hardware that can obtain the scanout position, but * doesn't have a hardware frame counter. */ -static u64 drm_crtc_accurate_vblank_count_locked(struct drm_crtc *crtc) +u64 drm_crtc_accurate_vblank_count(struct drm_crtc *crtc) { struct drm_device *dev = crtc->dev; unsigned int pipe = drm_crtc_index(crtc); @@ -358,17 +358,6 @@ static u64 drm_crtc_accurate_vblank_coun return vblank; } - -u64 drm_crtc_accurate_vblank_count(struct drm_crtc *crtc) -{ - u64 vblank; - - spin_lock(&crtc->dev->event_lock); - vblank = drm_crtc_accurate_vblank_count_locked(crtc); - spin_unlock(&crtc->dev->event_lock); - - return vblank; -} EXPORT_SYMBOL(drm_crtc_accurate_vblank_count); static void __disable_vblank(struct drm_device *dev, unsigned int pipe) @@ -972,7 +961,7 @@ void drm_crtc_arm_vblank_event(struct dr assert_spin_locked(&dev->event_lock); e->pipe = pipe; - e->sequence = drm_crtc_accurate_vblank_count_locked(crtc) + 1; + e->sequence = drm_crtc_accurate_vblank_count(crtc) + 1; list_add_tail(&e->base.link, &dev->vblank_event_list); } EXPORT_SYMBOL(drm_crtc_arm_vblank_event); Index: src/sys/external/bsd/drm2/dist/drm/amd/display/amdgpu_dm/amdgpu_dm.c diff -u src/sys/external/bsd/drm2/dist/drm/amd/display/amdgpu_dm/amdgpu_dm.c:1.4 src/sys/external/bsd/drm2/dist/drm/amd/display/amdgpu_dm/amdgpu_dm.c:1.5 --- src/sys/external/bsd/drm2/dist/drm/amd/display/amdgpu_dm/amdgpu_dm.c:1.4 Sun Dec 19 12:31:45 2021 +++ src/sys/external/bsd/drm2/dist/drm/amd/display/amdgpu_dm/amdgpu_dm.c Sun Dec 26 21:00:14 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: amdgpu_dm.c,v 1.4 2021/12/19 12:31:45 riastradh Exp $ */ +/* $NetBSD: amdgpu_dm.c,v 1.5 2021/12/26 21:00:14 riastradh Exp $ */ /* * Copyright 2015 Advanced Micro Devices, Inc. @@ -27,7 +27,7 @@ /* The caprices of the preprocessor require that this be declared right here */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: amdgpu_dm.c,v 1.4 2021/12/19 12:31:45 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: amdgpu_dm.c,v 1.5 2021/12/26 21:00:14 riastradh Exp $"); #define CREATE_TRACE_POINTS @@ -361,7 +361,7 @@ static void dm_pflip_high_irq(void *inte drm_crtc_send_vblank_event(&amdgpu_crtc->base, e); /* Event sent, so done with vblank for this flip */ - drm_crtc_vblank_put(&amdgpu_crtc->base); + drm_crtc_vblank_put_locked(&amdgpu_crtc->base); } } else if (e) { /* VRR active and inside front-porch: vblank count and Index: src/sys/external/bsd/drm2/dist/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.c diff -u src/sys/external/bsd/drm2/dist/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.c:1.2 src/sys/external/bsd/drm2/dist/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.c:1.3 --- src/sys/external/bsd/drm2/dist/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.c:1.2 Sat Dec 18 23:45:00 2021 +++ src/sys/external/bsd/drm2/dist/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.c Sun Dec 26 21:00:14 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: amdgpu_dm_crc.c,v 1.2 2021/12/18 23:45:00 riastradh Exp $ */ +/* $NetBSD: amdgpu_dm_crc.c,v 1.3 2021/12/26 21:00:14 riastradh Exp $ */ /* * Copyright 2015 Advanced Micro Devices, Inc. @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: amdgpu_dm_crc.c,v 1.2 2021/12/18 23:45:00 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: amdgpu_dm_crc.c,v 1.3 2021/12/26 21:00:14 riastradh Exp $"); #include <drm/drm_crtc.h> #include <drm/drm_vblank.h> @@ -319,7 +319,9 @@ void amdgpu_dm_crtc_handle_crc_irq(struc &crcs[0], &crcs[1], &crcs[2])) return; + spin_lock(&crtc->dev->event_lock); drm_crtc_add_crc_entry(crtc, true, drm_crtc_accurate_vblank_count(crtc), crcs); + spin_unlock(&crtc->dev->event_lock); } } Index: src/sys/external/bsd/drm2/dist/drm/nouveau/dispnv50/nouveau_dispnv50_disp.c diff -u src/sys/external/bsd/drm2/dist/drm/nouveau/dispnv50/nouveau_dispnv50_disp.c:1.6 src/sys/external/bsd/drm2/dist/drm/nouveau/dispnv50/nouveau_dispnv50_disp.c:1.7 --- src/sys/external/bsd/drm2/dist/drm/nouveau/dispnv50/nouveau_dispnv50_disp.c:1.6 Sun Dec 19 11:34:44 2021 +++ src/sys/external/bsd/drm2/dist/drm/nouveau/dispnv50/nouveau_dispnv50_disp.c Sun Dec 26 21:00:14 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: nouveau_dispnv50_disp.c,v 1.6 2021/12/19 11:34:44 riastradh Exp $ */ +/* $NetBSD: nouveau_dispnv50_disp.c,v 1.7 2021/12/26 21:00:14 riastradh Exp $ */ /* * Copyright 2011 Red Hat Inc. @@ -24,7 +24,7 @@ * Authors: Ben Skeggs */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: nouveau_dispnv50_disp.c,v 1.6 2021/12/19 11:34:44 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: nouveau_dispnv50_disp.c,v 1.7 2021/12/26 21:00:14 riastradh Exp $"); #include "disp.h" #include "atom.h" @@ -2136,9 +2136,9 @@ nv50_disp_atomic_commit_tail(struct drm_ if (new_crtc_state->event) { unsigned long flags; /* Get correct count/ts if racing with vblank irq */ + spin_lock_irqsave(&crtc->dev->event_lock, flags); if (new_crtc_state->active) drm_crtc_accurate_vblank_count(crtc); - spin_lock_irqsave(&crtc->dev->event_lock, flags); drm_crtc_send_vblank_event(crtc, new_crtc_state->event); spin_unlock_irqrestore(&crtc->dev->event_lock, flags);