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 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)
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;
int ret;
ret = wait_for_completion_interruptible(&msm_ipc_local_router_up);
ret = msm_ipc_router_init();
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;
}
@ -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_work *xprt_work;
struct rr_packet *pkt;
unsigned long ret;
int ret;
if (!msm_ipc_router_workqueue) {
ret = wait_for_completion_timeout(&msm_ipc_local_router_up,
IPC_ROUTER_INIT_TIMEOUT);
if (!ret || !msm_ipc_router_workqueue) {
IPC_RTR_ERR("%s: IPC Router not initialized\n",
__func__);
return;
}
ret = msm_ipc_router_init();
if (ret < 0) {
IPC_RTR_ERR("%s: Error %d initializing IPC Router\n",
__func__, ret);
return;
}
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);
}
static int __init msm_ipc_router_init(void)
static int msm_ipc_router_init(void)
{
int i, ret;
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;
ipc_rtr_log_ctxt = ipc_log_context_create(IPC_RTR_LOG_PAGES,
"ipc_router", 0);
@ -3413,9 +3419,12 @@ static int __init msm_ipc_router_init(void)
msm_ipc_router_workqueue =
create_singlethread_workqueue("msm_ipc_router");
if (!msm_ipc_router_workqueue)
if (!msm_ipc_router_workqueue) {
mutex_unlock(&ipc_router_init_lock);
return -ENOMEM;
complete_all(&msm_ipc_local_router_up);
}
is_ipc_router_inited = true;
mutex_unlock(&ipc_router_init_lock);
return ret;
}