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: 44238 Received: from vger.kernel.org (vger.kernel.org [209.132.176.167]) by demeter.kernel.org (8.14.2/8.14.2) with ESMTP id n7RBkLrX012402 for ; Thu, 27 Aug 2009 11:46:21 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751818AbZH0Lpf (ORCPT ); Thu, 27 Aug 2009 07:45:35 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1751791AbZH0Lpf (ORCPT ); Thu, 27 Aug 2009 07:45:35 -0400 Received: from mtagate8-bp.emea.ibm.com ([195.212.17.168]:59368 "EHLO mtagate8.de.ibm.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751404AbZH0Lpe (ORCPT ); Thu, 27 Aug 2009 07:45:34 -0400 Received: from d12nrmr1607.megacenter.de.ibm.com (d12nrmr1607.megacenter.de.ibm.com [9.149.167.49]) by mtagate8.de.ibm.com (8.13.1/8.13.1) with ESMTP id n7RBjUnT000621; 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 n7RBjUkC2629710; 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 n7RBjTsf014963; Thu, 27 Aug 2009 13:45:30 +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 Cc: 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, brueckner@linux.vnet.ibm.com, Carsten Otte , Heiko Carstens , Martin Schwidefsky Subject: [PATCH] hvc_console: provide (un)locked version for hvc_resize() 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) Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.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(-) -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html --- 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 ... */