staging: most: dim2-hdm: fix race condition when closing a channel
authorChristian Gromm <christian.gromm@microchip.com>
Mon, 13 Jun 2016 14:24:23 +0000 (16:24 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 15 Aug 2016 18:18:55 +0000 (20:18 +0200)
This patch fixes race between the function poison_channel that clears
the state is_initialized and the tasklet function dim2_tasklet_fn that
checks the state is_initialized.

Signed-off-by: Andrey Shvetsov <andrey.shvetsov@k2l.de>
Signed-off-by: Christian Gromm <christian.gromm@microchip.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/most/hdm-dim2/dim2_hdm.c

index a364495515136426a92462e6838599a4d94c36e0..89a66bb914e4da0784f95d1c565fd162c2763fe5 100644 (file)
@@ -705,12 +705,14 @@ static int poison_channel(struct most_interface *most_iface, int ch_idx)
        if (!hdm_ch->is_initialized)
                return -EPERM;
 
+       tasklet_disable(&dim2_tasklet);
        spin_lock_irqsave(&dim_lock, flags);
        hal_ret = dim_destroy_channel(&hdm_ch->ch);
        hdm_ch->is_initialized = false;
        if (ch_idx == dev->atx_idx)
                dev->atx_idx = -1;
        spin_unlock_irqrestore(&dim_lock, flags);
+       tasklet_enable(&dim2_tasklet);
        if (hal_ret != DIM_NO_ERROR) {
                pr_err("HAL Failed to close channel %s\n", hdm_ch->name);
                ret = -EFAULT;