Re: [PATCH v2 15/29] be2iscsi: Fix to make boot discovery non-blocking

2016-08-22 Thread Julia Lawall
Please check the return on line 1517.  It looks suspicious that it does
not release the lock, unlike the return on line 1508.

julia

---

Hi Jitendra,

[auto build test WARNING on scsi/for-next]
[also build test WARNING on v4.8-rc3 next-20160822]
[if your patch is applied to the wrong git tree, please drop us a note to help 
improve the system]
[Suggest to use git(>=2.9.0) format-patch --base= (or --base=auto for 
convenience) to record what (public, well-known) commit your patch series was 
built on]
[Check https://git-scm.com/docs/git-format-patch for more information]

url:
https://github.com/0day-ci/linux/commits/Jitendra-Bhivare/be2iscsi-driver-update-11-2-0-0/20160819-175550
base:   https://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi.git for-next
:: branch date: 4 days ago
:: commit date: 4 days ago

>> drivers/scsi/be2iscsi/be_mgmt.c:1517:2-8: preceding lock on line 1504

git remote add linux-review https://github.com/0day-ci/linux
git remote update linux-review
git checkout b9f267a2cf5f152fb5b5b907b715e0854f337ccd
vim +1517 drivers/scsi/be2iscsi/be_mgmt.c

b9f267a2 Jitendra Bhivare 2016-08-19  1498  struct be_cmd_get_session_req 
*req;
b9f267a2 Jitendra Bhivare 2016-08-19  1499  struct be_dma_mem *nonemb_cmd;
b9f267a2 Jitendra Bhivare 2016-08-19  1500  struct be_mcc_wrb *wrb;
b9f267a2 Jitendra Bhivare 2016-08-19  1501  struct be_sge *sge;
b9f267a2 Jitendra Bhivare 2016-08-19  1502  unsigned int tag;
b9f267a2 Jitendra Bhivare 2016-08-19  1503
b9f267a2 Jitendra Bhivare 2016-08-19 @1504  mutex_lock(>mbox_lock);
b9f267a2 Jitendra Bhivare 2016-08-19  1505  wrb = alloc_mcc_wrb(phba, );
b9f267a2 Jitendra Bhivare 2016-08-19  1506  if (!wrb) {
b9f267a2 Jitendra Bhivare 2016-08-19  1507  
mutex_unlock(>mbox_lock);
b9f267a2 Jitendra Bhivare 2016-08-19  1508  return 0;
b9f267a2 Jitendra Bhivare 2016-08-19  1509  }
b9f267a2 Jitendra Bhivare 2016-08-19  1510
b9f267a2 Jitendra Bhivare 2016-08-19  1511  nonemb_cmd = 
>boot_struct.nonemb_cmd;
b9f267a2 Jitendra Bhivare 2016-08-19  1512  nonemb_cmd->size = 
sizeof(*resp);
b9f267a2 Jitendra Bhivare 2016-08-19  1513  nonemb_cmd->va = 
pci_alloc_consistent(phba->ctrl.pdev,
b9f267a2 Jitendra Bhivare 2016-08-19  1514  
  sizeof(nonemb_cmd->size),
b9f267a2 Jitendra Bhivare 2016-08-19  1515  
  _cmd->dma);
b9f267a2 Jitendra Bhivare 2016-08-19  1516  if (!nonemb_cmd->va)
b9f267a2 Jitendra Bhivare 2016-08-19 @1517  return 0;
b9f267a2 Jitendra Bhivare 2016-08-19  1518
b9f267a2 Jitendra Bhivare 2016-08-19  1519  req = nonemb_cmd->va;
b9f267a2 Jitendra Bhivare 2016-08-19  1520  memset(req, 0, sizeof(*req));

---
0-DAY kernel test infrastructureOpen Source Technology Center
https://lists.01.org/pipermail/kbuild-all   Intel Corporation
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v2 15/29] be2iscsi: Fix to make boot discovery non-blocking

2016-08-19 Thread Jitendra Bhivare
Boot work involves:
1. Find and fetch configured boot session and its handle.
2. Attempt to open the session if its not.
3. Get the session details for boot kset creation.
4. Logout of that session owned by FW.
5. Create boot kset for session details.

All these actions were done in blocking call with retries in global wq.
Other works in wq suffered if the IOCTLs stalled or timed out.

This change moves all the boot work to make it non-blocking.
The work queued in global wq just issues the IOCTL depending on the action
to be taken and mcc wq schedules work depending on status of the IOCTL.
Initial boot_work is started on link and ASYNC event.

The other code changes move all boot related functions in one place and
follow naming conventions.

Signed-off-by: Jitendra Bhivare 
Reviewed-by: Hannes Reinecke 
---
 drivers/scsi/be2iscsi/be.h  |   2 +
 drivers/scsi/be2iscsi/be_cmds.c | 161 ++-
 drivers/scsi/be2iscsi/be_cmds.h |  18 +-
 drivers/scsi/be2iscsi/be_main.c | 608 +++-
 drivers/scsi/be2iscsi/be_main.h |  33 ++-
 drivers/scsi/be2iscsi/be_mgmt.c | 537 +++
 drivers/scsi/be2iscsi/be_mgmt.h |  23 +-
 7 files changed, 725 insertions(+), 657 deletions(-)

