Explorar el Código

Merge "video: driver: avoid race between core_timeout and handle_response"

qctecmdr hace 4 años
padre
commit
c4692136e5

+ 25 - 0
driver/vidc/src/msm_vidc_probe.c

@@ -180,6 +180,11 @@ static int msm_vidc_deinitialize_core(struct msm_vidc_core *core)
 	mutex_destroy(&core->lock);
 	msm_vidc_change_core_state(core, MSM_VIDC_CORE_DEINIT, __func__);
 
+	kfree(core->response_packet);
+	kfree(core->packet);
+	core->response_packet = NULL;
+	core->packet = NULL;
+
 	if (core->batch_workq)
 		destroy_workqueue(core->batch_workq);
 
@@ -229,6 +234,22 @@ static int msm_vidc_initialize_core(struct msm_vidc_core *core)
 		goto exit;
 	}
 
+	core->packet_size = 4096;
+	core->packet = kzalloc(core->packet_size, GFP_KERNEL);
+	if (!core->packet) {
+		d_vpr_e("%s(): core packet allocation failed\n", __func__);
+		rc = -ENOMEM;
+		goto exit;
+	}
+
+	core->response_packet = kzalloc(core->packet_size, GFP_KERNEL);
+	if (!core->response_packet) {
+		d_vpr_e("%s(): core response packet allocation failed\n",
+			__func__);
+		rc = -ENOMEM;
+		goto exit;
+	}
+
 	mutex_init(&core->lock);
 	INIT_LIST_HEAD(&core->instances);
 	INIT_LIST_HEAD(&core->dangling_instances);
@@ -240,6 +261,10 @@ static int msm_vidc_initialize_core(struct msm_vidc_core *core)
 
 	return 0;
 exit:
+	kfree(core->response_packet);
+	kfree(core->packet);
+	core->response_packet = NULL;
+	core->packet = NULL;
 	if (core->batch_workq)
 		destroy_workqueue(core->batch_workq);
 	if (core->pm_workq)

+ 0 - 19
driver/vidc/src/venus_hfi.c

@@ -2794,21 +2794,6 @@ int venus_hfi_core_init(struct msm_vidc_core *core)
 
 	__strict_check(core);
 
-	core->packet_size = 4096;
-	core->packet = kzalloc(core->packet_size, GFP_KERNEL);
-	if (!core->packet) {
-		d_vpr_e("%s(): core packet allocation failed\n", __func__);
-		return -ENOMEM;
-	}
-
-	core->response_packet = kzalloc(core->packet_size, GFP_KERNEL);
-	if (!core->response_packet) {
-		d_vpr_e("%s(): core response packet allocation failed\n",
-			__func__);
-		kfree(core->packet);
-		return -ENOMEM;
-	}
-
 	core->handoff_done = 0;
 
 	rc = __load_fw(core);
@@ -2868,10 +2853,6 @@ int venus_hfi_core_deinit(struct msm_vidc_core *core)
 	__disable_subcaches(core);
 	__interface_queues_deinit(core);
 	__unload_fw(core);
-	kfree(core->response_packet);
-	core->response_packet = NULL;
-	kfree(core->packet);
-	core->packet = NULL;
 	return 0;
 }
 

+ 0 - 1
driver/vidc/src/venus_hfi_response.c

@@ -1439,7 +1439,6 @@ static int __handle_session_response(struct msm_vidc_inst *inst,
 				rc = handle_session_error(inst, packet);
 				if (rc)
 					goto exit;
-				continue;
 			}
 			if (in_range(be[i], packet->type)) {
 				dequeue |= (packet->type == HFI_CMD_BUFFER);