[rds-devel] Re: [PATCH] Fix a bug in setting up memory ranges

Olaf Kirch olaf.kirch at oracle.com
Mon Jan 7 01:15:23 PST 2008


On Monday 07 January 2008 09:20, Olaf Kirch wrote:

> Here's an alternative patch - can you confirm it works for you?

Oops, I missed the second sg_set_page call. Here's an updated patch.

Olaf
-- 
Olaf Kirch  |  --- o --- Nous sommes du soleil we love when we play
okir at lst.de |    / | \   sol.dhoop.naytheet.ah kin.ir.samse.qurax
------------
From: Olaf Kirch <olaf.kirch at oracle.com>
Subject: [RDS] Fix a bug in setting up memory ranges

Rick Frank discovered a bug I introduced when converting the RDMA
code to use scatterlist acessors. In rds_get_mr, we use sg->offset
before initializing it. This patch should fix this.

Signed-off-by: Olaf Kirch <olaf.kirch at oracle.com>
---
 net/rds/rdma.c |   12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

Index: ofa-kernel-1.3/net/rds/rdma.c
===================================================================
--- ofa-kernel-1.3.orig/net/rds/rdma.c
+++ ofa-kernel-1.3/net/rds/rdma.c
@@ -263,10 +263,12 @@ int rds_get_mr(struct rds_sock *rs, char
 
 	mr->r_nents = ret;
 	for (i = 0 ; i < mr->r_nents; i++) {
+		unsigned int offset = args.vec.addr & ~PAGE_MASK;
+
 		sg = &mr->r_sg[i];
 		sg_set_page(sg, pages[i],
-				min_t(unsigned int, args.vec.bytes, PAGE_SIZE - sg->offset),
-				args.vec.addr & ~PAGE_MASK);
+				min_t(unsigned int, args.vec.bytes, PAGE_SIZE - offset),
+				offset);
 
 		args.vec.addr += sg->length;
 		args.vec.bytes -= sg->length;
@@ -509,10 +511,12 @@ static struct rds_rdma_op *rds_rdma_prep
 		nr_bytes += vec.bytes;
 
 		for (j = 0; j < nr; j++) {
+			unsigned int offset = vec.addr & ~PAGE_MASK;
+
 			sg = &op->r_sg[op->r_nents + j];
 			sg_set_page(sg, pages[j],
-					min_t(unsigned int, vec.bytes, PAGE_SIZE - sg->offset),
-					vec.addr & ~PAGE_MASK);
+					min_t(unsigned int, vec.bytes, PAGE_SIZE - offset),
+					offset);
 
 			rdsdebug("RDS: sg->offset %x sg->len %x vec.addr %Lx vec.bytes %Lu\n",
 			       sg->offset, sg->length, vec.addr, vec.bytes);



More information about the rds-devel mailing list