From baeaf0b61dde702d93abf1e2af113f9c53bb1f70 Mon Sep 17 00:00:00 2001 From: Atish Kumar Patra Date: Mon, 23 Mar 2015 14:49:35 -0600 Subject: [PATCH] net: ipc_router: Add write_space callback Flow control events in IPC Router are posted through a resume_tx message. For clients that prefer a callback approach, add support for write_space callback to notify about the flow control events. The resume_tx message is not posted for such clients. Change-Id: Iae25fd78f190bc7aeb7311ece68b3be407a1f910 Signed-off-by: Atish Kumar Patra --- net/ipc_router/ipc_router_core.c | 13 ++++++++++++- net/ipc_router/ipc_router_socket.c | 1 + 2 files changed, 13 insertions(+), 1 deletion(-) 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;