rcuja fix: list prev pointer vs recompaction
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Mon, 27 May 2013 17:13:55 +0000 (13:13 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Mon, 27 May 2013 17:13:55 +0000 (13:13 -0400)
We should update the list prev pointer (for the first node) when a
recompaction changes the address of the list head. Currently a
work-around.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
rcuja/rcuja.c

index d24aaad1a87c0727afdfea0382fca951a5f2a520..9c90fdcdfc13b926c983e9be770aa5e51179e784 100644 (file)
@@ -1419,6 +1419,10 @@ int ja_unchain_node(struct cds_ja *ja,
         * list (while holding lock).
         */
        cds_hlist_for_each_rcu(hlist_node, &hlist_head) {
+               if (count == 0) {
+                       /* FIXME: currently a work-around */
+                       hlist_node->prev = (struct cds_hlist_node *) node_flag_ptr;
+               }
                count++;
                if (hlist_node == &node->list)
                        found++;
@@ -1429,6 +1433,10 @@ int ja_unchain_node(struct cds_ja *ja,
                goto end;
        }
        cds_hlist_del_rcu(&node->list);
+       /*
+        * Validate that we indeed removed the node from linked list.
+        */
+       assert(ja_node_ptr(*node_flag_ptr) != (struct cds_ja_inode *) node);
 end:
        rcuja_shadow_unlock(shadow_node);
        return ret;
This page took 0.026501 seconds and 4 git commands to generate.