Merge "net: ipc_router: Initialize IPC Router on a first interface attempt"

This commit is contained in:
Linux Build Service Account 2014-07-15 21:45:10 -07:00 committed by Gerrit - the friendly Code Review server
commit 668164c6bd
1 changed files with 24 additions and 15 deletions

View File

@ -187,7 +187,9 @@ static void do_read_data(struct work_struct *work);
static LIST_HEAD(xprt_info_list); static LIST_HEAD(xprt_info_list);
static DECLARE_RWSEM(xprt_info_list_lock_lha5); static DECLARE_RWSEM(xprt_info_list_lock_lha5);
static DECLARE_COMPLETION(msm_ipc_local_router_up); static DEFINE_MUTEX(ipc_router_init_lock);
static bool is_ipc_router_inited;
static int msm_ipc_router_init(void);
#define IPC_ROUTER_INIT_TIMEOUT (10 * HZ) #define IPC_ROUTER_INIT_TIMEOUT (10 * HZ)
static uint32_t next_port_id; static uint32_t next_port_id;
@ -2795,9 +2797,10 @@ struct msm_ipc_port *msm_ipc_router_create_port(
struct msm_ipc_port *port_ptr; struct msm_ipc_port *port_ptr;
int ret; int ret;
ret = wait_for_completion_interruptible(&msm_ipc_local_router_up); ret = msm_ipc_router_init();
if (ret < 0) { if (ret < 0) {
IPC_RTR_ERR("%s: Error waiting for local router\n", __func__); IPC_RTR_ERR("%s: Error %d initializing IPC Router\n",
__func__, ret);
return NULL; return NULL;
} }
@ -3311,16 +3314,13 @@ void msm_ipc_router_xprt_notify(struct msm_ipc_router_xprt *xprt,
struct msm_ipc_router_xprt_info *xprt_info = xprt->priv; struct msm_ipc_router_xprt_info *xprt_info = xprt->priv;
struct msm_ipc_router_xprt_work *xprt_work; struct msm_ipc_router_xprt_work *xprt_work;
struct rr_packet *pkt; struct rr_packet *pkt;
unsigned long ret; int ret;
if (!msm_ipc_router_workqueue) { ret = msm_ipc_router_init();
ret = wait_for_completion_timeout(&msm_ipc_local_router_up, if (ret < 0) {
IPC_ROUTER_INIT_TIMEOUT); IPC_RTR_ERR("%s: Error %d initializing IPC Router\n",
if (!ret || !msm_ipc_router_workqueue) { __func__, ret);
IPC_RTR_ERR("%s: IPC Router not initialized\n", return;
__func__);
return;
}
} }
switch (event) { switch (event) {
@ -3374,11 +3374,17 @@ void msm_ipc_router_xprt_notify(struct msm_ipc_router_xprt *xprt,
queue_work(xprt_info->workqueue, &xprt_info->read_data); queue_work(xprt_info->workqueue, &xprt_info->read_data);
} }
static int __init msm_ipc_router_init(void) static int msm_ipc_router_init(void)
{ {
int i, ret; int i, ret;
struct msm_ipc_routing_table_entry *rt_entry; struct msm_ipc_routing_table_entry *rt_entry;
mutex_lock(&ipc_router_init_lock);
if (likely(is_ipc_router_inited)) {
mutex_unlock(&ipc_router_init_lock);
return 0;
}
msm_ipc_router_debug_mask |= SMEM_LOG; msm_ipc_router_debug_mask |= SMEM_LOG;
ipc_rtr_log_ctxt = ipc_log_context_create(IPC_RTR_LOG_PAGES, ipc_rtr_log_ctxt = ipc_log_context_create(IPC_RTR_LOG_PAGES,
"ipc_router", 0); "ipc_router", 0);
@ -3413,9 +3419,12 @@ static int __init msm_ipc_router_init(void)
msm_ipc_router_workqueue = msm_ipc_router_workqueue =
create_singlethread_workqueue("msm_ipc_router"); create_singlethread_workqueue("msm_ipc_router");
if (!msm_ipc_router_workqueue) if (!msm_ipc_router_workqueue) {
mutex_unlock(&ipc_router_init_lock);
return -ENOMEM; return -ENOMEM;
complete_all(&msm_ipc_local_router_up); }
is_ipc_router_inited = true;
mutex_unlock(&ipc_router_init_lock);
return ret; return ret;
} }