From mboxrd@z Thu Jan 1 00:00:00 1970 From: =?windows-1252?Q?J=FCrgen_Gro=DF?= Subject: Re: [Xen-changelog] [linux-2.6.18-xen] scsifront: avoid acquiring same lock twice if ring is full Date: Wed, 14 Jan 2015 11:36:40 +0100 Message-ID: <54B646B8.2090207@suse.com> References: Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii"; Format="flowed" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: xen-devel@lists.xensource.com, Jan Beulich List-Id: xen-devel@lists.xenproject.org On 01/14/2015 11:22 AM, Xen patchbot-linux-2.6.18-xen wrote: > # HG changeset patch > # User Juergen Gross > # Date 1421228828 -3600 > # Node ID 3015a92b2b53825d00dc81c2dd131fc77ce8ab00 > # Parent 078f1bb69ea5e3772f3df4b4ee21f3c52e381e51 > scsifront: avoid acquiring same lock twice if ring is full > > The locking in scsifront_dev_reset_handler() as introduced by c/s > 1209:4d1471ca031e is obviously wrong. In case of a full ring the host > lock is acquired twice. > > Fixing this issue enables to get rid of the endless fo loop with an > explicit break statement. > > Signed-off-by: Juergen Gross > > Also add a missing version check. > > Signed-off-by: Jan Beulich > Committed-by: Jan Beulich > --- > > > diff -r 078f1bb69ea5 -r 3015a92b2b53 drivers/xen/scsifront/scsifront.c > --- a/drivers/xen/scsifront/scsifront.c Wed Dec 10 10:22:39 2014 +0100 > +++ b/drivers/xen/scsifront/scsifront.c Wed Jan 14 10:47:08 2015 +0100 > @@ -447,12 +447,10 @@ static int scsifront_dev_reset_handler(s > uint16_t rqid; > int err = 0; > > - for (;;) { > #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,12) > - spin_lock_irq(host->host_lock); > + spin_lock_irq(host->host_lock); > #endif > - if (!RING_FULL(&info->ring)) > - break; > + while (RING_FULL(&info->ring)) { > if (err) { > #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,12) > spin_unlock_irq(host->host_lock); > @@ -463,7 +461,9 @@ static int scsifront_dev_reset_handler(s > spin_unlock_irq(host->host_lock); > err = wait_event_interruptible(info->wq_sync, > !info->waiting_sync); > +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,12) Is this correct? I didn't check, but thought up to 2.6.12 the reset handler would be called with the lock already held. In any case: either this test must be removed again or two lines above another test should be added for the unlock. Juergen > spin_lock_irq(host->host_lock); > +#endif > } > > ring_req = scsifront_pre_request(info); > > _______________________________________________ > Xen-changelog mailing list > Xen-changelog@lists.xen.org > http://lists.xensource.com/xen-changelog >