[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Xen-devel] [Xen-changelog] [linux-2.6.18-xen] scsifront: avoid acquiring same lock twice if ring is full
 
 
On 01/14/2015 11:22 AM, Xen patchbot-linux-2.6.18-xen wrote:
 
# HG changeset patch
# User Juergen Gross <jgross@xxxxxxxx>
# 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 <jgross@xxxxxxxx>
Also add a missing version check.
Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
Committed-by: Jan Beulich <jbeulich@xxxxxxxx>
---
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@xxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
 
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
 
 
    
     |