diff --git a/net/ipc_router/ipc_router_core.c b/net/ipc_router/ipc_router_core.c index 903fea2c37e6..53a2212cc823 100644 --- a/net/ipc_router/ipc_router_core.c +++ b/net/ipc_router/ipc_router_core.c @@ -1424,6 +1424,8 @@ static void post_resume_tx(struct msm_ipc_router_remote_port *rport_ptr, { struct msm_ipc_resume_tx_port *rtx_port, *tmp_rtx_port; struct msm_ipc_port *local_port; + struct sock *sk; + void (*write_space)(struct sock *sk) = NULL; list_for_each_entry_safe(rtx_port, tmp_rtx_port, &rport_ptr->resume_tx_port_list, list) { @@ -1434,7 +1436,16 @@ static void post_resume_tx(struct msm_ipc_router_remote_port *rport_ptr, sizeof(*msg), local_port->priv); } else if (local_port) { wake_up(&local_port->port_tx_wait_q); - post_pkt_to_port(local_port, pkt, 1); + sk = ipc_port_sk(local_port->endpoint); + if (sk) { + read_lock(&sk->sk_callback_lock); + write_space = sk->sk_write_space; + read_unlock(&sk->sk_callback_lock); + if (write_space) + write_space(sk); + } + if (!write_space) + post_pkt_to_port(local_port, pkt, 1); } else { IPC_RTR_ERR("%s: Local Port %d not Found", __func__, rtx_port->port_id); diff --git a/net/ipc_router/ipc_router_socket.c b/net/ipc_router/ipc_router_socket.c index f7e054399ff2..a4e7575d5ad3 100644 --- a/net/ipc_router/ipc_router_socket.c +++ b/net/ipc_router/ipc_router_socket.c @@ -208,6 +208,7 @@ static int msm_ipc_router_create(struct net *net, sock->ops = &msm_ipc_proto_ops; sock_init_data(sock, sk); sk->sk_data_ready = NULL; + sk->sk_write_space = NULL; sk->sk_rcvtimeo = DEFAULT_RCV_TIMEO; sk->sk_sndtimeo = DEFAULT_SND_TIMEO;