[ofa-general] [PATCH 1/1] IB/iSER: Add missing counter incrementation in iser_data_buf_aligned_len

Erez Zilber erezz at voltaire.com
Wed Nov 21 03:11:37 PST 2007


Roland,

The following patch fixes a bug in iSER. Without it, iSER will have poor
performance. Can you push it upstream for 2.6.24?

While adding sg chaining support to iSER, a "for" loop was replaced with
a "for_each_sg" loop. The "for" loop included the incrementation of 2
variables. Only one of them is incremented in the current "for_each_sg"
loop. This caused iSER to think that all data is unaligned, and all data
was copied to aligned buffers.

This patch increments the missing counter inside the "for_each_sg" loop
whenever necessary.

Signed-off-by: Erez Zilber <erezz at voltaire.com>
---
 drivers/infiniband/ulp/iser/iser_memory.c |    5 ++++-
 1 files changed, 4 insertions(+), 1 deletions(-)

diff --git a/drivers/infiniband/ulp/iser/iser_memory.c
b/drivers/infiniband/ulp/iser/iser_memory.c
index d687980..a28f552 100644
--- a/drivers/infiniband/ulp/iser/iser_memory.c
+++ b/drivers/infiniband/ulp/iser/iser_memory.c
@@ -310,13 +310,16 @@ static unsigned int
iser_data_buf_aligned_len(struct iser_data_buf *data,
 		if (i + 1 < data->dma_nents) {
 			next_addr = ib_sg_dma_address(ibdev, sg_next(sg));
 			/* are i, i+1 fragments of the same page? */
-			if (end_addr == next_addr)
+			if (end_addr == next_addr) {
+				cnt++;
 				continue;
+			}
 			else if (!IS_4K_ALIGNED(end_addr)) {
 				ret_len = cnt + 1;
 				break;
 			}
 		}
+		cnt++;
 	}
 	if (i == data->dma_nents)
 		ret_len = cnt;	/* loop ended */
-- 
1.5.2





More information about the general mailing list