Merge "tspp: add locking to tspp_get_buffer() and tspp_release_buffer()"
diff --git a/drivers/misc/tspp.c b/drivers/misc/tspp.c
index 2dfa404..1ef9886 100644
--- a/drivers/misc/tspp.c
+++ b/drivers/misc/tspp.c
@@ -2210,6 +2210,7 @@
struct tspp_mem_buffer *buffer;
struct tspp_channel *channel;
struct tspp_device *pdev;
+ unsigned long flags;
if (channel_id >= TSPP_NUM_CHANNELS) {
pr_err("tspp: channel id out of range");
@@ -2220,9 +2221,13 @@
pr_err("tspp_get: can't find device %i", dev);
return NULL;
}
+
+ spin_lock_irqsave(&pdev->spinlock, flags);
+
channel = &pdev->channels[channel_id];
if (!channel->read) {
+ spin_unlock_irqrestore(&pdev->spinlock, flags);
pr_warn("tspp: no buffer to get on channel %i!",
channel->id);
return NULL;
@@ -2230,8 +2235,10 @@
buffer = channel->read;
/* see if we have any buffers ready to read */
- if (buffer->state != TSPP_BUF_STATE_DATA)
- return 0;
+ if (buffer->state != TSPP_BUF_STATE_DATA) {
+ spin_unlock_irqrestore(&pdev->spinlock, flags);
+ return NULL;
+ }
if (buffer->state == TSPP_BUF_STATE_DATA) {
/* mark the buffer as busy */
@@ -2241,6 +2248,8 @@
channel->read = channel->read->next;
}
+ spin_unlock_irqrestore(&pdev->spinlock, flags);
+
return &buffer->desc;
}
EXPORT_SYMBOL(tspp_get_buffer);
@@ -2261,6 +2270,7 @@
struct tspp_mem_buffer *buffer;
struct tspp_channel *channel;
struct tspp_device *pdev;
+ unsigned long flags;
if (channel_id >= TSPP_NUM_CHANNELS) {
pr_err("tspp: channel id out of range");
@@ -2271,6 +2281,9 @@
pr_err("tspp: can't find device %i", dev);
return -ENODEV;
}
+
+ spin_lock_irqsave(&pdev->spinlock, flags);
+
channel = &pdev->channels[channel_id];
if (descriptor_id > channel->buffer_count)
@@ -2288,12 +2301,14 @@
channel->locked = channel->locked->next;
if (!found) {
+ spin_unlock_irqrestore(&pdev->spinlock, flags);
pr_err("tspp: cant find desc %i", descriptor_id);
return -EINVAL;
}
/* make sure the buffer is in the expected state */
if (buffer->state != TSPP_BUF_STATE_LOCKED) {
+ spin_unlock_irqrestore(&pdev->spinlock, flags);
pr_err("tspp: buffer %i not locked", descriptor_id);
return -EINVAL;
}
@@ -2302,6 +2317,9 @@
if (tspp_queue_buffer(channel, buffer))
pr_warn("tspp: can't requeue buffer");
+
+ spin_unlock_irqrestore(&pdev->spinlock, flags);
+
return 0;
}
EXPORT_SYMBOL(tspp_release_buffer);