Skip to content

Commit

Permalink
msm/qsd: smd: avoid race condition in smd channel allocation
Browse files Browse the repository at this point in the history
Don't mark a channel as allocated if we failed to allocate it
(perhaps the modem updated one table but not the other, etc)

Signed-off-by: Brian Swetland <swetland@google.com>
Signed-off-by: Daniel Walker <dwalker@codeaurora.org>
  • Loading branch information
Brian Swetland authored and Daniel Walker committed May 12, 2010
1 parent 7632fba commit 34f719b
Showing 1 changed file with 7 additions and 6 deletions.
13 changes: 7 additions & 6 deletions arch/arm/mach-msm/smd.c
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ LIST_HEAD(smd_ch_list_dsp);
static unsigned char smd_ch_allocated[64];
static struct work_struct probe_work;

static void smd_alloc_channel(const char *name, uint32_t cid, uint32_t type);
static int smd_alloc_channel(const char *name, uint32_t cid, uint32_t type);

static void smd_channel_probe_worker(struct work_struct *work)
{
Expand Down Expand Up @@ -186,8 +186,8 @@ static void smd_channel_probe_worker(struct work_struct *work)
type = shared[n].ctype & SMD_TYPE_MASK;
if ((type == SMD_TYPE_APPS_MODEM) ||
(type == SMD_TYPE_APPS_DSP))
smd_alloc_channel(shared[n].name, shared[n].cid, ctype);
smd_ch_allocated[n] = 1;
if (!smd_alloc_channel(shared[n].name, shared[n].cid, ctype))
smd_ch_allocated[n] = 1;
}
}

Expand Down Expand Up @@ -641,20 +641,20 @@ static int smd_alloc_v1(struct smd_channel *ch)
}


static void smd_alloc_channel(const char *name, uint32_t cid, uint32_t type)
static int smd_alloc_channel(const char *name, uint32_t cid, uint32_t type)
{
struct smd_channel *ch;

ch = kzalloc(sizeof(struct smd_channel), GFP_KERNEL);
if (ch == 0) {
pr_err("smd_alloc_channel() out of memory\n");
return;
return -1;
}
ch->n = cid;

if (smd_alloc_v2(ch) && smd_alloc_v1(ch)) {
kfree(ch);
return;
return -1;
}

ch->fifo_mask = ch->fifo_size - 1;
Expand Down Expand Up @@ -696,6 +696,7 @@ static void smd_alloc_channel(const char *name, uint32_t cid, uint32_t type)
mutex_unlock(&smd_creation_mutex);

platform_device_register(&ch->pdev);
return 0;
}

static void do_nothing_notify(void *priv, unsigned flags)
Expand Down

0 comments on commit 34f719b

Please sign in to comment.