[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