From e0db32ec24e6cc367257218c484380266d73f2e9 Mon Sep 17 00:00:00 2001 From: David Dillow Date: Wed, 19 Dec 2007 17:08:43 -0500 Subject: [PATCH] --- yaml --- r: 76825 b: refs/heads/master c: 8cba2077325b361dedf058c7dfc6c33691422497 h: refs/heads/master i: 76823: 8289e2d6435c55603ea5c69cade20c97461f8045 v: v3 --- [refs] | 2 +- trunk/drivers/infiniband/ulp/srp/ib_srp.c | 13 +++++++++---- trunk/drivers/infiniband/ulp/srp/ib_srp.h | 5 +++++ 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/[refs] b/[refs] index a0b01b19b419..e55ee0218d2b 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: a9e527e3f9f4510e9f3450ca3bc51bc3ef2854fd +refs/heads/master: 8cba2077325b361dedf058c7dfc6c33691422497 diff --git a/trunk/drivers/infiniband/ulp/srp/ib_srp.c b/trunk/drivers/infiniband/ulp/srp/ib_srp.c index bdb6f8517401..e98d0612d7ac 100644 --- a/trunk/drivers/infiniband/ulp/srp/ib_srp.c +++ b/trunk/drivers/infiniband/ulp/srp/ib_srp.c @@ -930,13 +930,18 @@ static int srp_post_recv(struct srp_target_port *target) * req_lim and tx_head. Lock cannot be dropped between call here and * call to __srp_post_send(). */ -static struct srp_iu *__srp_get_tx_iu(struct srp_target_port *target) +static struct srp_iu *__srp_get_tx_iu(struct srp_target_port *target, + enum srp_request_type req_type) { + s32 min = (req_type == SRP_REQ_TASK_MGMT) ? 1 : 2; + if (target->tx_head - target->tx_tail >= SRP_SQ_SIZE) return NULL; - if (unlikely(target->req_lim < 1)) + if (target->req_lim < min) { ++target->zero_req_lim; + return NULL; + } return target->tx_ring[target->tx_head & SRP_SQ_SIZE]; } @@ -993,7 +998,7 @@ static int srp_queuecommand(struct scsi_cmnd *scmnd, return 0; } - iu = __srp_get_tx_iu(target); + iu = __srp_get_tx_iu(target, SRP_REQ_NORMAL); if (!iu) goto err; @@ -1283,7 +1288,7 @@ static int srp_send_tsk_mgmt(struct srp_target_port *target, init_completion(&req->done); - iu = __srp_get_tx_iu(target); + iu = __srp_get_tx_iu(target, SRP_REQ_TASK_MGMT); if (!iu) goto out; diff --git a/trunk/drivers/infiniband/ulp/srp/ib_srp.h b/trunk/drivers/infiniband/ulp/srp/ib_srp.h index e3573e7038c4..4a3c1f37e4c2 100644 --- a/trunk/drivers/infiniband/ulp/srp/ib_srp.h +++ b/trunk/drivers/infiniband/ulp/srp/ib_srp.h @@ -79,6 +79,11 @@ enum srp_target_state { SRP_TARGET_REMOVED }; +enum srp_request_type { + SRP_REQ_NORMAL, + SRP_REQ_TASK_MGMT, +}; + struct srp_device { struct list_head dev_list; struct ib_device *dev;