Commit eb50842c authored by Christian Gromm's avatar Christian Gromm Committed by Greg Kroah-Hartman

staging: most: i2c: remove redundant list_mutex

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: default avatarAndrey Shvetsov <andrey.shvetsov@k2l.de>
Signed-off-by: default avatarChristian Gromm <christian.gromm@microchip.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 6471c269
...@@ -46,7 +46,6 @@ struct hdm_i2c { ...@@ -46,7 +46,6 @@ struct hdm_i2c {
struct rx { struct rx {
struct delayed_work dwork; struct delayed_work dwork;
struct list_head list; struct list_head list;
struct mutex list_mutex;
bool int_disabled; bool int_disabled;
unsigned int delay; unsigned int delay;
} rx; } rx;
...@@ -139,9 +138,7 @@ static int enqueue(struct most_interface *most_iface, ...@@ -139,9 +138,7 @@ static int enqueue(struct most_interface *most_iface,
if (!dev->polling_mode) if (!dev->polling_mode)
disable_irq(dev->client->irq); disable_irq(dev->client->irq);
cancel_delayed_work_sync(&dev->rx.dwork); cancel_delayed_work_sync(&dev->rx.dwork);
mutex_lock(&dev->rx.list_mutex);
list_add_tail(&mbo->list, &dev->rx.list); list_add_tail(&mbo->list, &dev->rx.list);
mutex_unlock(&dev->rx.list_mutex);
if (dev->rx.int_disabled || dev->polling_mode) if (dev->rx.int_disabled || dev->polling_mode)
pending_rx_work(&dev->rx.dwork.work); pending_rx_work(&dev->rx.dwork.work);
if (!dev->polling_mode) if (!dev->polling_mode)
...@@ -186,19 +183,14 @@ static int poison_channel(struct most_interface *most_iface, ...@@ -186,19 +183,14 @@ static int poison_channel(struct most_interface *most_iface,
free_irq(dev->client->irq, dev); free_irq(dev->client->irq, dev);
cancel_delayed_work_sync(&dev->rx.dwork); cancel_delayed_work_sync(&dev->rx.dwork);
mutex_lock(&dev->rx.list_mutex);
while (!list_empty(&dev->rx.list)) { while (!list_empty(&dev->rx.list)) {
mbo = list_first_mbo(&dev->rx.list); mbo = list_first_mbo(&dev->rx.list);
list_del(&mbo->list); list_del(&mbo->list);
mutex_unlock(&dev->rx.list_mutex);
mbo->processed_length = 0; mbo->processed_length = 0;
mbo->status = MBO_E_CLOSE; mbo->status = MBO_E_CLOSE;
mbo->complete(mbo); mbo->complete(mbo);
mutex_lock(&dev->rx.list_mutex);
} }
mutex_unlock(&dev->rx.list_mutex);
} }
return 0; return 0;
...@@ -231,10 +223,8 @@ static void do_rx_work(struct hdm_i2c *dev) ...@@ -231,10 +223,8 @@ static void do_rx_work(struct hdm_i2c *dev)
return; return;
} }
mutex_lock(&dev->rx.list_mutex);
mbo = list_first_mbo(&dev->rx.list); mbo = list_first_mbo(&dev->rx.list);
list_del(&mbo->list); list_del(&mbo->list);
mutex_unlock(&dev->rx.list_mutex);
mbo->processed_length = min(data_size, mbo->buffer_length); mbo->processed_length = min(data_size, mbo->buffer_length);
memcpy(mbo->virt_address, msg, mbo->processed_length); memcpy(mbo->virt_address, msg, mbo->processed_length);
...@@ -251,12 +241,8 @@ static void do_rx_work(struct hdm_i2c *dev) ...@@ -251,12 +241,8 @@ static void do_rx_work(struct hdm_i2c *dev)
static void pending_rx_work(struct work_struct *work) static void pending_rx_work(struct work_struct *work)
{ {
struct hdm_i2c *dev = container_of(work, struct hdm_i2c, rx.dwork.work); struct hdm_i2c *dev = container_of(work, struct hdm_i2c, rx.dwork.work);
bool empty;
mutex_lock(&dev->rx.list_mutex); if (list_empty(&dev->rx.list))
empty = list_empty(&dev->rx.list);
mutex_unlock(&dev->rx.list_mutex);
if (empty)
return; return;
do_rx_work(dev); do_rx_work(dev);
...@@ -340,7 +326,6 @@ static int i2c_probe(struct i2c_client *client, const struct i2c_device_id *id) ...@@ -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; dev->most_iface.poison_channel = poison_channel;
INIT_LIST_HEAD(&dev->rx.list); INIT_LIST_HEAD(&dev->rx.list);
mutex_init(&dev->rx.list_mutex);
INIT_DELAYED_WORK(&dev->rx.dwork, pending_rx_work); INIT_DELAYED_WORK(&dev->rx.dwork, pending_rx_work);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment