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:
parent
a49bb61510
commit
4b6bee8a8a
1 changed files with 5 additions and 0 deletions
|
@ -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);
|
||||
|
|
Loading…
Add table
Reference in a new issue