TTY/Serial fixes for 3.18-rc4
Here are some tiny serial/tty fixes for 3.18-rc4 that resolve some reported issues. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iEYEABECAAYFAlReZmgACgkQMUfUDdst+ymt1wCgj+RYlAC//NhPIjTHmvHHb9gs 8o0AoJErubEEF3VgbAjvQg1lPr8xSHtR =7Gmf -----END PGP SIGNATURE----- Merge tag 'tty-3.18-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty Pull tty/serial fixes from Greg KH: "Here are some tiny serial/tty fixes for 3.18-rc4 that resolve some reported issues" * tag 'tty-3.18-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty: tty: Fix pty master poll() after slave closes v2 serial: of-serial: fix uninitialized kmalloc variable tty/vt: don't set font mappings on vc not supporting this tty: serial: 8250_mtk: Fix quot calculation tty: Prevent "read/write wait queue active!" log flooding tty: Fix high cpu load if tty is unreleaseable serial: Fix divide-by-zero fault in uart_get_divisor()
This commit is contained in:
Коммит
45a4c0794d
|
@ -2413,12 +2413,17 @@ static unsigned int n_tty_poll(struct tty_struct *tty, struct file *file,
|
|||
|
||||
poll_wait(file, &tty->read_wait, wait);
|
||||
poll_wait(file, &tty->write_wait, wait);
|
||||
if (input_available_p(tty, 1))
|
||||
mask |= POLLIN | POLLRDNORM;
|
||||
if (tty->packet && tty->link->ctrl_status)
|
||||
mask |= POLLPRI | POLLIN | POLLRDNORM;
|
||||
if (test_bit(TTY_OTHER_CLOSED, &tty->flags))
|
||||
mask |= POLLHUP;
|
||||
if (input_available_p(tty, 1))
|
||||
mask |= POLLIN | POLLRDNORM;
|
||||
else if (mask & POLLHUP) {
|
||||
tty_flush_to_ldisc(tty);
|
||||
if (input_available_p(tty, 1))
|
||||
mask |= POLLIN | POLLRDNORM;
|
||||
}
|
||||
if (tty->packet && tty->link->ctrl_status)
|
||||
mask |= POLLPRI | POLLIN | POLLRDNORM;
|
||||
if (tty_hung_up_p(file))
|
||||
mask |= POLLHUP;
|
||||
if (!(mask & (POLLHUP | POLLIN | POLLRDNORM))) {
|
||||
|
|
|
@ -81,7 +81,7 @@ mtk8250_set_termios(struct uart_port *port, struct ktermios *termios,
|
|||
/* Set to highest baudrate supported */
|
||||
if (baud >= 1152000)
|
||||
baud = 921600;
|
||||
quot = DIV_ROUND_CLOSEST(port->uartclk, 256 * baud);
|
||||
quot = (port->uartclk / (256 * baud)) + 1;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -158,7 +158,7 @@ static int of_platform_serial_probe(struct platform_device *ofdev)
|
|||
if (of_find_property(ofdev->dev.of_node, "used-by-rtas", NULL))
|
||||
return -EBUSY;
|
||||
|
||||
info = kmalloc(sizeof(*info), GFP_KERNEL);
|
||||
info = kzalloc(sizeof(*info), GFP_KERNEL);
|
||||
if (info == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
|
|
|
@ -363,7 +363,7 @@ uart_get_baud_rate(struct uart_port *port, struct ktermios *termios,
|
|||
* The spd_hi, spd_vhi, spd_shi, spd_warp kludge...
|
||||
* Die! Die! Die!
|
||||
*/
|
||||
if (baud == 38400)
|
||||
if (try == 0 && baud == 38400)
|
||||
baud = altbaud;
|
||||
|
||||
/*
|
||||
|
|
|
@ -1709,6 +1709,8 @@ int tty_release(struct inode *inode, struct file *filp)
|
|||
int pty_master, tty_closing, o_tty_closing, do_sleep;
|
||||
int idx;
|
||||
char buf[64];
|
||||
long timeout = 0;
|
||||
int once = 1;
|
||||
|
||||
if (tty_paranoia_check(tty, inode, __func__))
|
||||
return 0;
|
||||
|
@ -1789,11 +1791,18 @@ int tty_release(struct inode *inode, struct file *filp)
|
|||
if (!do_sleep)
|
||||
break;
|
||||
|
||||
printk(KERN_WARNING "%s: %s: read/write wait queue active!\n",
|
||||
__func__, tty_name(tty, buf));
|
||||
if (once) {
|
||||
once = 0;
|
||||
printk(KERN_WARNING "%s: %s: read/write wait queue active!\n",
|
||||
__func__, tty_name(tty, buf));
|
||||
}
|
||||
tty_unlock_pair(tty, o_tty);
|
||||
mutex_unlock(&tty_mutex);
|
||||
schedule();
|
||||
schedule_timeout_killable(timeout);
|
||||
if (timeout < 120 * HZ)
|
||||
timeout = 2 * timeout + 1;
|
||||
else
|
||||
timeout = MAX_SCHEDULE_TIMEOUT;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -539,6 +539,12 @@ int con_set_unimap(struct vc_data *vc, ushort ct, struct unipair __user *list)
|
|||
|
||||
/* Save original vc_unipagdir_loc in case we allocate a new one */
|
||||
p = *vc->vc_uni_pagedir_loc;
|
||||
|
||||
if (!p) {
|
||||
err = -EINVAL;
|
||||
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
if (p->refcount > 1) {
|
||||
int j, k;
|
||||
|
@ -623,6 +629,7 @@ int con_set_unimap(struct vc_data *vc, ushort ct, struct unipair __user *list)
|
|||
set_inverse_transl(vc, p, i); /* Update inverse translations */
|
||||
set_inverse_trans_unicode(vc, p);
|
||||
|
||||
out_unlock:
|
||||
console_unlock();
|
||||
return err;
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче