[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH v2 2/3] hvc_init(): Enforce one-time initialization.


  • To: xen-devel@xxxxxxxxxxxxxxxxxxx
  • From: Miche Baker-Harvey <miche@xxxxxxxxxx>
  • Date: Tue, 08 Nov 2011 11:29:43 -0800
  • Delivery-date: Mon, 14 Nov 2011 15:43:28 -0800
  • Domainkey-signature: a=rsa-sha1; s=beta; d=google.com; c=nofws; q=dns; h=subject:to:from:date:message-id:in-reply-to:references: user-agent:mime-version:content-type: content-transfer-encoding:x-system-of-record; b=qrNAvTQlUlq4lxNMMRWyI5mSjg/uyFi0w8rxwZmH0esPMhYh8LdNyuC3Niof3uU3z Sjr9woQJB0u9MI8qRliJw==
  • List-id: Xen developer discussion <xen-devel.lists.xensource.com>

hvc_init() must only be called once, and no thread should continue with 
hvc_alloc()
until after initialization is complete.  The original code does not enforce 
either
of these requirements.  A new mutex limits entry to hvc_init() to a single 
thread,
and blocks all later comers until it has completed.

This patch fixes multiple crash symptoms.

Signed-off-by: Miche Baker-Harvey <miche@xxxxxxxxxx>
---
 drivers/tty/hvc/hvc_console.c |   13 +++++++++++--
 1 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/drivers/tty/hvc/hvc_console.c b/drivers/tty/hvc/hvc_console.c
index b6b2d18..09a6159 100644
--- a/drivers/tty/hvc/hvc_console.c
+++ b/drivers/tty/hvc/hvc_console.c
@@ -29,8 +29,9 @@
 #include <linux/kernel.h>
 #include <linux/kthread.h>
 #include <linux/list.h>
-#include <linux/module.h>
 #include <linux/major.h>
+#include <linux/module.h>
+#include <linux/mutex.h>
 #include <linux/sysrq.h>
 #include <linux/tty.h>
 #include <linux/tty_flip.h>
@@ -84,6 +85,10 @@ static LIST_HEAD(hvc_structs);
  * list traversal.
  */
 static DEFINE_SPINLOCK(hvc_structs_lock);
+/*
+ * only one task does allocation at a time.
+ */
+static DEFINE_MUTEX(hvc_ports_mutex);
 
 /*
  * This value is used to assign a tty->index value to a hvc_struct based
@@ -825,11 +830,15 @@ struct hvc_struct *hvc_alloc(uint32_t vtermno, int data,
        int i;
 
        /* We wait until a driver actually comes along */
+       mutex_lock(&hvc_ports_mutex);
        if (!hvc_driver) {
                int err = hvc_init();
-               if (err)
+               if (err) {
+                       mutex_unlock(&hvc_ports_mutex);
                        return ERR_PTR(err);
+               }
        }
+       mutex_unlock(&hvc_ports_mutex);
 
        hp = kzalloc(ALIGN(sizeof(*hp), sizeof(long)) + outbuf_size,
                        GFP_KERNEL);


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.