From 4b6bee8a8a377c0dfed61a0e2345d3ed85307b02 Mon Sep 17 00:00:00 2001 From: Dhoat Harpal Date: Wed, 23 Aug 2017 17:29:38 +0530 Subject: [PATCH] soc: qcom: ipc_router_glink_xprt: Add wakeup source in RX path In function glink_xprt_notify_rxv work item is queued without wakelock. This allows system to go in suspend state without scheduling this work item. Wakelock is taken to avoid system suspend before workqueue execution. CRs-Fixed: 2098623 Change-Id: Ic5f74dbb4bf315f1cb6aa528367a6fb80e8a11b6 Signed-off-by: Dhoat Harpal --- drivers/soc/qcom/ipc_router_glink_xprt.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/soc/qcom/ipc_router_glink_xprt.c b/drivers/soc/qcom/ipc_router_glink_xprt.c index 7dd1683881fb..0c588c586306 100644 --- a/drivers/soc/qcom/ipc_router_glink_xprt.c +++ b/drivers/soc/qcom/ipc_router_glink_xprt.c @@ -82,6 +82,7 @@ struct ipc_router_glink_xprt { struct msm_ipc_router_xprt xprt; void *ch_hndl; struct workqueue_struct *xprt_wq; + struct wakeup_source notify_rxv_ws; struct rw_semaphore ss_reset_rwlock; int ss_reset; void *pil; @@ -377,6 +378,7 @@ out_read_data: glink_rx_done(glink_xprtp->ch_hndl, rx_work->iovec, reuse_intent); kfree(rx_work); up_read(&glink_xprtp->ss_reset_rwlock); + __pm_relax(&glink_xprtp->notify_rxv_ws); } static void glink_xprt_open_event(struct work_struct *work) @@ -491,6 +493,8 @@ static void glink_xprt_notify_rxv(void *handle, const void *priv, rx_work->iovec_size = size; rx_work->vbuf_provider = vbuf_provider; rx_work->pbuf_provider = pbuf_provider; + if (!glink_xprtp->dynamic_wakeup_source) + __pm_stay_awake(&glink_xprtp->notify_rxv_ws); INIT_WORK(&rx_work->work, glink_xprt_read_data); queue_work(glink_xprtp->xprt_wq, &rx_work->work); } @@ -760,6 +764,7 @@ static int ipc_router_glink_config_init( return -EFAULT; } + wakeup_source_init(&glink_xprtp->notify_rxv_ws, xprt_wq_name); mutex_lock(&glink_xprt_list_lock_lha1); list_add(&glink_xprtp->list, &glink_xprt_list); mutex_unlock(&glink_xprt_list_lock_lha1);