summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorErez Zilber2007-01-07 11:28:02 +0100
committerRoland Dreier2007-01-07 19:15:15 +0100
commitf0938401f2252bf39615c0815734650eab9053c8 (patch)
tree5b915a7569b7b25138eec1027a6fb40f7080b147
parentIB/mthca: Fix off-by-one in FMR handling on memfree (diff)
downloadkernel-qcow2-linux-f0938401f2252bf39615c0815734650eab9053c8.tar.gz
kernel-qcow2-linux-f0938401f2252bf39615c0815734650eab9053c8.tar.xz
kernel-qcow2-linux-f0938401f2252bf39615c0815734650eab9053c8.zip
IB/iser: Return error code when PDUs may not be sent
iSER limits the number of outstanding PDUs to send. When this threshold is reached, it should return an error code (-ENOBUFS) instead of setting the suspend_tx bit (which should be used only by libiscsi). Signed-off-by: Erez Zilber <erezz@voltaire.com> Signed-off-by: Roland Dreier <rolandd@cisco.com>
-rw-r--r--drivers/infiniband/ulp/iser/iscsi_iser.c4
-rw-r--r--drivers/infiniband/ulp/iser/iser_initiator.c26
2 files changed, 14 insertions, 16 deletions
diff --git a/drivers/infiniband/ulp/iser/iscsi_iser.c b/drivers/infiniband/ulp/iser/iscsi_iser.c
index 9b2041e25d59..dd221eda3ea6 100644
--- a/drivers/infiniband/ulp/iser/iscsi_iser.c
+++ b/drivers/infiniband/ulp/iser/iscsi_iser.c
@@ -177,7 +177,7 @@ iscsi_iser_mtask_xmit(struct iscsi_conn *conn,
* - if yes, the mtask is recycled at iscsi_complete_pdu
* - if no, the mtask is recycled at iser_snd_completion
*/
- if (error && error != -EAGAIN)
+ if (error && error != -ENOBUFS)
iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED);
return error;
@@ -241,7 +241,7 @@ iscsi_iser_ctask_xmit(struct iscsi_conn *conn,
error = iscsi_iser_ctask_xmit_unsol_data(conn, ctask);
iscsi_iser_ctask_xmit_exit:
- if (error && error != -EAGAIN)
+ if (error && error != -ENOBUFS)
iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED);
return error;
}
diff --git a/drivers/infiniband/ulp/iser/iser_initiator.c b/drivers/infiniband/ulp/iser/iser_initiator.c
index e73c87b9be43..0a7d1ab60e6d 100644
--- a/drivers/infiniband/ulp/iser/iser_initiator.c
+++ b/drivers/infiniband/ulp/iser/iser_initiator.c
@@ -304,18 +304,14 @@ int iser_conn_set_full_featured_mode(struct iscsi_conn *conn)
static int
iser_check_xmit(struct iscsi_conn *conn, void *task)
{
- int rc = 0;
struct iscsi_iser_conn *iser_conn = conn->dd_data;
- write_lock_bh(conn->recv_lock);
if (atomic_read(&iser_conn->ib_conn->post_send_buf_count) ==
ISER_QP_MAX_REQ_DTOS) {
- iser_dbg("%ld can't xmit task %p, suspending tx\n",jiffies,task);
- set_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx);
- rc = -EAGAIN;
+ iser_dbg("%ld can't xmit task %p\n",jiffies,task);
+ return -ENOBUFS;
}
- write_unlock_bh(conn->recv_lock);
- return rc;
+ return 0;
}
@@ -340,7 +336,7 @@ int iser_send_command(struct iscsi_conn *conn,
return -EPERM;
}
if (iser_check_xmit(conn, ctask))
- return -EAGAIN;
+ return -ENOBUFS;
edtl = ntohl(hdr->data_length);
@@ -426,7 +422,7 @@ int iser_send_data_out(struct iscsi_conn *conn,
}
if (iser_check_xmit(conn, ctask))
- return -EAGAIN;
+ return -ENOBUFS;
itt = ntohl(hdr->itt);
data_seg_len = ntoh24(hdr->dlength);
@@ -498,7 +494,7 @@ int iser_send_control(struct iscsi_conn *conn,
}
if (iser_check_xmit(conn,mtask))
- return -EAGAIN;
+ return -ENOBUFS;
/* build the tx desc regd header and add it to the tx desc dto */
mdesc->type = ISCSI_TX_CONTROL;
@@ -605,6 +601,7 @@ void iser_snd_completion(struct iser_desc *tx_desc)
struct iscsi_iser_conn *iser_conn = ib_conn->iser_conn;
struct iscsi_conn *conn = iser_conn->iscsi_conn;
struct iscsi_mgmt_task *mtask;
+ int resume_tx = 0;
iser_dbg("Initiator, Data sent dto=0x%p\n", dto);
@@ -613,15 +610,16 @@ void iser_snd_completion(struct iser_desc *tx_desc)
if (tx_desc->type == ISCSI_TX_DATAOUT)
kmem_cache_free(ig.desc_cache, tx_desc);
+ if (atomic_read(&iser_conn->ib_conn->post_send_buf_count) ==
+ ISER_QP_MAX_REQ_DTOS)
+ resume_tx = 1;
+
atomic_dec(&ib_conn->post_send_buf_count);
- write_lock(conn->recv_lock);
- if (conn->suspend_tx) {
+ if (resume_tx) {
iser_dbg("%ld resuming tx\n",jiffies);
- clear_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx);
scsi_queue_work(conn->session->host, &conn->xmitwork);
}
- write_unlock(conn->recv_lock);
if (tx_desc->type == ISCSI_TX_CONTROL) {
/* this arithmetic is legal by libiscsi dd_data allocation */
el-qcow2-linux.git/commit/?id=7e312ffdd7aa68f0110f5d95416f78ea29ceb984'>dt-bindings: mfd: axp20x: Add AXP806 to supported list of chipsChen-Yu Tsai2017-09-051-0/+1 | * | mfd: Add ROHM BD9571MWV-M MFD PMIC driverMarek Vasut2017-09-055-0/+371 | * | mfd: hi6421-pmic: Add support for HiSilicon Hi6421v530Guodong Xu2017-09-052-18/+57 | * | mfd: hi6421-pmic: Update dev_err messagesGuodong Xu2017-09-051-3/+3 | * | mfd: hi6421-pmic: Change license text to shorter formGuodong Xu2017-09-051-11/+2Star | * | mfd: Kconfig: Add missing Kconfig dependency for TPS65086Michal Simek2017-09-051-0/+1 | * | mfd: syscon: Update Atmel SMC binding docLudovic Desroches2017-09-051-0/+1 | * | mfd: ab8500-core: Constify attribute_group structuresArvind Yadav2017-09-051-3/+3 | * | dt-bindings: mfd: da9052: Support TSI as ADCSebastian Reichel2017-09-051-0/+8 | * | mfd: max8998: Fix potential NULL pointer dereferenceChristophe JAILLET2017-09-051-4/+2Star | * | mfd: max8925-i2c: Drop unnecessary staticJulia Lawall2017-09-051-1/+1 | * | mfd: da9052: Fix manual ADC read after timed out readSebastian Reichel2017-09-051-0/+2 | * | mfd: rtsx: Make arrays depth and cd_mask static constColin Ian King2017-09-051-2/+2 | * | mfd: twl-core: Improve the documentationDan Carpenter2017-09-051-2/+2 | | | | | \ | | \ | | \ | | \ | | \ | | \ | | \ | | \ | | \ | *---------. \ Merge branches 'ib-mfd-arm-i2c-4.14', 'ib-mfd-arm-usb-video-4.14', 'ib-mfd-hw...Lee Jones2017-09-05