net: ipc_router: Fix remote port conn_info memory leak

conn_info is used to connect the local port with destination port
address and is freed only for remote server cleanup in SSR case
which leads memory leak for other remote ports which valid conn_info.

Free the conn_info structure for all remote ports during the SSR and
while handling remove client message.

CRs-Fixed: 1057219
Change-Id: I164a9eb308f5779d545766b18bb41184c49bbb3d
Signed-off-by: Arun Kumar Neelakantam <aneela@codeaurora.org>
This commit is contained in:
Arun Kumar Neelakantam 2016-08-26 18:54:09 +05:30
parent e97b6a0e02
commit eb1c2c4105

View file

@ -2176,7 +2176,6 @@ static void cleanup_rmt_server(struct msm_ipc_router_xprt_info *xprt_info,
{
union rr_control_msg ctl;
ipc_router_reset_conn(rport_ptr);
memset(&ctl, 0, sizeof(ctl));
ctl.cmd = IPC_ROUTER_CTRL_CMD_REMOVE_SERVER;
ctl.srv.service = server->name.service;
@ -2207,6 +2206,7 @@ static void cleanup_rmt_ports(struct msm_ipc_router_xprt_info *xprt_info,
server = rport_ptr->server;
rport_ptr->server = NULL;
mutex_unlock(&rport_ptr->rport_lock_lhb2);
ipc_router_reset_conn(rport_ptr);
if (server) {
cleanup_rmt_server(xprt_info, rport_ptr,
server);
@ -2361,13 +2361,13 @@ static void ipc_router_reset_conn(struct msm_ipc_router_remote_port *rport_ptr)
list_for_each_entry_safe(conn_info, tmp_conn_info,
&rport_ptr->conn_info_list, list) {
port_ptr = ipc_router_get_port_ref(conn_info->port_id);
if (!port_ptr)
continue;
mutex_lock(&port_ptr->port_lock_lhc3);
port_ptr->conn_status = CONNECTION_RESET;
mutex_unlock(&port_ptr->port_lock_lhc3);
wake_up(&port_ptr->port_rx_wait_q);
kref_put(&port_ptr->ref, ipc_router_release_port);
if (port_ptr) {
mutex_lock(&port_ptr->port_lock_lhc3);
port_ptr->conn_status = CONNECTION_RESET;
mutex_unlock(&port_ptr->port_lock_lhc3);
wake_up(&port_ptr->port_rx_wait_q);
kref_put(&port_ptr->ref, ipc_router_release_port);
}
list_del(&conn_info->list);
kfree(conn_info);
@ -2651,6 +2651,7 @@ static int process_rmv_client_msg(struct msm_ipc_router_xprt_info *xprt_info,
server = rport_ptr->server;
rport_ptr->server = NULL;
mutex_unlock(&rport_ptr->rport_lock_lhb2);
ipc_router_reset_conn(rport_ptr);
down_write(&server_list_lock_lha2);
if (server)
cleanup_rmt_server(NULL, rport_ptr, server);