staging: most: i2c: remove redundant list_mutex
authorChristian Gromm <christian.gromm@microchip.com>
Tue, 8 May 2018 09:45:01 +0000 (11:45 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 8 May 2018 11:41:49 +0000 (13:41 +0200)
The elements of the dev->rx.list are consumed in the pending_rx_work and
populated in the function enqueue() that cancels the pending_rx_work.

The function enqueue() and poison_channel() do not race anyway.

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/i2c/i2c.c

index 8edced998f5a3187e936c277d5e46af837761ca5..f0d5b222f40abd5881e2c74ee06ebcf48100300c 100644 (file)
@@ -46,7 +46,6 @@ struct hdm_i2c {
        struct rx {
                struct delayed_work dwork;
                struct list_head list;
-               struct mutex list_mutex;
                bool int_disabled;
                unsigned int delay;
        } rx;
@@ -139,9 +138,7 @@ static int enqueue(struct most_interface *most_iface,
                if (!dev->polling_mode)
                        disable_irq(dev->client->irq);
                cancel_delayed_work_sync(&dev->rx.dwork);
-               mutex_lock(&dev->rx.list_mutex);
                list_add_tail(&mbo->list, &dev->rx.list);
-               mutex_unlock(&dev->rx.list_mutex);
                if (dev->rx.int_disabled || dev->polling_mode)
                        pending_rx_work(&dev->rx.dwork.work);
                if (!dev->polling_mode)
@@ -186,19 +183,14 @@ static int poison_channel(struct most_interface *most_iface,
                        free_irq(dev->client->irq, dev);
                cancel_delayed_work_sync(&dev->rx.dwork);
 
-               mutex_lock(&dev->rx.list_mutex);
                while (!list_empty(&dev->rx.list)) {
                        mbo = list_first_mbo(&dev->rx.list);
                        list_del(&mbo->list);
-                       mutex_unlock(&dev->rx.list_mutex);
 
                        mbo->processed_length = 0;
                        mbo->status = MBO_E_CLOSE;
                        mbo->complete(mbo);
-
-                       mutex_lock(&dev->rx.list_mutex);
                }
-               mutex_unlock(&dev->rx.list_mutex);
        }
 
        return 0;
@@ -231,10 +223,8 @@ static void do_rx_work(struct hdm_i2c *dev)
                return;
        }
 
-       mutex_lock(&dev->rx.list_mutex);
        mbo = list_first_mbo(&dev->rx.list);
        list_del(&mbo->list);
-       mutex_unlock(&dev->rx.list_mutex);
 
        mbo->processed_length = min(data_size, mbo->buffer_length);
        memcpy(mbo->virt_address, msg, mbo->processed_length);
@@ -251,12 +241,8 @@ static void do_rx_work(struct hdm_i2c *dev)
 static void pending_rx_work(struct work_struct *work)
 {
        struct hdm_i2c *dev = container_of(work, struct hdm_i2c, rx.dwork.work);
-       bool empty;
 
-       mutex_lock(&dev->rx.list_mutex);
-       empty = list_empty(&dev->rx.list);
-       mutex_unlock(&dev->rx.list_mutex);
-       if (empty)
+       if (list_empty(&dev->rx.list))
                return;
 
        do_rx_work(dev);
@@ -340,7 +326,6 @@ static int i2c_probe(struct i2c_client *client, const struct i2c_device_id *id)
        dev->most_iface.poison_channel = poison_channel;
 
        INIT_LIST_HEAD(&dev->rx.list);
-       mutex_init(&dev->rx.list_mutex);
 
        INIT_DELAYED_WORK(&dev->rx.dwork, pending_rx_work);