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>
Šī revīzija ir iekļauta:

revīziju iesūtīja
Greg Kroah-Hartman

vecāks
d6c53c0e9b
revīzija
2e124b4a39
@@ -27,8 +27,7 @@ struct chan {
|
||||
void *data;
|
||||
};
|
||||
|
||||
extern void chan_interrupt(struct line *line,
|
||||
struct tty_struct *tty, int irq);
|
||||
extern void chan_interrupt(struct line *line, int irq);
|
||||
extern int parse_chan_pair(char *str, struct line *line, int device,
|
||||
const struct chan_opts *opts, char **error_out);
|
||||
extern int write_chan(struct chan *chan, const char *buf, int len,
|
||||
|
@@ -131,11 +131,9 @@ void chan_enable_winch(struct chan *chan, struct tty_struct *tty)
|
||||
static void line_timer_cb(struct work_struct *work)
|
||||
{
|
||||
struct line *line = container_of(work, struct line, task.work);
|
||||
struct tty_struct *tty = tty_port_tty_get(&line->port);
|
||||
|
||||
if (!line->throttled)
|
||||
chan_interrupt(line, tty, line->driver->read_irq);
|
||||
tty_kref_put(tty);
|
||||
chan_interrupt(line, line->driver->read_irq);
|
||||
}
|
||||
|
||||
int enable_chan(struct line *line)
|
||||
@@ -546,7 +544,7 @@ int parse_chan_pair(char *str, struct line *line, int device,
|
||||
return 0;
|
||||
}
|
||||
|
||||
void chan_interrupt(struct line *line, struct tty_struct *tty, int irq)
|
||||
void chan_interrupt(struct line *line, int irq)
|
||||
{
|
||||
struct tty_port *port = &line->port;
|
||||
struct chan *chan = line->chan_in;
|
||||
@@ -570,8 +568,11 @@ void chan_interrupt(struct line *line, struct tty_struct *tty, int irq)
|
||||
reactivate_fd(chan->fd, irq);
|
||||
if (err == -EIO) {
|
||||
if (chan->primary) {
|
||||
if (tty != NULL)
|
||||
struct tty_struct *tty = tty_port_tty_get(&line->port);
|
||||
if (tty != NULL) {
|
||||
tty_hangup(tty);
|
||||
tty_kref_put(tty);
|
||||
}
|
||||
if (line->chan_out != chan)
|
||||
close_one_chan(line->chan_out, 1);
|
||||
}
|
||||
@@ -580,6 +581,5 @@ void chan_interrupt(struct line *line, struct tty_struct *tty, int irq)
|
||||
return;
|
||||
}
|
||||
out:
|
||||
if (tty)
|
||||
tty_flip_buffer_push(tty);
|
||||
tty_flip_buffer_push(port);
|
||||
}
|
||||
|
@@ -19,11 +19,10 @@ static irqreturn_t line_interrupt(int irq, void *data)
|
||||
{
|
||||
struct chan *chan = data;
|
||||
struct line *line = chan->line;
|
||||
struct tty_struct *tty = tty_port_tty_get(&line->port);
|
||||
|
||||
if (line)
|
||||
chan_interrupt(line, tty, irq);
|
||||
tty_kref_put(tty);
|
||||
chan_interrupt(line, irq);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
@@ -234,7 +233,7 @@ void line_unthrottle(struct tty_struct *tty)
|
||||
struct line *line = tty->driver_data;
|
||||
|
||||
line->throttled = 0;
|
||||
chan_interrupt(line, tty, line->driver->read_irq);
|
||||
chan_interrupt(line, line->driver->read_irq);
|
||||
|
||||
/*
|
||||
* Maybe there is enough stuff pending that calling the interrupt
|
||||
|
Atsaukties uz šo jaunā problēmā
Block a user