[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


 


Rackspace

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