[MT23108] fixed a bug in registration of a large buffer: the registration now starts...
authorleonidk <leonidk@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Sun, 14 May 2006 09:31:47 +0000 (09:31 +0000)
committerleonidk <leonidk@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Sun, 14 May 2006 09:31:47 +0000 (09:31 +0000)
git-svn-id: svn://openib.tc.cornell.edu/gen1/trunk@346 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86

hw/mt23108/vapi/mlxsys/mosal/os_dep/win/mosal_iobuf.c

index a43e37e..70bdae3 100644 (file)
@@ -267,10 +267,10 @@ call_result_t MOSAL_iobuf_register(MT_virt_addr_t va,
 {\r
   call_result_t rc;\r
   MOSAL_iobuf_t new_iobuf;     // new allocated IOBUF object\r
-  MT_virt_addr_t seg_va = va;  // current segment start\r
-  MT_size_t seg_size = size;   // current segment size\r
-  MT_size_t rdc = size;                        // remain data counter - what is rest to lock\r
-  MT_size_t delta;                             // he size of the last not full page of the first segment\r
+  MT_virt_addr_t seg_va;       // current segment start\r
+  MT_size_t seg_size;          // current segment size\r
+  MT_size_t rdc;                       // remain data counter - what is rest to lock\r
+  MT_size_t delta;                     // he size of the last not full page of the first segment\r
   MOSAL_iobuf_seg_t iobuf_seg_p;       // pointer to current segment object\r
   unsigned page_size;\r
   \r
@@ -297,6 +297,13 @@ call_result_t MOSAL_iobuf_register(MT_virt_addr_t va,
   MOSAL_dlist_init_head( &new_iobuf->seg_que );\r
   new_iobuf->seg_num = 0;\r
 \r
+  // Round the seg_va down to a page boundary so that we always get a seg_size\r
+  // that is an integral number of pages.\r
+  delta = va & (PAGE_SIZE - 1);\r
+  seg_va = va - delta;\r
+  // Since we rounded down the seg_va, we need to round up the rdc and size.\r
+  seg_size = rdc = size + delta;\r
+\r
   // allocate segments\r
   while (rdc > 0) {\r
        // map a segment\r