From 1e0a8ea7125e157799d3581ecfbe88462e93713b Mon Sep 17 00:00:00 2001 From: Pierre Peiffer Date: Thu, 20 Oct 2011 13:09:01 +0200 Subject: U8500 CM: fix re-entrancy issue Fix a re-entrancy issue when killing two processes that use the CM driver simultaneously. ST-Ericsson ID: 364585 ST-Ericsson Linux next: NA ST-Ericsson FOSS-OUT ID: Trivial Change-Id: I48cb434b87a85b635fe4506a92d7b1c7086071fb Signed-off-by: Pierre Peiffer Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/35216 Reviewed-by: QATOOLS Reviewed-by: QABUILD --- drivers/staging/nmf-cm/cmld.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/drivers/staging/nmf-cm/cmld.c b/drivers/staging/nmf-cm/cmld.c index d96ceaa3fe5..925ce038862 100644 --- a/drivers/staging/nmf-cm/cmld.c +++ b/drivers/staging/nmf-cm/cmld.c @@ -165,16 +165,15 @@ static inline void freeChannels(struct cm_process_priv* processPriv) { struct list_head* head, *next; int warn = 0; - + + mutex_lock(&channel_lock); list_for_each_safe(head, next, &channel_list) { struct cm_channel_priv *channelPriv; channelPriv = list_entry(head, struct cm_channel_priv, entry); /* Only channels belonging to this process are concerned */ if (channelPriv->proc == processPriv) { tasklet_disable(&cmld_service_tasklet); - mutex_lock(&channel_lock); list_del(&channelPriv->entry); - mutex_unlock(&channel_lock); tasklet_enable(&cmld_service_tasklet); /* Free all remaining messages if any @@ -190,6 +189,8 @@ static inline void freeChannels(struct cm_process_priv* processPriv) } warn = 1; } + mutex_unlock(&channel_lock); + if (warn) pr_err("[CM - PID=%d]: Some remaining channel entries " "freed\n", current->tgid); -- cgit v1.2.3