Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

tty: Convert tty_struct bitfield to ints

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>

authored by

Peter Hurley and committed by
Greg Kroah-Hartman
d7a855bd 938f7e13

+4 -1
+4 -1
include/linux/tty.h
··· 261 261 unsigned long flags; 262 262 int count; 263 263 struct winsize winsize; /* winsize_mutex */ 264 - unsigned char stopped:1, hw_stopped:1, flow_stopped:1, packet:1; 264 + int stopped; 265 + int flow_stopped; 266 + int hw_stopped; 267 + int packet; 265 268 unsigned char ctrl_status; /* ctrl_lock */ 266 269 unsigned int receive_room; /* Bytes free for queue */ 267 270 int flow_change;