From 6a9a4a11c979248ba6367426fa64b3bdcdadce81 Mon Sep 17 00:00:00 2001 From: Keyon Jie Date: Tue, 12 Oct 2021 11:14:21 +0800 Subject: [PATCH 1/3] ipc-common: add checks of buffer allocation return Add checks and return failure if buffer allocation fails to ipc_init(). Signed-off-by: Keyon Jie --- src/ipc/ipc-common.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/ipc/ipc-common.c b/src/ipc/ipc-common.c index dd29110e18c3..cd630f459a69 100644 --- a/src/ipc/ipc-common.c +++ b/src/ipc/ipc-common.c @@ -231,8 +231,13 @@ int ipc_init(struct sof *sof) /* init ipc data */ sof->ipc = rzalloc(SOF_MEM_ZONE_SYS_SHARED, 0, SOF_MEM_CAPS_RAM, sizeof(*sof->ipc)); + if (!sof->ipc) + return -ENOMEM; + sof->ipc->comp_data = rzalloc(SOF_MEM_ZONE_SYS_SHARED, 0, SOF_MEM_CAPS_RAM, SOF_IPC_MSG_MAX_SIZE); + if (!sof->ipc->comp_data) + return -ENOMEM; spinlock_init(&sof->ipc->lock); list_init(&sof->ipc->msg_list); From 42ab3bd7a0f1c3e2501ed1d3b2a47567c6f37870 Mon Sep 17 00:00:00 2001 From: Keyon Jie Date: Tue, 12 Oct 2021 11:17:27 +0800 Subject: [PATCH 2/3] platforms: return failure in case ipc_init() fails Check and return failure, in case of failure happens in ipc_init(). Signed-off-by: Keyon Jie --- src/platform/amd/renoir/platform.c | 5 ++++- src/platform/baytrail/platform.c | 4 +++- src/platform/haswell/platform.c | 4 +++- src/platform/imx8/platform.c | 4 +++- src/platform/imx8m/platform.c | 4 +++- src/platform/imx8ulp/platform.c | 4 +++- src/platform/intel/cavs/platform.c | 4 +++- src/platform/mt8195/platform.c | 4 +++- 8 files changed, 25 insertions(+), 8 deletions(-) diff --git a/src/platform/amd/renoir/platform.c b/src/platform/amd/renoir/platform.c index cc5d0a567755..65f9215a9331 100644 --- a/src/platform/amd/renoir/platform.c +++ b/src/platform/amd/renoir/platform.c @@ -94,7 +94,10 @@ int platform_init(struct sof *sof) sizeof(sof->dma_info->dma_array), PLATFORM_DEFAULT_CLOCK, true); scheduler_init_ll(sof->platform_dma_domain); /* initialize the host IPC mechanisms */ - ipc_init(sof); + ret = ipc_init(sof); + if (ret < 0) + return ret; + /* initialize the DAI mechanisms */ ret = dai_init(sof); if (ret < 0) diff --git a/src/platform/baytrail/platform.c b/src/platform/baytrail/platform.c index 8d239ae940f0..9b051ae70e4a 100644 --- a/src/platform/baytrail/platform.c +++ b/src/platform/baytrail/platform.c @@ -253,7 +253,9 @@ int platform_init(struct sof *sof) /* initialise the host IPC mechanisms */ trace_point(TRACE_BOOT_PLATFORM_IPC); - ipc_init(sof); + ret = ipc_init(sof); + if (ret < 0) + return ret; trace_point(TRACE_BOOT_PLATFORM_DAI); ret = dai_init(sof); diff --git a/src/platform/haswell/platform.c b/src/platform/haswell/platform.c index 6526cb687b77..0669c96886f8 100644 --- a/src/platform/haswell/platform.c +++ b/src/platform/haswell/platform.c @@ -226,7 +226,9 @@ int platform_init(struct sof *sof) /* initialise the host IPC mechanisms */ trace_point(TRACE_BOOT_PLATFORM_IPC); - ipc_init(sof); + ret = ipc_init(sof); + if (ret < 0) + return ret; trace_point(TRACE_BOOT_PLATFORM_DAI); ret = dai_init(sof); diff --git a/src/platform/imx8/platform.c b/src/platform/imx8/platform.c index c3bb07f268b2..4b13f4092676 100644 --- a/src/platform/imx8/platform.c +++ b/src/platform/imx8/platform.c @@ -193,7 +193,9 @@ int platform_init(struct sof *sof) scheduler_init_ll(sof->platform_dma_domain); /* initialize the host IPC mechanims */ - ipc_init(sof); + ret = ipc_init(sof); + if (ret < 0) + return ret; ret = dai_init(sof); if (ret < 0) diff --git a/src/platform/imx8m/platform.c b/src/platform/imx8m/platform.c index 798be01ce892..aef26bf46f15 100644 --- a/src/platform/imx8m/platform.c +++ b/src/platform/imx8m/platform.c @@ -193,7 +193,9 @@ int platform_init(struct sof *sof) scheduler_init_ll(sof->platform_dma_domain); /* initialize the host IPC mechanims */ - ipc_init(sof); + ret = ipc_init(sof); + if (ret < 0) + return ret; ret = dai_init(sof); if (ret < 0) diff --git a/src/platform/imx8ulp/platform.c b/src/platform/imx8ulp/platform.c index a081375fbd5d..26f4f5301d38 100644 --- a/src/platform/imx8ulp/platform.c +++ b/src/platform/imx8ulp/platform.c @@ -181,7 +181,9 @@ int platform_init(struct sof *sof) scheduler_init_ll(sof->platform_dma_domain); /* initialize the host IPC mechanims */ - ipc_init(sof); + ret = ipc_init(sof); + if (ret < 0) + return ret; ret = dai_init(sof); if (ret < 0) diff --git a/src/platform/intel/cavs/platform.c b/src/platform/intel/cavs/platform.c index 66093ac2ab43..c1be08ed9a5f 100644 --- a/src/platform/intel/cavs/platform.c +++ b/src/platform/intel/cavs/platform.c @@ -491,7 +491,9 @@ int platform_init(struct sof *sof) /* initialize the host IPC mechanisms */ trace_point(TRACE_BOOT_PLATFORM_IPC); - ipc_init(sof); + ret = ipc_init(sof); + if (ret < 0) + return ret; /* initialize IDC mechanism */ trace_point(TRACE_BOOT_PLATFORM_IDC); diff --git a/src/platform/mt8195/platform.c b/src/platform/mt8195/platform.c index 4ad2b98f4395..0e40da5f6fc4 100644 --- a/src/platform/mt8195/platform.c +++ b/src/platform/mt8195/platform.c @@ -206,7 +206,9 @@ int platform_init(struct sof *sof) scheduler_init_ll(sof->platform_dma_domain); /* initialize the host IPC mechanims */ - ipc_init(sof); + ret = ipc_init(sof); + if (ret < 0) + return ret; ret = dai_init(sof); if (ret < 0) From bd4b2da3dd8918be3c9a40ce2f3d5b634bcd0119 Mon Sep 17 00:00:00 2001 From: Keyon Jie Date: Sun, 10 Oct 2021 08:31:38 +0800 Subject: [PATCH 3/3] dma-trace: avoid multiple allocations to fix fuzzy IPC The fuzzy IPC testing reports there is memory leak if dma_trace_config IPC is sent multiple times, we should just return if the DMA trace buffer is already allocated, to avoid allocating new buffers and the leakage of the old buffers. Signed-off-by: Keyon Jie --- src/trace/dma-trace.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/trace/dma-trace.c b/src/trace/dma-trace.c index 16c8037402b1..3c48a545df9c 100644 --- a/src/trace/dma-trace.c +++ b/src/trace/dma-trace.c @@ -407,6 +407,10 @@ int dma_trace_enable(struct dma_trace_data *d) { int err; + /* the existence of the trace buffer means the dma trace already initialized */ + if (d->dmatb.addr) + return 0; + /* initialize dma trace buffer */ err = dma_trace_buffer_init(d);