From patchwork Thu Aug 27 11:45:39 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hendrik Brueckner X-Patchwork-Id: 32343 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [199.232.76.165]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by bilbo.ozlabs.org (Postfix) with ESMTPS id 8765CB7DF9 for ; Fri, 28 Aug 2009 15:46:02 +1000 (EST) Received: from localhost ([127.0.0.1]:47718 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1MguHe-0004M9-NS for incoming@patchwork.ozlabs.org; Fri, 28 Aug 2009 01:45:58 -0400 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1MgdQM-0001dO-4r for qemu-devel@nongnu.org; Thu, 27 Aug 2009 07:45:50 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1MgdQH-0001aj-4T for qemu-devel@nongnu.org; Thu, 27 Aug 2009 07:45:49 -0400 Received: from [199.232.76.173] (port=33070 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1MgdQG-0001ac-OD for qemu-devel@nongnu.org; Thu, 27 Aug 2009 07:45:44 -0400 Received: from mtagate7.de.ibm.com ([195.212.17.167]:50496) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1MgdQG-00079x-0w for qemu-devel@nongnu.org; Thu, 27 Aug 2009 07:45:44 -0400 Received: from d12nrmr1607.megacenter.de.ibm.com (d12nrmr1607.megacenter.de.ibm.com [9.149.167.49]) by mtagate7.de.ibm.com (8.13.1/8.13.1) with ESMTP id n7RBjUtp023818 for ; Thu, 27 Aug 2009 11:45:30 GMT Received: from d12av04.megacenter.de.ibm.com (d12av04.megacenter.de.ibm.com [9.149.165.229]) by d12nrmr1607.megacenter.de.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id n7RBjUiF2212090 for ; Thu, 27 Aug 2009 13:45:30 +0200 Received: from d12av04.megacenter.de.ibm.com (loopback [127.0.0.1]) by d12av04.megacenter.de.ibm.com (8.12.11.20060308/8.13.3) with ESMTP id n7RBjTsZ014963 for ; Thu, 27 Aug 2009 13:45:29 +0200 Received: from cetus.boeblingen.de.ibm.com (dyn-9-152-212-88.boeblingen.de.ibm.com [9.152.212.88]) by d12av04.megacenter.de.ibm.com (8.12.11.20060308/8.12.11) with SMTP id n7RBjSpc014960; Thu, 27 Aug 2009 13:45:28 +0200 Date: Thu, 27 Aug 2009 13:45:39 +0200 From: Hendrik Brueckner To: Benjamin Herrenschmidt Message-ID: <20090827114538.GC5257@cetus.boeblingen.de.ibm.com> Mail-Followup-To: Hendrik Brueckner , Benjamin Herrenschmidt , Alan Cox , Amit Shah , qemu-devel@nongnu.org, kvm@vger.kernel.org, virtualization@lists.linux-foundation.org, borntraeger@de.ibm.com, linux-kernel@vger.kernel.org, miltonm@bga.com, linuxppc-dev@ozlabs.org, Carsten Otte , Heiko Carstens , Martin Schwidefsky References: <1251181044-3696-1-git-send-email-amit.shah@redhat.com> <20090826112718.GA11117@amit-x200.redhat.com> <20090826154552.GA31910@amit-x200.redhat.com> <1251346023.20467.21.camel@pasglop> <20090827100809.5f0aa0a7@linux.intel.com> <1251365243.20467.47.camel@pasglop> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <1251365243.20467.47.camel@pasglop> User-Agent: Mutt/1.5.18 (2008-05-17) X-detected-operating-system: by monty-python.gnu.org: GNU/Linux 2.6, seldom 2.4 (older, 4) X-Mailman-Approved-At: Fri, 28 Aug 2009 01:36:12 -0400 Cc: Carsten Otte , kvm@vger.kernel.org, linuxppc-dev@ozlabs.org, linux-kernel@vger.kernel.org, Heiko Carstens , qemu-devel@nongnu.org, miltonm@bga.com, virtualization@lists.linux-foundation.org, borntraeger@de.ibm.com, brueckner@linux.vnet.ibm.com, Amit Shah , Martin Schwidefsky , Alan Cox Subject: [Qemu-devel] [PATCH] hvc_console: provide (un)locked version for hvc_resize() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org On Thu, Aug 27, 2009 at 07:27:23PM +1000, Benjamin Herrenschmidt wrote: > On Thu, 2009-08-27 at 10:08 +0100, Alan Cox wrote: > So at this stage, I think the reasonably thing to do is to stick to the > spinlock, but we can try to make it a bit smarter, and we can definitely > attempt to fix the case Amit pointed out where we call resize without a > lock while it seems to expect it (though we also need to be careful > about re-entrancy I believe). I have worked on a patch for providing a locked hvc_resize() function. Since only two back-ends (virtio_console and hvc_iucv) use the function, I decided to update my hvc_iucv back-end through renaming the function call as follows: Rename the locking free hvc_resize() function to __hvc_resize() and provide an inline function that locks the hvc_struct and calls __hvc_resize(). The rationale for this patch is that virtio_console calls the hvc_resize() function without locking the hvc_struct. According to naming rules, the unlocked version is renamed and prefixed with "__". References to unlocked function calls in hvc back-ends has been updated. Signed-off-by: Hendrik Brueckner Acked-by: Christian Borntraeger --- drivers/char/hvc_console.c | 6 +++--- drivers/char/hvc_console.h | 12 +++++++++++- drivers/char/hvc_iucv.c | 4 +++- 3 files changed, 17 insertions(+), 5 deletions(-) --- a/drivers/char/hvc_console.c +++ b/drivers/char/hvc_console.c @@ -680,7 +680,7 @@ int hvc_poll(struct hvc_struct *hp) EXPORT_SYMBOL_GPL(hvc_poll); /** - * hvc_resize() - Update terminal window size information. + * __hvc_resize() - Update terminal window size information. * @hp: HVC console pointer * @ws: Terminal window size structure * @@ -689,12 +689,12 @@ EXPORT_SYMBOL_GPL(hvc_poll); * * Locking: Locking free; the function MUST be called holding hp->lock */ -void hvc_resize(struct hvc_struct *hp, struct winsize ws) +void __hvc_resize(struct hvc_struct *hp, struct winsize ws) { hp->ws = ws; schedule_work(&hp->tty_resize); } -EXPORT_SYMBOL_GPL(hvc_resize); +EXPORT_SYMBOL_GPL(__hvc_resize); /* * This kthread is either polling or interrupt driven. This is determined by --- a/drivers/char/hvc_console.h +++ b/drivers/char/hvc_console.h @@ -28,6 +28,7 @@ #define HVC_CONSOLE_H #include #include +#include /* * This is the max number of console adapters that can/will be found as @@ -88,7 +89,16 @@ int hvc_poll(struct hvc_struct *hp); void hvc_kick(void); /* Resize hvc tty terminal window */ -extern void hvc_resize(struct hvc_struct *hp, struct winsize ws); +extern void __hvc_resize(struct hvc_struct *hp, struct winsize ws); + +static inline void hvc_resize(struct hvc_struct *hp, struct winsize ws) +{ + unsigned long flags; + + spin_lock_irqsave(&hp->lock, flags); + __hvc_resize(hp, ws); + spin_unlock_irqrestore(&hp->lock, flags); +} /* default notifier for irq based notification */ extern int notifier_add_irq(struct hvc_struct *hp, int data); --- a/drivers/char/hvc_iucv.c +++ b/drivers/char/hvc_iucv.c @@ -273,7 +273,9 @@ static int hvc_iucv_write(struct hvc_iuc case MSG_TYPE_WINSIZE: if (rb->mbuf->datalen != sizeof(struct winsize)) break; - hvc_resize(priv->hvc, *((struct winsize *) rb->mbuf->data)); + /* The caller must ensure that the hvc is locked, which + * is the case when called from hvc_iucv_get_chars() */ + __hvc_resize(priv->hvc, *((struct winsize *) rb->mbuf->data)); break; case MSG_TYPE_ERROR: /* ignored ... */