From ca08ac1beead443988ca00e4650af33dadf3b8b9 Mon Sep 17 00:00:00 2001 From: Siddharth Gupta Date: Wed, 29 Sep 2021 12:47:03 -0700 Subject: [PATCH] soc: qcom: ramdump: Remove the timeout in wait for completion Freeing a completion after setting it to complete can be racy with the thread that is waiting for completion. To avoid this race the ramdump descriptor should remain on the stack so that we only "free" the completion once wait_for_completion() returns. Change-Id: Ice02260a4f91aa6cd107eb371601d9ed910fb6cf Signed-off-by: Siddharth Gupta Signed-off-by: Vamsi Krishna Lanka --- drivers/soc/qcom/qcom_ramdump.c | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/drivers/soc/qcom/qcom_ramdump.c b/drivers/soc/qcom/qcom_ramdump.c index 924d4f292d24..095dfa8e4935 100644 --- a/drivers/soc/qcom/qcom_ramdump.c +++ b/drivers/soc/qcom/qcom_ramdump.c @@ -16,8 +16,6 @@ #include #include -#define RAMDUMP_TIMEOUT 120000 - struct qcom_ramdump_desc { void *data; struct completion dump_done; @@ -45,24 +43,21 @@ static void qcom_devcd_freev(void *data) struct qcom_ramdump_desc *desc = data; vfree(desc->data); - complete(&desc->dump_done); + complete_all(&desc->dump_done); } static int qcom_devcd_dump(struct device *dev, void *data, size_t datalen, gfp_t gfp) { struct qcom_ramdump_desc desc; - int ret; desc.data = data; init_completion(&desc.dump_done); dev_coredumpm(dev, NULL, &desc, datalen, gfp, qcom_devcd_readv, qcom_devcd_freev); - ret = wait_for_completion_timeout(&desc.dump_done, msecs_to_jiffies(RAMDUMP_TIMEOUT)); - if (!ret) - dev_err(dev, "ramdump collection timed out\n"); + wait_for_completion(&desc.dump_done); - return ret ? 0 : -ETIMEDOUT; + return !completion_done(&desc.dump_done); } int qcom_dump(struct list_head *segs, struct device *dev)