@@ -147,6 +147,13 @@ v3d_job_allocate(void **container, size_t size)
147
147
return 0 ;
148
148
}
149
149
150
+ static void
151
+ v3d_job_deallocate (void * * container )
152
+ {
153
+ kfree (* container );
154
+ * container = NULL ;
155
+ }
156
+
150
157
static int
151
158
v3d_job_init (struct v3d_dev * v3d , struct drm_file * file_priv ,
152
159
struct v3d_job * job , void (* free )(struct kref * ref ),
@@ -273,17 +280,21 @@ v3d_setup_csd_jobs_and_bos(struct drm_file *file_priv,
273
280
274
281
ret = v3d_job_init (v3d , file_priv , & (* job )-> base ,
275
282
v3d_job_free , args -> in_sync , se , V3D_CSD );
276
- if (ret )
283
+ if (ret ) {
284
+ v3d_job_deallocate ((void * )job );
277
285
return ret ;
286
+ }
278
287
279
288
ret = v3d_job_allocate ((void * )clean_job , sizeof (* * clean_job ));
280
289
if (ret )
281
290
return ret ;
282
291
283
292
ret = v3d_job_init (v3d , file_priv , * clean_job ,
284
293
v3d_job_free , 0 , NULL , V3D_CACHE_CLEAN );
285
- if (ret )
294
+ if (ret ) {
295
+ v3d_job_deallocate ((void * )clean_job );
286
296
return ret ;
297
+ }
287
298
288
299
(* job )-> args = * args ;
289
300
@@ -860,8 +871,10 @@ v3d_submit_cl_ioctl(struct drm_device *dev, void *data,
860
871
861
872
ret = v3d_job_init (v3d , file_priv , & render -> base ,
862
873
v3d_render_job_free , args -> in_sync_rcl , & se , V3D_RENDER );
863
- if (ret )
874
+ if (ret ) {
875
+ v3d_job_deallocate ((void * )& render );
864
876
goto fail ;
877
+ }
865
878
866
879
render -> start = args -> rcl_start ;
867
880
render -> end = args -> rcl_end ;
@@ -874,8 +887,10 @@ v3d_submit_cl_ioctl(struct drm_device *dev, void *data,
874
887
875
888
ret = v3d_job_init (v3d , file_priv , & bin -> base ,
876
889
v3d_job_free , args -> in_sync_bcl , & se , V3D_BIN );
877
- if (ret )
890
+ if (ret ) {
891
+ v3d_job_deallocate ((void * )& bin );
878
892
goto fail ;
893
+ }
879
894
880
895
bin -> start = args -> bcl_start ;
881
896
bin -> end = args -> bcl_end ;
@@ -892,8 +907,10 @@ v3d_submit_cl_ioctl(struct drm_device *dev, void *data,
892
907
893
908
ret = v3d_job_init (v3d , file_priv , clean_job ,
894
909
v3d_job_free , 0 , NULL , V3D_CACHE_CLEAN );
895
- if (ret )
910
+ if (ret ) {
911
+ v3d_job_deallocate ((void * )& clean_job );
896
912
goto fail ;
913
+ }
897
914
898
915
last_job = clean_job ;
899
916
} else {
@@ -1015,8 +1032,10 @@ v3d_submit_tfu_ioctl(struct drm_device *dev, void *data,
1015
1032
1016
1033
ret = v3d_job_init (v3d , file_priv , & job -> base ,
1017
1034
v3d_job_free , args -> in_sync , & se , V3D_TFU );
1018
- if (ret )
1035
+ if (ret ) {
1036
+ v3d_job_deallocate ((void * )& job );
1019
1037
goto fail ;
1038
+ }
1020
1039
1021
1040
job -> base .bo = kcalloc (ARRAY_SIZE (args -> bo_handles ),
1022
1041
sizeof (* job -> base .bo ), GFP_KERNEL );
@@ -1233,8 +1252,10 @@ v3d_submit_cpu_ioctl(struct drm_device *dev, void *data,
1233
1252
1234
1253
ret = v3d_job_init (v3d , file_priv , & cpu_job -> base ,
1235
1254
v3d_job_free , 0 , & se , V3D_CPU );
1236
- if (ret )
1255
+ if (ret ) {
1256
+ v3d_job_deallocate ((void * )& cpu_job );
1237
1257
goto fail ;
1258
+ }
1238
1259
1239
1260
clean_job = cpu_job -> indirect_csd .clean_job ;
1240
1261
csd_job = cpu_job -> indirect_csd .job ;
0 commit comments