summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
87fbf52)
The difference between the two is that CMM_LOAD_SHARED() does not imply
a read barrier between the read and following uses of the data pointed
to by the pointer read.
All sites that only use the pointer load for its bits (never
dereference) don't need the read barrier implied by rcu_dereference.
Reviewed-by: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
bucket = lookup_bucket(ht, size, bit_reverse_ulong(old_node->reverse_hash));
_cds_lfht_gc_bucket(bucket, new_node);
bucket = lookup_bucket(ht, size, bit_reverse_ulong(old_node->reverse_hash));
_cds_lfht_gc_bucket(bucket, new_node);
- assert(is_removed(rcu_dereference(old_node->next)));
+ assert(is_removed(CMM_LOAD_SHARED(old_node->next)));
* logical removal flag). Return -ENOENT if the node had
* previously been removed.
*/
* logical removal flag). Return -ENOENT if the node had
* previously been removed.
*/
- next = rcu_dereference(node->next);
+ next = CMM_LOAD_SHARED(node->next); /* next is not dereferenced */
if (caa_unlikely(is_removed(next)))
return -ENOENT;
assert(!is_bucket(next));
if (caa_unlikely(is_removed(next)))
return -ENOENT;
assert(!is_bucket(next));
bucket = lookup_bucket(ht, size, bit_reverse_ulong(node->reverse_hash));
_cds_lfht_gc_bucket(bucket, node);
bucket = lookup_bucket(ht, size, bit_reverse_ulong(node->reverse_hash));
_cds_lfht_gc_bucket(bucket, node);
- assert(is_removed(rcu_dereference(node->next)));
+ assert(is_removed(CMM_LOAD_SHARED(node->next)));
/*
* Last phase: atomically exchange node->next with a version
* having "REMOVAL_OWNER_FLAG" set. If the returned node->next
/*
* Last phase: atomically exchange node->next with a version
* having "REMOVAL_OWNER_FLAG" set. If the returned node->next
}
node = clear_flag(next);
}
}
node = clear_flag(next);
}
- assert(!node || !is_bucket(rcu_dereference(node->next)));
+ assert(!node || !is_bucket(CMM_LOAD_SHARED(node->next)));
iter->node = node;
iter->next = next;
}
iter->node = node;
iter->next = next;
}
}
node = clear_flag(next);
}
}
node = clear_flag(next);
}
- assert(!node || !is_bucket(rcu_dereference(node->next)));
+ assert(!node || !is_bucket(CMM_LOAD_SHARED(node->next)));
iter->node = node;
iter->next = next;
}
iter->node = node;
iter->next = next;
}
}
node = clear_flag(next);
}
}
node = clear_flag(next);
}
- assert(!node || !is_bucket(rcu_dereference(node->next)));
+ assert(!node || !is_bucket(CMM_LOAD_SHARED(node->next)));
iter->node = node;
iter->next = next;
}
iter->node = node;
iter->next = next;
}
int cds_lfht_is_node_deleted(struct cds_lfht_node *node)
{
int cds_lfht_is_node_deleted(struct cds_lfht_node *node)
{
- return is_removed(rcu_dereference(node->next));
+ return is_removed(CMM_LOAD_SHARED(node->next));