From 055835e5b06d7f18d94ca1d6b2df5f0a3ec3e954 Mon Sep 17 00:00:00 2001 From: dimitri staessens Date: Fri, 4 Aug 2017 11:47:41 +0200 Subject: irmd: Release lock before ipcp_query The blocking ipcp_query call was called under reg_lock, causing flow_allocs over the shim-eth-llc to block the irmd for prolonged timespans. --- src/irmd/main.c | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/src/irmd/main.c b/src/irmd/main.c index 63ae6b13..912234d6 100644 --- a/src/irmd/main.c +++ b/src/irmd/main.c @@ -232,10 +232,14 @@ static struct ipcp_entry * get_ipcp_entry_by_name(const char * name) static struct ipcp_entry * get_ipcp_by_dst_name(const char * name) { - struct list_head * p = NULL; - uint8_t * hash; + struct list_head * p; + struct list_head * h; + uint8_t * hash; + pid_t api; - list_for_each(p, &irmd.ipcps) { + pthread_rwlock_rdlock(&irmd.reg_lock); + + list_for_each_safe(p, h, &irmd.ipcps) { struct ipcp_entry * e = list_entry(p, struct ipcp_entry, next); if (e->dif_name == NULL) continue; @@ -246,14 +250,22 @@ static struct ipcp_entry * get_ipcp_by_dst_name(const char * name) str_hash(e->dir_hash_algo, hash, name); - if (ipcp_query(e->api, hash, IPCP_HASH_LEN(e)) == 0) { + api = e->api; + + pthread_rwlock_unlock(&irmd.reg_lock); + + if (ipcp_query(api, hash, IPCP_HASH_LEN(e)) == 0) { free(hash); return e; } free(hash); + + pthread_rwlock_rdlock(&irmd.reg_lock); } + pthread_rwlock_unlock(&irmd.reg_lock); + return NULL; } @@ -1099,16 +1111,12 @@ static int flow_alloc(pid_t api, int state; uint8_t * hash; - pthread_rwlock_rdlock(&irmd.reg_lock); - ipcp = get_ipcp_by_dst_name(dst); if (ipcp == NULL) { - pthread_rwlock_unlock(&irmd.reg_lock); log_info("Destination %s unreachable.", dst); return -1; } - pthread_rwlock_unlock(&irmd.reg_lock); pthread_rwlock_wrlock(&irmd.flows_lock); port_id = bmp_allocate(irmd.port_ids); if (!bmp_is_id_valid(irmd.port_ids, port_id)) { -- cgit v1.2.3 From 0fe8d5aa50fcadc3b4eef65b2833944a76eb8f3e Mon Sep 17 00:00:00 2001 From: dimitri staessens Date: Fri, 4 Aug 2017 11:55:49 +0200 Subject: ipcpd: Fix missing space in shim-eth-llc --- src/ipcpd/shim-eth-llc/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ipcpd/shim-eth-llc/main.c b/src/ipcpd/shim-eth-llc/main.c index 4899cd83..dcbbc047 100644 --- a/src/ipcpd/shim-eth-llc/main.c +++ b/src/ipcpd/shim-eth-llc/main.c @@ -1037,7 +1037,7 @@ static int eth_llc_ipcp_flow_alloc_resp(int fd, pthread_mutex_lock(&ipcpi.alloc_lock); - while (ipcpi.alloc_id != fd && ipcp_get_state() == IPCP_OPERATIONAL){ + while (ipcpi.alloc_id != fd && ipcp_get_state() == IPCP_OPERATIONAL) { ts_add(&abstime, &ts, &abstime); pthread_cond_timedwait(&ipcpi.alloc_cond, &ipcpi.alloc_lock, -- cgit v1.2.3