Commit 0a52aba7 authored by Andreas Gruenbacher's avatar Andreas Gruenbacher Committed by Bob Peterson

gfs2: Switch to rhashtable_lookup_get_insert_fast

Switch from rhashtable_lookup_insert_fast + rhashtable_lookup_fast to
rhashtable_lookup_get_insert_fast, which is cleaner and avoids an extra
rhashtable lookup.

At the same time, turn the retry loop in gfs2_glock_get into an infinite
loop.  The lookup or insert will eventually succeed, usually very fast,
but there is no reason to give up trying at a fixed number of
iterations.
Signed-off-by: default avatarAndreas Gruenbacher <agruenba@redhat.com>
Signed-off-by: default avatarBob Peterson <rpeterso@redhat.com>
parent c3698987
...@@ -655,10 +655,10 @@ int gfs2_glock_get(struct gfs2_sbd *sdp, u64 number, ...@@ -655,10 +655,10 @@ int gfs2_glock_get(struct gfs2_sbd *sdp, u64 number,
struct lm_lockname name = { .ln_number = number, struct lm_lockname name = { .ln_number = number,
.ln_type = glops->go_type, .ln_type = glops->go_type,
.ln_sbd = sdp }; .ln_sbd = sdp };
struct gfs2_glock *gl, *tmp = NULL; struct gfs2_glock *gl, *tmp;
struct address_space *mapping; struct address_space *mapping;
struct kmem_cache *cachep; struct kmem_cache *cachep;
int ret, tries = 0; int ret = 0;
rcu_read_lock(); rcu_read_lock();
gl = rhashtable_lookup_fast(&gl_hash_table, &name, ht_parms); gl = rhashtable_lookup_fast(&gl_hash_table, &name, ht_parms);
...@@ -723,35 +723,32 @@ int gfs2_glock_get(struct gfs2_sbd *sdp, u64 number, ...@@ -723,35 +723,32 @@ int gfs2_glock_get(struct gfs2_sbd *sdp, u64 number,
} }
again: again:
ret = rhashtable_lookup_insert_fast(&gl_hash_table, &gl->gl_node, rcu_read_lock();
ht_parms); tmp = rhashtable_lookup_get_insert_fast(&gl_hash_table, &gl->gl_node,
if (ret == 0) { ht_parms);
if (!tmp) {
*glp = gl; *glp = gl;
return 0; goto out;
} }
if (IS_ERR(tmp)) {
if (ret == -EEXIST) { ret = PTR_ERR(tmp);
ret = 0; goto out_free;
rcu_read_lock(); }
tmp = rhashtable_lookup_fast(&gl_hash_table, &name, ht_parms); if (lockref_get_not_dead(&tmp->gl_lockref)) {
if (tmp == NULL || !lockref_get_not_dead(&tmp->gl_lockref)) { *glp = tmp;
if (++tries < 100) { goto out_free;
rcu_read_unlock();
cond_resched();
goto again;
}
tmp = NULL;
ret = -ENOMEM;
}
rcu_read_unlock();
} else {
WARN_ON_ONCE(ret);
} }
rcu_read_unlock();
cond_resched();
goto again;
out_free:
kfree(gl->gl_lksb.sb_lvbptr); kfree(gl->gl_lksb.sb_lvbptr);
kmem_cache_free(cachep, gl); kmem_cache_free(cachep, gl);
atomic_dec(&sdp->sd_glock_disposal); atomic_dec(&sdp->sd_glock_disposal);
*glp = tmp;
out:
rcu_read_unlock();
return ret; return ret;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment