[portals4] r2288 committed - fixes bug where certain buffer reuse patterns/frequency could cause se...

0 views
Skip to first unread message

port...@googlecode.com

unread,
Oct 20, 2014, 4:05:41 PM10/20/14
to portals4...@googlegroups.com
Revision: 2288
Author: regra...@gmail.com
Date: Mon Oct 20 20:05:30 2014 UTC
Log: fixes bug where certain buffer reuse patterns/frequency could
cause segfaults
https://code.google.com/p/portals4/source/detail?r=2288

Modified:
/trunk/src/ib/ptl_mr.c
/trunk/src/ib/ptl_tgt.c

=======================================
--- /trunk/src/ib/ptl_mr.c Tue Oct 14 15:06:04 2014 UTC
+++ /trunk/src/ib/ptl_mr.c Mon Oct 20 20:05:30 2014 UTC
@@ -324,74 +324,82 @@

mr = NULL;

- while (link) {
- mr = link;
+ if (global_umn_init == 1){

- if (start < mr->addr)
- link = RB_LEFT(mr, entry);
- else {
- if (mr->addr + mr->length >= start + length) {
- /* Requested mr fits in an existing region. */
- mr_get(mr);
- ret = 0;
- *mr_p = mr;
- goto done;
+ while (link) {
+ mr = link;
+
+ if (start < mr->addr)
+ link = RB_LEFT(mr, entry);
+ else {
+ if (mr->addr + mr->length >= start + length) {
+ /* Requested mr fits in an existing region. */
+ mr_get(mr);
+ if (atomic_read(&mr->obj.obj_ref.ref_cnt) >= 1){
+ ret = 0;
+ *mr_p = mr;
+ goto done;
+ }
+ }
+ left_node = mr;
+ link = RB_RIGHT(mr, entry);
}
- left_node = mr;
- link = RB_RIGHT(mr, entry);
}
- }

- /* Not found. */
- INIT_LIST_HEAD(&mr_list);
+ /* Not found. */
+ INIT_LIST_HEAD(&mr_list);

- mr = NULL;
+ mr = NULL;

- /* Extend region to the left. */
- if (left_node && (start <= (left_node->addr + left_node->length))) {
- length += start - left_node->addr;
- start = left_node->addr;
+ /* Extend region to the left. */
+ if (left_node && (start <= (left_node->addr + left_node->length)))
{
+ length += start - left_node->addr;
+ start = left_node->addr;

- /* First merge node. Will be replaced later. */
- mr = left_node;
- }
+ /* First merge node. Will be replaced later. */
+ mr = left_node;
+ }

- /* Extend the region to the right. */
- if (left_node)
- rb = RB_NEXT(the_root, &tree->tree, left_node);
- else
- rb = RB_MIN(the_root, &tree->tree);
- while (rb) {
- struct mr *next_rb = RB_NEXT(the_root, &tree->tree, rb);
+ /* Extend the region to the right. */
+ if (left_node)
+ rb = RB_NEXT(the_root, &tree->tree, left_node);
+ else
+ rb = RB_MIN(the_root, &tree->tree);
+ while (rb) {
+ struct mr *next_rb = RB_NEXT(the_root, &tree->tree, rb);

- /* Check whether new region can be merged with this node. */
- if (start + length >= rb->addr) {
- /* Is it completely part of the new region ? */
- size_t new_length = rb->addr + rb->length - start;
- if (new_length > length)
- length = new_length;
+ /* Check whether new region can be merged with this node. */
+ if (start + length >= rb->addr) {
+ /* Is it completely part of the new region ? */
+ size_t new_length = rb->addr + rb->length - start;
+ if (new_length > length)
+ length = new_length;

- if (mr) {
- /* Mark the node for removal since it will be included
- * in the new mr. */
- list_add_tail(&rb->list, &mr_list);
+ if (mr) {
+ /* Mark the node for removal since it will be included
+ * in the new mr. */
+ list_add_tail(&rb->list, &mr_list);
+ } else {
+ /* First merge node. Will be replaced later. */
+ mr = rb;
+ }
} else {
- /* First merge node. Will be replaced later. */
- mr = rb;
+ break;
}
- } else {
- break;
+
+ rb = next_rb;
}

- rb = next_rb;
+ if (mr) {
+ /* Mark for removal the included mr on the right. */
+ list_add_tail(&mr->list, &mr_list);
+ mr = NULL;
+ }
}
-
- if (mr) {
- /* Mark for removal the included mr on the right. */
- list_add_tail(&mr->list, &mr_list);
- mr = NULL;
+ /* No memory registration cache enabled */
+ else {
+ INIT_LIST_HEAD(&mr_list);
}
-
/* Insert the new node */
ret = mr_create(ni, start, length, mr_p);
if (ret) {
@@ -411,6 +419,10 @@
}
goto again;
}
+ if (ret == EFAULT && ni->umn_fd == -1){
+ PTL_FASTLOCK_UNLOCK(&tree->tree_lock);
+ goto again;
+ }
#endif

*mr_p = NULL;
@@ -526,6 +538,7 @@
ni->umn_fd = global_umn_fd;
}
else {
+ global_umn_fd = -1;
fprintf(stderr, "NOTE: Ummunotify and IB registered mem cache
disabled, set PTL_DISABLE_MEM_REG_CACHE=0 to re-enable.\n");
}
}
=======================================
--- /trunk/src/ib/ptl_tgt.c Wed May 28 20:03:11 2014 UTC
+++ /trunk/src/ib/ptl_tgt.c Mon Oct 20 20:05:30 2014 UTC
@@ -1941,7 +1941,7 @@
if(buf->mr_list[0] != NULL && ni->umn_fd == -1){
int i = 0;
while (buf->mr_list[i] != NULL){
- mr_put(buf->mr_list[i]);
+ mr_cleanup(buf->mr_list[i]);
i++;
if (i == 2)
abort();
Reply all
Reply to author
Forward
0 new messages