diff --git a/drivers/scsi/be2iscsi/be.h b/drivers/scsi/be2iscsi/be.h
index 621291a..454002d 100644
--- a/drivers/scsi/be2iscsi/be.h
+++ b/drivers/scsi/be2iscsi/be.h
@@ -113,6 +113,8 @@ struct beiscsi_mcc_tag_state {
unsigned long tag_state;
 #define MCC_TAG_STATE_RUNNING  1
 #define MCC_TAG_STATE_TIMEOUT  2
+#define MCC_TAG_STATE_ASYNC3
+   void (*cbfn)(struct beiscsi_hba *, unsigned int);
struct be_dma_mem tag_mem_state;
 };
 
diff --git a/drivers/scsi/be2iscsi/be_cmds.c b/drivers/scsi/be2iscsi/be_cmds.c
index f16de6c..27d10ce 100644
--- a/drivers/scsi/be2iscsi/be_cmds.c
+++ b/drivers/scsi/be2iscsi/be_cmds.c
@@ -84,6 +84,7 @@ struct be_mcc_wrb *alloc_mcc_wrb(struct beiscsi_hba *phba,
phba->ctrl.mcc_tag[phba->ctrl.mcc_alloc_index] = 0;
phba->ctrl.mcc_tag_status[tag] = 0;
phba->ctrl.ptag_state[tag].tag_state = 0;
+   phba->ctrl.ptag_state[tag].cbfn = NULL;
phba->ctrl.mcc_tag_available--;
if (phba->ctrl.mcc_alloc_index == (MAX_MCC_CMD - 1))
phba->ctrl.mcc_alloc_index = 0;
@@ -128,6 +129,70 @@ void beiscsi_fail_session(struct iscsi_cls_session 
*cls_session)
 }
 
 /*
+ * beiscsi_mcc_compl_status - Return the status of MCC completion
+ * @phba: Driver private structure
+ * @tag: Tag for the MBX Command
+ * @wrb: the WRB used for the MBX Command
+ * @mbx_cmd_mem: ptr to memory allocated for MBX Cmd
+ *
+ * return
+ * Success: 0
+ * Failure: Non-Zero
+ */
+int __beiscsi_mcc_compl_status(struct beiscsi_hba *phba,
+  unsigned int tag,
+  struct be_mcc_wrb **wrb,
+  struct be_dma_mem *mbx_cmd_mem)
+{
+   struct be_queue_info *mccq = >ctrl.mcc_obj.q;
+   uint16_t status = 0, addl_status = 0, wrb_num = 0;
+   struct be_cmd_resp_hdr *mbx_resp_hdr;
+   struct be_cmd_req_hdr *mbx_hdr;
+   struct be_mcc_wrb *temp_wrb;
+   uint32_t mcc_tag_status;
+   int rc = 0;
+
+   mcc_tag_status = phba->ctrl.mcc_tag_status[tag];
+   status = (mcc_tag_status & CQE_STATUS_MASK);
+   addl_status = ((mcc_tag_status & CQE_STATUS_ADDL_MASK) >>
+   CQE_STATUS_ADDL_SHIFT);
+
+   if (mbx_cmd_mem) {
+   mbx_hdr = (struct be_cmd_req_hdr *)mbx_cmd_mem->va;
+   } else {
+   wrb_num = (mcc_tag_status & CQE_STATUS_WRB_MASK) >>
+ CQE_STATUS_WRB_SHIFT;
+   temp_wrb = (struct be_mcc_wrb *)queue_get_wrb(mccq, wrb_num);
+   mbx_hdr = embedded_payload(temp_wrb);
+
+   if (wrb)
+   *wrb = temp_wrb;
+   }
+
+   if (status || addl_status) {
+   beiscsi_log(phba, KERN_WARNING,
+   BEISCSI_LOG_INIT | BEISCSI_LOG_EH |
+   BEISCSI_LOG_CONFIG,
+   "BC_%d : MBX Cmd Failed for Subsys : %d Opcode : %d 
with Status : %d and Extd_Status : %d\n",
+   mbx_hdr->subsystem, mbx_hdr->opcode,
+   status, addl_status);
+   rc = -EIO;
+   if (status == MCC_STATUS_INSUFFICIENT_BUFFER) {
+   mbx_resp_hdr = (struct be_cmd_resp_hdr *)mbx_hdr;
+   beiscsi_log(phba, KERN_WARNING,
+   BEISCSI_LOG_INIT | BEISCSI_LOG_EH |
+   BEISCSI_LOG_CONFIG,
+   "BC_%d : Insufficient Buffer Error Resp_Len 
: %d Actual_Resp_Len : %d\n",
+   mbx_resp_hdr->response_length,
+   mbx_resp_hdr->actual_resp_len);
+   rc =