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 <sidgup@codeaurora.org>
Signed-off-by: Vamsi Krishna Lanka <quic_vamslank@quicinc.com>
This commit is contained in:
Siddharth Gupta 2021-09-29 12:47:03 -07:00 committed by Guru Das Srinagesh
parent e834f9391e
commit ca08ac1bee

View File

@ -16,8 +16,6 @@
#include <linux/devcoredump.h>
#include <linux/soc/qcom/mdt_loader.h>
#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)