Re: static checker complaints on isert code

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 10/2/2014 3:49 AM, Nicholas A. Bellinger wrote:
On Wed, 2014-10-01 at 13:45 +0300, Or Gerlitz wrote:
Some static checker complaints on isert code, worth looking

Or.

# make CHECK="../tools/smatch/smatch -p=kernel --two-passes" C=2 CC=gcc
SUBDIRS=drivers/infiniband/ulp/isert -j 12 modules | tee warns.txt
    CHECK   drivers/infiniband/ulp/isert/ib_isert.c

drivers/infiniband/ulp/isert/ib_isert.c:701 isert_connect_request()
warn: inconsistent returns 'sem:&isert_np->np_sem'.
    Locked on:   line 571
                 line 581
                 line 701
    Unlocked on: line 683

drivers/infiniband/ulp/isert/ib_isert.c:3155 isert_accept_np() error:
double lock 'sem:&isert_np->np_sem'

drivers/infiniband/ulp/isert/ib_isert.c:3155 isert_accept_np warn:
unused return: ret = down_interruptible()

These are false positives from using a sempahore to signal incoming
login requests between CMA generated isert_connect_request() to login
kernel thread context in isert_accept_np().

A struct completion would be a better fit here, and makes smatch happy.

How about the following..?

looks good to me, I am adding the smatch maintainer, in case he wants to add something.

Or.

iser-target: Convert isert_np->np_sem to struct completion
This patch converts isert_np->np_sem to use a proper struct completion
to eliminate the following smatch warnings related to using a semaphore
to signal completion between isert_connect_request() -> isert_accept_np().
drivers/infiniband/ulp/isert/ib_isert.c:701 isert_connect_request()
   warn: inconsistent returns 'sem:&isert_np->np_sem'.
       Locked on:   line 571
                    line 581
                    line 701
       Unlocked on: line 683
drivers/infiniband/ulp/isert/ib_isert.c:3155 isert_accept_np() error:
   double lock 'sem:&isert_np->np_sem'
drivers/infiniband/ulp/isert/ib_isert.c:3155 isert_accept_np warn:
   unused return: ret = down_interruptible()
Reported-by: Or Gerlitz <ogerlitz@xxxxxxxxxxxx>
Signed-off-by: Nicholas Bellinger <nab@xxxxxxxxxxxxxxx>

diff --git a/drivers/infiniband/ulp/isert/ib_isert.c b/drivers/infiniband/ulp/isert/ib_isert.
index d4c7928..b3d0bae 100644
--- a/drivers/infiniband/ulp/isert/ib_isert.c
+++ b/drivers/infiniband/ulp/isert/ib_isert.c
@@ -677,8 +677,8 @@ isert_connect_request(struct rdma_cm_id *cma_id, struct rdma_cm_event *ev
         list_add_tail(&isert_conn->conn_accept_node, &isert_np->np_accept_list);
         mutex_unlock(&isert_np->np_accept_mutex);
- pr_debug("isert_connect_request() up np_sem np: %p\n", np);
-       up(&isert_np->np_sem);
+       pr_debug("isert_connect_request() complete np_accept_comp np: %p\n", np);
+       complete(&isert_np->np_accept_comp);
         return 0;
out_conn_dev:
@@ -3011,9 +3011,9 @@ isert_setup_np(struct iscsi_np *np,
                 pr_err("Unable to allocate struct isert_np\n");
                 return -ENOMEM;
         }
-       sema_init(&isert_np->np_sem, 0);
         mutex_init(&isert_np->np_accept_mutex);
         INIT_LIST_HEAD(&isert_np->np_accept_list);
+       init_completion(&isert_np->np_accept_comp);
         init_completion(&isert_np->np_login_comp);
sa = (struct sockaddr *)ksockaddr;
@@ -3151,8 +3151,8 @@ isert_accept_np(struct iscsi_np *np, struct iscsi_conn *conn)
         int max_accept = 0, ret;
accept_wait:
-       ret = down_interruptible(&isert_np->np_sem);
-       if (max_accept > 5)
+       ret = wait_for_completion_interruptible(&isert_np->np_accept_comp);
+       if (ret || max_accept > 5)
                 return -ENODEV;
spin_lock_bh(&np->np_thread_lock);
diff --git a/drivers/infiniband/ulp/isert/ib_isert.h b/drivers/infiniband/ulp/isert/ib_isert.
index 04f51f7..21b018b 100644
--- a/drivers/infiniband/ulp/isert/ib_isert.h
+++ b/drivers/infiniband/ulp/isert/ib_isert.h
@@ -182,9 +182,9 @@ struct isert_device {
  };
struct isert_np {
-       struct semaphore        np_sem;
         struct rdma_cm_id       *np_cm_id;
         struct mutex            np_accept_mutex;
         struct list_head        np_accept_list;
+       struct completion       np_accept_comp;
         struct completion       np_login_comp;
  };


--
To unsubscribe from this list: send the line "unsubscribe target-devel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux SCSI]     [Kernel Newbies]     [Linux SCSI Target Infrastructure]     [Share Photos]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Device Mapper]

  Powered by Linux