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 <hdhoat@codeaurora.org>
This commit is contained in:
Dhoat Harpal 2017-08-23 17:29:38 +05:30
parent a49bb61510
commit 4b6bee8a8a

View file

@ -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);