tty: Convert tty_struct bitfield to ints
authorPeter Hurley <peter@hurleysoftware.com>
Wed, 10 Sep 2014 19:06:30 +0000 (15:06 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 24 Sep 2014 04:19:35 +0000 (21:19 -0700)
The stopped, hw_stopped, flow_stopped and packet bits are smp-unsafe
and interrupt-unsafe. For example,

CPU 0                         | CPU 1
                              |
tty->flow_stopped = 1         | tty->hw_stopped = 0

One of these updates will be corrupted, as the bitwise operation
on the bitfield is non-atomic.

Ensure each flag has a separate memory location, so concurrent
updates do not corrupt orthogonal states. Because DEC Alpha EV4 and EV5
cpus (from 1995) perform RMW on smaller-than-machine-word storage,
"separate memory location" must be int instead of byte.

Signed-off-by: Peter Hurley <peter@hurleysoftware.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
include/linux/tty.h

index 84132942902afc7f000abdf4a560c5e68b2797f4..4cfd4a82fc31a9ab01253b8cd0401be8dd0962ab 100644 (file)
@@ -261,7 +261,10 @@ struct tty_struct {
        unsigned long flags;
        int count;
        struct winsize winsize;         /* winsize_mutex */
-       unsigned char stopped:1, hw_stopped:1, flow_stopped:1, packet:1;
+       int stopped;
+       int flow_stopped;
+       int hw_stopped;
+       int packet;
        unsigned char ctrl_status;      /* ctrl_lock */
        unsigned int receive_room;      /* Bytes free for queue */
        int flow_change;