TTY: switch tty_flip_buffer_push
Now, we start converting tty buffer functions to actually use tty_port. This will allow us to get rid of the need of tty in many call sites. Only tty_port will needed and hence no more tty_port_tty_get in those paths. Now, the one where most of tty_port_tty_get gets removed: tty_flip_buffer_push. IOW we also closed all the races in drivers not using tty_port_tty_get at all yet. Also we move tty_flip_buffer_push declaration from include/linux/tty.h to include/linux/tty_flip.h to all others while we are changing it anyway. Signed-off-by: Jiri Slaby <jslaby@suse.cz> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:

committed by
Greg Kroah-Hartman

parent
d6c53c0e9b
commit
2e124b4a39
@@ -227,21 +227,19 @@ static void pmz_interrupt_control(struct uart_pmac_port *uap, int enable)
|
||||
write_zsreg(uap, R1, uap->curregs[1]);
|
||||
}
|
||||
|
||||
static struct tty_struct *pmz_receive_chars(struct uart_pmac_port *uap)
|
||||
static bool pmz_receive_chars(struct uart_pmac_port *uap)
|
||||
{
|
||||
struct tty_port *port;
|
||||
struct tty_struct *tty = NULL;
|
||||
unsigned char ch, r1, drop, error, flag;
|
||||
int loops = 0;
|
||||
|
||||
/* Sanity check, make sure the old bug is no longer happening */
|
||||
if (uap->port.state == NULL || uap->port.state->port.tty == NULL) {
|
||||
if (uap->port.state == NULL) {
|
||||
WARN_ON(1);
|
||||
(void)read_zsdata(uap);
|
||||
return NULL;
|
||||
return false;
|
||||
}
|
||||
port = &uap->port.state->port;
|
||||
tty = port->tty; /* TOCTOU above */
|
||||
|
||||
while (1) {
|
||||
error = 0;
|
||||
@@ -330,11 +328,11 @@ static struct tty_struct *pmz_receive_chars(struct uart_pmac_port *uap)
|
||||
break;
|
||||
}
|
||||
|
||||
return tty;
|
||||
return true;
|
||||
flood:
|
||||
pmz_interrupt_control(uap, 0);
|
||||
pmz_error("pmz: rx irq flood !\n");
|
||||
return tty;
|
||||
return true;
|
||||
}
|
||||
|
||||
static void pmz_status_handle(struct uart_pmac_port *uap)
|
||||
@@ -455,7 +453,7 @@ static irqreturn_t pmz_interrupt(int irq, void *dev_id)
|
||||
struct uart_pmac_port *uap_a;
|
||||
struct uart_pmac_port *uap_b;
|
||||
int rc = IRQ_NONE;
|
||||
struct tty_struct *tty;
|
||||
bool push;
|
||||
u8 r3;
|
||||
|
||||
uap_a = pmz_get_port_A(uap);
|
||||
@@ -468,7 +466,7 @@ static irqreturn_t pmz_interrupt(int irq, void *dev_id)
|
||||
pmz_debug("irq, r3: %x\n", r3);
|
||||
#endif
|
||||
/* Channel A */
|
||||
tty = NULL;
|
||||
push = false;
|
||||
if (r3 & (CHAEXT | CHATxIP | CHARxIP)) {
|
||||
if (!ZS_IS_OPEN(uap_a)) {
|
||||
pmz_debug("ChanA interrupt while not open !\n");
|
||||
@@ -479,21 +477,21 @@ static irqreturn_t pmz_interrupt(int irq, void *dev_id)
|
||||
if (r3 & CHAEXT)
|
||||
pmz_status_handle(uap_a);
|
||||
if (r3 & CHARxIP)
|
||||
tty = pmz_receive_chars(uap_a);
|
||||
push = pmz_receive_chars(uap_a);
|
||||
if (r3 & CHATxIP)
|
||||
pmz_transmit_chars(uap_a);
|
||||
rc = IRQ_HANDLED;
|
||||
}
|
||||
skip_a:
|
||||
spin_unlock(&uap_a->port.lock);
|
||||
if (tty != NULL)
|
||||
tty_flip_buffer_push(tty);
|
||||
if (push)
|
||||
tty_flip_buffer_push(&uap->port.state->port);
|
||||
|
||||
if (!uap_b)
|
||||
goto out;
|
||||
|
||||
spin_lock(&uap_b->port.lock);
|
||||
tty = NULL;
|
||||
push = false;
|
||||
if (r3 & (CHBEXT | CHBTxIP | CHBRxIP)) {
|
||||
if (!ZS_IS_OPEN(uap_b)) {
|
||||
pmz_debug("ChanB interrupt while not open !\n");
|
||||
@@ -504,15 +502,15 @@ static irqreturn_t pmz_interrupt(int irq, void *dev_id)
|
||||
if (r3 & CHBEXT)
|
||||
pmz_status_handle(uap_b);
|
||||
if (r3 & CHBRxIP)
|
||||
tty = pmz_receive_chars(uap_b);
|
||||
push = pmz_receive_chars(uap_b);
|
||||
if (r3 & CHBTxIP)
|
||||
pmz_transmit_chars(uap_b);
|
||||
rc = IRQ_HANDLED;
|
||||
}
|
||||
skip_b:
|
||||
spin_unlock(&uap_b->port.lock);
|
||||
if (tty != NULL)
|
||||
tty_flip_buffer_push(tty);
|
||||
if (push)
|
||||
tty_flip_buffer_push(&uap->port.state->port);
|
||||
|
||||
out:
|
||||
return rc;
|
||||
|
Reference in New Issue
Block a user