Files
linux/drivers/tty
Paul Gortmaker df55b19e5b hvc: ensure hvc_init is only ever called once in hvc_console.c
commit f76a1cbed1 upstream.

Commit 3e6c6f630a ("Delay creation of
khcvd thread") moved the call of hvc_init from being a device_initcall
into hvc_alloc, and used a non-null hvc_driver as indication of whether
hvc_init had already been called.

The problem with this is that hvc_driver is only assigned a value
at the bottom of hvc_init, and so there is a window where multiple
hvc_alloc calls can be in progress at the same time and hence try
and call hvc_init multiple times.  Previously the use of device_init
guaranteed that hvc_init was only called once.

This manifests itself as sporadic instances of two hvc_init calls
racing each other, and with the loser of the race getting -EBUSY
from tty_register_driver() and hence that virtual console fails:

    Couldn't register hvc console driver
    virtio-ports vport0p1: error -16 allocating hvc for port

Here we add an atomic_t to guarantee we'll never run hvc_init twice.

Cc: Rusty Russell <rusty@rustcorp.com.au>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Fixes: 3e6c6f630a ("Delay creation of khcvd thread")
Reported-by: Jim Somerville <Jim.Somerville@windriver.com>
Tested-by: Jim Somerville <Jim.Somerville@windriver.com>
Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2014-05-06 07:59:33 -07:00
..
2014-04-26 17:19:04 -07:00
2014-02-13 11:12:00 -08:00
2013-01-15 22:30:15 -08:00
2013-03-18 16:24:29 -07:00
2011-03-31 11:26:23 -03:00
2013-12-08 16:56:05 -08:00
2014-02-13 10:02:19 -08:00
2013-10-16 13:08:16 -07:00
2013-07-24 15:12:53 -07:00
2014-01-07 17:05:21 -08:00
2014-04-26 17:19:04 -07:00
2013-12-16 16:55:43 -08:00