From bf74f23874703cd423f38621ee14bb78a00a939f Mon Sep 17 00:00:00 2001 From: Mohit Aggarwal Date: Mon, 24 Jul 2017 14:03:56 +0530 Subject: [PATCH] diag: Flush control workqueue immediately on channel close Currently, flushing of control workqueue is happening under protection which is causing a deadlock. The patch fixes the issue by flushing the control workqueue on immediate closure of channel. CRs-Fixed: 2081948 Change-Id: I6a7b1ee7cbabf2974700e28fc62c6d8fa3d464ed Signed-off-by: Mohit Aggarwal --- drivers/char/diag/diagfwd_cntl.c | 1 - drivers/char/diag/diagfwd_peripheral.c | 3 +++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/char/diag/diagfwd_cntl.c b/drivers/char/diag/diagfwd_cntl.c index 4ae2158b5a6b..74777212e4cf 100644 --- a/drivers/char/diag/diagfwd_cntl.c +++ b/drivers/char/diag/diagfwd_cntl.c @@ -67,7 +67,6 @@ void diag_cntl_channel_close(struct diagfwd_info *p_info) driver->feature[peripheral].sent_feature_mask = 0; driver->feature[peripheral].rcvd_feature_mask = 0; - flush_workqueue(driver->cntl_wq); reg_dirty |= PERIPHERAL_MASK(peripheral); diag_cmd_remove_reg_by_proc(peripheral); driver->feature[peripheral].stm_support = DISABLE_STM; diff --git a/drivers/char/diag/diagfwd_peripheral.c b/drivers/char/diag/diagfwd_peripheral.c index 6860de0d2288..78b8452b19b3 100644 --- a/drivers/char/diag/diagfwd_peripheral.c +++ b/drivers/char/diag/diagfwd_peripheral.c @@ -1285,6 +1285,9 @@ int diagfwd_channel_close(struct diagfwd_info *fwd_info) if (!fwd_info) return -EIO; + if (fwd_info->type == TYPE_CNTL) + flush_workqueue(driver->cntl_wq); + mutex_lock(&driver->diagfwd_channel_mutex[fwd_info->peripheral]); fwd_info->ch_open = 0; if (fwd_info && fwd_info->c_ops && fwd_info->c_ops->close)