From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: "Yew, Chang Ching" Date: Tue, 30 Apr 2019 02:22:24 +0000 Subject: [PATCH] media: ipu4: [VIRT] Fix for race condition in handle_vq_kick() Race condition is observed with 2:2 sos:aaag cpu allocation with req->stat checking in handle_vq_kick() This req->stat checking is removed to avoid such race condition Change-Id: I2c6f3b6f64538664e1dd53bc260900303f59b1bb Tracked-On: PKT-2287 Tracked-On: ACI-5773 Signed-off-by: Yew, Chang Ching Signed-off-by: Junhao Gao --- .../virtio/intel-ipu4-virtio-be-bridge.c | 30 +------------------ .../pci/intel/virtio/intel-ipu4-virtio-be.c | 8 +---- 2 files changed, 2 insertions(+), 36 deletions(-) diff --git a/drivers/media/pci/intel/virtio/intel-ipu4-virtio-be-bridge.c b/drivers/media/pci/intel/virtio/intel-ipu4-virtio-be-bridge.c index 27f8631ffaa9..19ffac6e2110 100644 --- a/drivers/media/pci/intel/virtio/intel-ipu4-virtio-be-bridge.c +++ b/drivers/media/pci/intel/virtio/intel-ipu4-virtio-be-bridge.c @@ -49,7 +49,6 @@ int intel_ipu4_virtio_msg_parse(struct ipu4_virtio_req_info *req_info) __func__, req->op[0]); kthread_run(process_poll_thread, req_info, "process_poll"); - req->stat = IPU4_REQ_PENDING; break; case IPU4_CMD_DEVICE_OPEN: /* @@ -60,7 +59,6 @@ int intel_ipu4_virtio_msg_parse(struct ipu4_virtio_req_info *req_info) pr_debug("DEVICE_OPEN: virtual_dev_id:%d actual_fd:%d\n", req->op[0], req->op[1]); kthread_run(process_device_open_thread, req_info, "process_device_open"); - req->stat = IPU4_REQ_PENDING; break; case IPU4_CMD_DEVICE_CLOSE: /* @@ -71,7 +69,6 @@ int intel_ipu4_virtio_msg_parse(struct ipu4_virtio_req_info *req_info) pr_debug("DEVICE_CLOSE: virtual_dev_id:%d actual_fd:%d\n", req->op[0], req->op[1]); kthread_run(process_device_close_thread, req_info, "process_device_close"); - req->stat = IPU4_REQ_PENDING; break; case IPU4_CMD_STREAM_ON: /* Start Stream @@ -81,7 +78,6 @@ int intel_ipu4_virtio_msg_parse(struct ipu4_virtio_req_info *req_info) pr_debug("STREAM ON: virtual_dev_id:%d actual_fd:%d\n", req->op[0], req->op[1]); kthread_run(process_stream_on_thread, req_info, "process_stream_on"); - req->stat = IPU4_REQ_PENDING; break; case IPU4_CMD_STREAM_OFF: /* Stop Stream @@ -91,7 +87,6 @@ int intel_ipu4_virtio_msg_parse(struct ipu4_virtio_req_info *req_info) pr_debug("STREAM OFF: virtual_dev_id:%d actual_fd:%d\n", req->op[0], req->op[1]); kthread_run(process_stream_off_thread, req_info, "process_stream_off"); - req->stat = IPU4_REQ_PENDING; break; case IPU4_CMD_GET_BUF: /* Set Format of a given video node @@ -107,7 +102,6 @@ int intel_ipu4_virtio_msg_parse(struct ipu4_virtio_req_info *req_info) __func__, req->op[0]); kthread_run(process_get_buf_thread, req_info, "process_get_buf"); - req->stat = IPU4_REQ_PENDING; break; case IPU4_CMD_PUT_BUF: /* Set Format of a given video node @@ -119,165 +113,143 @@ int intel_ipu4_virtio_msg_parse(struct ipu4_virtio_req_info *req_info) __func__, req->op[0]); kthread_run(process_put_buf_thread, req_info, "process_put_buf"); - req->stat = IPU4_REQ_PENDING; break; case IPU4_CMD_SET_FORMAT: pr_debug("%s process_set_format %d", __func__, req->op[0]); kthread_run(process_set_format_thread, req_info, "process_set_format"); - req->stat = IPU4_REQ_PENDING; break; case IPU4_CMD_PIPELINE_OPEN: pr_debug("%s process_pipeline_open %d", __func__, req->op[0]); kthread_run(process_pipeline_open_thread, req_info, "process_pipeline_open"); - req->stat = IPU4_REQ_PENDING; break; case IPU4_CMD_PIPELINE_CLOSE: pr_debug("%s process_pipeline_close %d", __func__, req->op[0]); kthread_run(process_pipeline_close_thread, req_info, "process_pipeline_close"); - req->stat = IPU4_REQ_PENDING; break; case IPU4_CMD_ENUM_NODES: pr_debug("%s process_enum_nodes %d", __func__, req->op[0]); kthread_run(process_enum_nodes_thread, req_info, "process_enum_nodes"); - req->stat = IPU4_REQ_PENDING; break; case IPU4_CMD_ENUM_LINKS: pr_debug("%s process_enum_links %d", __func__, req->op[0]); kthread_run(process_enum_links_thread, req_info, "process_enum_links"); - req->stat = IPU4_REQ_PENDING; break; case IPU4_CMD_SETUP_PIPE: pr_debug("%s process_setup_pipe %d", __func__, req->op[0]); kthread_run(process_setup_pipe_thread, req_info, "process_setup_pipe"); - req->stat = IPU4_REQ_PENDING; break; case IPU4_CMD_SET_FRAMEFMT: pr_debug("%s process_set_framefmt %d", __func__, req->op[0]); kthread_run(process_set_framefmt_thread, req_info, "process_set_framefmt"); - req->stat = IPU4_REQ_PENDING; break; case IPU4_CMD_GET_FRAMEFMT: pr_debug("%s process_get_framefmt %d", __func__, req->op[0]); kthread_run(process_get_framefmt_thread, req_info, "process_get_framefmt"); - req->stat = IPU4_REQ_PENDING; break; case IPU4_CMD_GET_SUPPORTED_FRAMEFMT: pr_debug("%s process_get_supported_framefmt %d", __func__, req->op[0]); kthread_run(process_get_supported_framefmt_thread, req_info, "process_get_supported_framefmt"); - req->stat = IPU4_REQ_PENDING; break; case IPU4_CMD_SET_SELECTION: pr_debug("%s process_pad_set_sel %d", __func__, req->op[0]); kthread_run(process_pad_set_sel_thread, req_info, "process_pad_set_sel"); - req->stat = IPU4_REQ_PENDING; break; case IPU4_CMD_GET_SELECTION: pr_debug("%s process_pad_get_sel %d", __func__, req->op[0]); kthread_run(process_pad_get_sel_thread, req_info, "process_pad_get_sel"); - req->stat = IPU4_REQ_PENDING; break; case IPU4_CMD_PSYS_MAPBUF: pr_debug("%s process_psys_mapbuf_thread %d", __func__, req->op[0]); kthread_run(process_psys_mapbuf_thread, req_info, "process_psys_mapbuf_thread"); - req->stat = IPU4_REQ_PENDING; break; case IPU4_CMD_PSYS_UNMAPBUF: pr_debug("%s process_psys_unmapbuf_thread %d", __func__, req->op[0]); kthread_run(process_psys_unmapbuf_thread, req_info, "process_psys_unmapbuf_thread"); - req->stat = IPU4_REQ_PENDING; break; case IPU4_CMD_PSYS_QUERYCAP: pr_debug("%s process_psys_querycap_thread %d", __func__, req->op[0]); kthread_run(process_psys_querycap_thread, req_info, "process_psys_querycap_thread"); - req->stat = IPU4_REQ_PENDING; break; case IPU4_CMD_PSYS_GETBUF: pr_debug("%s process_psys_getbuf_thread %d", __func__, req->op[0]); kthread_run(process_psys_getbuf_thread, req_info, "process_psys_getbuf_thread"); - req->stat = IPU4_REQ_PENDING; break; case IPU4_CMD_PSYS_PUTBUF: pr_debug("%s process_psys_putbuf_thread %d", __func__, req->op[0]); kthread_run(process_psys_putbuf_thread, req_info, "process_psys_putbuf_thread"); - req->stat = IPU4_REQ_PENDING; break; case IPU4_CMD_PSYS_QCMD: pr_debug("%s process_psys_qcmd_thread %d", __func__, req->op[0]); kthread_run(process_psys_qcmd_thread, req_info, "process_psys_qcmd_thread"); - req->stat = IPU4_REQ_PENDING; break; case IPU4_CMD_PSYS_DQEVENT: pr_debug("%s process_psys_dqevent_thread %d", __func__, req->op[0]); kthread_run(process_psys_dqevent_thread, req_info, "process_psys_dqevent_thread"); - req->stat = IPU4_REQ_PENDING; break; case IPU4_CMD_PSYS_GET_MANIFEST: pr_debug("%s process_psys_get_manifest_thread %d", __func__, req->op[0]); kthread_run(process_psys_get_manifest_thread, req_info, "process_psys_get_manifest_thread"); - req->stat = IPU4_REQ_PENDING; break; case IPU4_CMD_PSYS_OPEN: pr_debug("%s process_psys_open_thread %d", __func__, req->op[0]); kthread_run(process_psys_open_thread, req_info, "process_psys_open_thread"); - req->stat = IPU4_REQ_PENDING; break; case IPU4_CMD_PSYS_CLOSE: pr_debug("%s process_psys_close_thread %d", __func__, req->op[0]); kthread_run(process_psys_close_thread, req_info, "process_psys_close_thread"); - req->stat = IPU4_REQ_PENDING; break; case IPU4_CMD_PSYS_POLL: pr_debug("%s process_psys_poll_thread %d", __func__, req->op[0]); kthread_run(process_psys_poll_thread, req_info, "process_psys_poll_thread"); - req->stat = IPU4_REQ_PENDING; break; default: return -EINVAL; } + req->stat = IPU4_REQ_PENDING; return ret; } diff --git a/drivers/media/pci/intel/virtio/intel-ipu4-virtio-be.c b/drivers/media/pci/intel/virtio/intel-ipu4-virtio-be.c index c29294b186fe..a4b950a128d7 100644 --- a/drivers/media/pci/intel/virtio/intel-ipu4-virtio-be.c +++ b/drivers/media/pci/intel/virtio/intel-ipu4-virtio-be.c @@ -209,17 +209,11 @@ static void handle_vq_kick(int client_id, int vq_idx) virtio_vq_relchain(vq, idx, iov.iov_len); continue; } - - if (req->stat != IPU4_REQ_PENDING) { - virtio_vq_relchain(vq, idx, iov.iov_len); - ipu4_virtio_be_req_queue_put(req_info); - } pr_debug("%s ending request for stream %d", __func__, req->op[0]); } pr_debug("IPU VBK data process on VQ Done\n"); - if ((req == NULL) || (req && req->stat != - IPU4_REQ_PENDING)) + if (req == NULL) virtio_vq_endchains(vq, 1); } -- https://clearlinux.org