Skip to contentSkip to conversation

tty: Replace smp_rmb/smp_wmb with smp_load_acquire/smp_store_release

PATCH New Peter Hurley 1 participant 2 messages Jul 13, 2015 TTY layer and serial drivers

lore
Share & tools
lore
#0 lore raw

PATCH 1/2 tty: Replace smp_rmb/smp_wmb with smp_load_acquire/smp_store_release

Clarify flip buffer producer/consumer operation; the use of smp_load_acquire() and smp_store_release() more clearly indicates which memory access requires a barrier.

---
 drivers/tty/tty_buffer.c | 10 ++++------
 1 file changed, 4 insertions(+), 6 deletions(-)
drivers/tty/tty_buffer.c +4 -6
index 4cf263d..25ba5af 100644
@@ -291,12 +291,11 @@ static int __tty_buffer_request_room(struct tty_port *port, size_t size,
 			n->flags = flags;
 			buf->tail = n;
 			b->commit = b->used;
-			/* paired w/ barrier in flush_to_ldisc(); ensures the
+			/* paired w/ acquire in flush_to_ldisc(); ensures the
 			 * latest commit value can be read before the head is
 			 * advanced to the next buffer
 			 */
-			smp_wmb();
-			b->next = n;
+			smp_store_release(&b->next, n);
 		} else if (change)
 			size = 0;
 		else
@@ -488,12 +487,11 @@ static void flush_to_ldisc(struct work_struct *work)
 		if (atomic_read(&buf->priority))
 			break;
 
-		next = head->next;
-		/* paired w/ barrier in __tty_buffer_request_room();
+		/* paired w/ release in __tty_buffer_request_room();
 		 * ensures commit value read is not stale if the head
 		 * is advancing to the next buffer
 		 */
-		smp_rmb();
+		next = smp_load_acquire(&head->next);
 		count = head->commit - head->read;
 		if (!count) {
 			if (next == NULL) {
Signature · 1 line
2.4.5
#1 lore raw

PATCH 2/2 tty: buffers: Move hidden buffer index advance into outer loop

The advance of the 'read' buffer index belongs in the outer flip buffer consume loop, with the other buffer index arithmetic.

No functional change.

---
 drivers/tty/tty_buffer.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/tty/tty_buffer.c +1 -1
index 25ba5af..5a3fa89 100644
@@ -444,7 +444,6 @@ receive_buf(struct tty_struct *tty, struct tty_buffer *head, int count)
 		if (count)
 			disc->ops->receive_buf(tty, p, f, count);
 	}
-	head->read += count;
 	return count;
 }
 
@@ -506,6 +505,7 @@ static void flush_to_ldisc(struct work_struct *work)
 		count = receive_buf(tty, head, count);
 		if (!count)
 			break;
+		head->read += count;
 	}
 
 	mutex_unlock(&buf->lock);
Signature · 1 line
2.4.5