aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/libfc
diff options
context:
space:
mode:
authorVasu Dev <vasu.dev@intel.com>2010-03-12 19:08:34 -0500
committerJames Bottomley <James.Bottomley@suse.de>2010-04-11 10:23:41 -0400
commita104c844576c6bdc44c6f1336e30a5fcd90fef1c (patch)
tree663dcc3412254f0f004d014b93f2f96b402e14a1 /drivers/scsi/libfc
parentcc3593d3882ffa7dfaa739a8302b256955be7d99 (diff)
[SCSI] libfc: fixes unnecessary seq id jump
In some cases seq is incremented twice causing unnecessary seq jump, for instance fc_exch_recv_seq_resp increments seq id when fc_sof_is_init is true and that is true for each incoming xfer ready but then fc_fcp_send_data does another seq increment to send data for xfer ready. This patch removes all such seq id jumps, at least it eliminates few calls to fc_seq_start_next using ex_lock. Also removes seq id update with incoming frame's seq id as this is not needed since each end (I or T) just need to send incremented their own seq id on each TSI from other end & before sending new sequence within a exchange. Signed-off-by: Vasu Dev <vasu.dev@intel.com> Signed-off-by: Robert Love <robert.w.love@intel.com> Signed-off-by: James Bottomley <James.Bottomley@suse.de>
Diffstat (limited to 'drivers/scsi/libfc')
-rw-r--r--drivers/scsi/libfc/fc_exch.c19
1 files changed, 5 insertions, 14 deletions
diff --git a/drivers/scsi/libfc/fc_exch.c b/drivers/scsi/libfc/fc_exch.c
index 7cc084cf9950..981021edfba9 100644
--- a/drivers/scsi/libfc/fc_exch.c
+++ b/drivers/scsi/libfc/fc_exch.c
@@ -920,12 +920,7 @@ static enum fc_pf_rjt_reason fc_seq_lookup_recip(struct fc_lport *lport,
920 * Find or create the sequence. 920 * Find or create the sequence.
921 */ 921 */
922 if (fc_sof_is_init(fr_sof(fp))) { 922 if (fc_sof_is_init(fr_sof(fp))) {
923 sp = fc_seq_start_next(&ep->seq); 923 sp = &ep->seq;
924 if (!sp) {
925 reject = FC_RJT_SEQ_XS; /* exchange shortage */
926 goto rel;
927 }
928 sp->id = fh->fh_seq_id;
929 sp->ssb_stat |= SSB_ST_RESP; 924 sp->ssb_stat |= SSB_ST_RESP;
930 } else { 925 } else {
931 sp = &ep->seq; 926 sp = &ep->seq;
@@ -1336,17 +1331,14 @@ static void fc_exch_recv_seq_resp(struct fc_exch_mgr *mp, struct fc_frame *fp)
1336 goto rel; 1331 goto rel;
1337 } 1332 }
1338 sof = fr_sof(fp); 1333 sof = fr_sof(fp);
1339 if (fc_sof_is_init(sof)) { 1334 sp = &ep->seq;
1340 sp = fc_seq_start_next(&ep->seq); 1335 if (fc_sof_is_init(sof))
1341 sp->id = fh->fh_seq_id;
1342 sp->ssb_stat |= SSB_ST_RESP; 1336 sp->ssb_stat |= SSB_ST_RESP;
1343 } else { 1337 else if (sp->id != fh->fh_seq_id) {
1344 sp = &ep->seq;
1345 if (sp->id != fh->fh_seq_id) {
1346 atomic_inc(&mp->stats.seq_not_found); 1338 atomic_inc(&mp->stats.seq_not_found);
1347 goto rel; 1339 goto rel;
1348 }
1349 } 1340 }
1341
1350 f_ctl = ntoh24(fh->fh_f_ctl); 1342 f_ctl = ntoh24(fh->fh_f_ctl);
1351 fr_seq(fp) = sp; 1343 fr_seq(fp) = sp;
1352 if (f_ctl & FC_FC_SEQ_INIT) 1344 if (f_ctl & FC_FC_SEQ_INIT)
@@ -1763,7 +1755,6 @@ static void fc_exch_els_rec(struct fc_seq *sp, struct fc_frame *rfp)
1763 fc_exch_done(sp); 1755 fc_exch_done(sp);
1764 goto out; 1756 goto out;
1765 } 1757 }
1766 sp = fc_seq_start_next(sp);
1767 acc = fc_frame_payload_get(fp, sizeof(*acc)); 1758 acc = fc_frame_payload_get(fp, sizeof(*acc));
1768 memset(acc, 0, sizeof(*acc)); 1759 memset(acc, 0, sizeof(*acc));
1769 acc->reca_cmd = ELS_LS_ACC; 1760 acc->reca_cmd = ELS_LS_ACC;