DF-5131 / fix.diff
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 | diff -ruN a/sys/dev/drm/radeon/cik.c b/sys/dev/drm/radeon/cik.c --- a/sys/dev/drm/radeon/cik.c 2026-09-30 04:48:21.819830918 +0000 +++ b/sys/dev/drm/radeon/cik.c 2026-09-30 04:48:21.863830353 +0000 @@ -3692,8 +3692,19 @@ return ERR_PTR(r); } - radeon_sync_resv(rdev, &sync, resv, false); - radeon_sync_rings(rdev, &sync, ring->idx); + r = radeon_sync_resv(rdev, &sync, resv, false); + if (r) { + radeon_ring_unlock_undo(rdev, ring); + radeon_sync_free(rdev, &sync, NULL); + return ERR_PTR(r); + } + + r = radeon_sync_rings(rdev, &sync, ring->idx); + if (r) { + radeon_ring_unlock_undo(rdev, ring); + radeon_sync_free(rdev, &sync, NULL); + return ERR_PTR(r); + } for (i = 0; i < num_loops; i++) { cur_size_in_bytes = size_in_bytes; diff -ruN a/sys/dev/drm/radeon/cik_sdma.c b/sys/dev/drm/radeon/cik_sdma.c --- a/sys/dev/drm/radeon/cik_sdma.c 2026-09-30 04:48:21.827830815 +0000 +++ b/sys/dev/drm/radeon/cik_sdma.c 2026-09-30 04:48:21.879830146 +0000 @@ -598,8 +598,19 @@ return ERR_PTR(r); } - radeon_sync_resv(rdev, &sync, resv, false); - radeon_sync_rings(rdev, &sync, ring->idx); + r = radeon_sync_resv(rdev, &sync, resv, false); + if (r) { + radeon_ring_unlock_undo(rdev, ring); + radeon_sync_free(rdev, &sync, NULL); + return ERR_PTR(r); + } + + r = radeon_sync_rings(rdev, &sync, ring->idx); + if (r) { + radeon_ring_unlock_undo(rdev, ring); + radeon_sync_free(rdev, &sync, NULL); + return ERR_PTR(r); + } for (i = 0; i < num_loops; i++) { cur_size_in_bytes = size_in_bytes; diff -ruN a/sys/dev/drm/radeon/evergreen_dma.c b/sys/dev/drm/radeon/evergreen_dma.c --- a/sys/dev/drm/radeon/evergreen_dma.c 2026-09-30 04:48:21.819830918 +0000 +++ b/sys/dev/drm/radeon/evergreen_dma.c 2026-09-30 04:48:21.871830250 +0000 @@ -127,8 +127,19 @@ return ERR_PTR(r); } - radeon_sync_resv(rdev, &sync, resv, false); - radeon_sync_rings(rdev, &sync, ring->idx); + r = radeon_sync_resv(rdev, &sync, resv, false); + if (r) { + radeon_ring_unlock_undo(rdev, ring); + radeon_sync_free(rdev, &sync, NULL); + return ERR_PTR(r); + } + + r = radeon_sync_rings(rdev, &sync, ring->idx); + if (r) { + radeon_ring_unlock_undo(rdev, ring); + radeon_sync_free(rdev, &sync, NULL); + return ERR_PTR(r); + } for (i = 0; i < num_loops; i++) { cur_size_in_dw = size_in_dw; diff -ruN a/sys/dev/drm/radeon/r600.c b/sys/dev/drm/radeon/r600.c --- a/sys/dev/drm/radeon/r600.c 2026-09-30 04:48:21.815830970 +0000 +++ b/sys/dev/drm/radeon/r600.c 2026-09-30 04:48:21.847830559 +0000 @@ -2994,8 +2994,19 @@ return ERR_PTR(r); } - radeon_sync_resv(rdev, &sync, resv, false); - radeon_sync_rings(rdev, &sync, ring->idx); + r = radeon_sync_resv(rdev, &sync, resv, false); + if (r) { + radeon_ring_unlock_undo(rdev, ring); + radeon_sync_free(rdev, &sync, NULL); + return ERR_PTR(r); + } + + r = radeon_sync_rings(rdev, &sync, ring->idx); + if (r) { + radeon_ring_unlock_undo(rdev, ring); + radeon_sync_free(rdev, &sync, NULL); + return ERR_PTR(r); + } radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1)); radeon_ring_write(ring, (WAIT_UNTIL - PACKET3_SET_CONFIG_REG_OFFSET) >> 2); diff -ruN a/sys/dev/drm/radeon/radeon_vm.c b/sys/dev/drm/radeon/radeon_vm.c --- a/sys/dev/drm/radeon/radeon_vm.c 2026-09-30 04:48:21.831830764 +0000 +++ b/sys/dev/drm/radeon/radeon_vm.c 2026-09-30 04:48:21.879830146 +0000 @@ -702,7 +702,11 @@ if (ib.length_dw != 0) { radeon_asic_vm_pad_ib(rdev, &ib); - radeon_sync_resv(rdev, &ib.sync, pd->tbo.resv, true); + r = radeon_sync_resv(rdev, &ib.sync, pd->tbo.resv, true); + if (r) { + radeon_ib_free(rdev, &ib); + return r; + } WARN_ON(ib.length_dw > ndw); r = radeon_ib_schedule(rdev, &ib, NULL, false); if (r) { @@ -830,7 +834,9 @@ uint64_t pte; int r; - radeon_sync_resv(rdev, &ib->sync, pt->tbo.resv, true); + r = radeon_sync_resv(rdev, &ib->sync, pt->tbo.resv, true); + if (r) + return r; r = reservation_object_reserve_shared(pt->tbo.resv); if (r) return r; diff -ruN a/sys/dev/drm/radeon/rv770_dma.c b/sys/dev/drm/radeon/rv770_dma.c --- a/sys/dev/drm/radeon/rv770_dma.c 2026-09-30 04:48:21.823830867 +0000 +++ b/sys/dev/drm/radeon/rv770_dma.c 2026-09-30 04:48:21.879830146 +0000 @@ -63,8 +63,19 @@ return ERR_PTR(r); } - radeon_sync_resv(rdev, &sync, resv, false); - radeon_sync_rings(rdev, &sync, ring->idx); + r = radeon_sync_resv(rdev, &sync, resv, false); + if (r) { + radeon_ring_unlock_undo(rdev, ring); + radeon_sync_free(rdev, &sync, NULL); + return ERR_PTR(r); + } + + r = radeon_sync_rings(rdev, &sync, ring->idx); + if (r) { + radeon_ring_unlock_undo(rdev, ring); + radeon_sync_free(rdev, &sync, NULL); + return ERR_PTR(r); + } for (i = 0; i < num_loops; i++) { cur_size_in_dw = size_in_dw; |