All of lore.kernel.org
 help / color / mirror / Atom feed
* [Cluster-devel] [PATCH 0/2] GFS2 rhashtable cleanup
@ 2017-02-22 15:14 Andreas Gruenbacher
  2017-02-22 15:14 ` [Cluster-devel] [PATCH 1/2] rhashtable: Add rhashtable_lookup_get_insert_fast Andreas Gruenbacher
                   ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: Andreas Gruenbacher @ 2017-02-22 15:14 UTC (permalink / raw)
  To: cluster-devel.redhat.com

The first of these patches adds rhashtable_lookup_get_insert_fast, which is
modeled after rhashtable_lookup_get_insert_key and returns existing objects in
the hash table, other than rhashtable_lookup_insert_fast which returns -EEXIST.

The second of these patch cleans up the GFS2 gfs2 rhashtable code by using
rhashtable_lookup_get_insert_fast. 

Andreas Gruenbacher (2):
  rhashtable: Add rhashtable_lookup_get_insert_fast
  gfs2: Switch to rhashtable_lookup_get_insert_fast

 fs/gfs2/glock.c            | 45 +++++++++++++++++++++------------------------
 include/linux/rhashtable.h | 22 ++++++++++++++++++++++
 2 files changed, 43 insertions(+), 24 deletions(-)

-- 
2.7.4



^ permalink raw reply	[flat|nested] 5+ messages in thread

* [Cluster-devel] [PATCH 1/2] rhashtable: Add rhashtable_lookup_get_insert_fast
  2017-02-22 15:14 [Cluster-devel] [PATCH 0/2] GFS2 rhashtable cleanup Andreas Gruenbacher
@ 2017-02-22 15:14 ` Andreas Gruenbacher
  2017-02-24 14:22   ` Herbert Xu
  2017-02-22 15:14 ` [Cluster-devel] [PATCH 2/2] gfs2: Switch to rhashtable_lookup_get_insert_fast Andreas Gruenbacher
  2017-02-22 15:21 ` [Cluster-devel] [PATCH 0/2] GFS2 rhashtable cleanup Steven Whitehouse
  2 siblings, 1 reply; 5+ messages in thread
From: Andreas Gruenbacher @ 2017-02-22 15:14 UTC (permalink / raw)
  To: cluster-devel.redhat.com

Add rhashtable_lookup_get_insert_fast for fixed keys, similar to
rhashtable_lookup_get_insert_key for explicit keys.

Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
Cc: Pablo Neira Ayuso <pablo@netfilter.org>
Cc: Herbert Xu <herbert@gondor.apana.org.au>
Cc: Thomas Graf <tgraf@suug.ch>
---
 include/linux/rhashtable.h | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/include/linux/rhashtable.h b/include/linux/rhashtable.h
index 5c132d3..a85c14f 100644
--- a/include/linux/rhashtable.h
+++ b/include/linux/rhashtable.h
@@ -882,6 +882,28 @@ static inline int rhashtable_lookup_insert_fast(
 }
 
 /**
+ * rhashtable_lookup_get_insert_fast - lookup and insert object into hash table
+ * @ht:		hash table
+ * @obj:	pointer to hash head inside object
+ * @params:	hash table parameters
+ *
+ * Just like rhashtable_lookup_insert_fast(), but this function returns the
+ * object if it exists, NULL if it did not and the insertion was successful,
+ * and an ERR_PTR otherwise.
+ */
+static inline void *rhashtable_lookup_get_insert_fast(
+	struct rhashtable *ht, struct rhash_head *obj,
+	const struct rhashtable_params params)
+{
+	const char *key = rht_obj(ht, obj);
+
+	BUG_ON(ht->p.obj_hashfn);
+
+	return __rhashtable_insert_fast(ht, key + ht->p.key_offset, obj, params,
+					false);
+}
+
+/**
  * rhashtable_lookup_insert_key - search and insert object to hash table
  *				  with explicit key
  * @ht:		hash table
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [Cluster-devel] [PATCH 2/2] gfs2: Switch to rhashtable_lookup_get_insert_fast
  2017-02-22 15:14 [Cluster-devel] [PATCH 0/2] GFS2 rhashtable cleanup Andreas Gruenbacher
  2017-02-22 15:14 ` [Cluster-devel] [PATCH 1/2] rhashtable: Add rhashtable_lookup_get_insert_fast Andreas Gruenbacher
@ 2017-02-22 15:14 ` Andreas Gruenbacher
  2017-02-22 15:21 ` [Cluster-devel] [PATCH 0/2] GFS2 rhashtable cleanup Steven Whitehouse
  2 siblings, 0 replies; 5+ messages in thread
From: Andreas Gruenbacher @ 2017-02-22 15:14 UTC (permalink / raw)
  To: cluster-devel.redhat.com

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

Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
---
 fs/gfs2/glock.c | 45 +++++++++++++++++++++------------------------
 1 file changed, 21 insertions(+), 24 deletions(-)

diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c
index 1d60f5f..6dd834e4 100644
--- a/fs/gfs2/glock.c
+++ b/fs/gfs2/glock.c
@@ -653,10 +653,10 @@ int gfs2_glock_get(struct gfs2_sbd *sdp, u64 number,
 	struct lm_lockname name = { .ln_number = number,
 				    .ln_type = glops->go_type,
 				    .ln_sbd = sdp };
-	struct gfs2_glock *gl, *tmp = NULL;
+	struct gfs2_glock *gl, *tmp;
 	struct address_space *mapping;
 	struct kmem_cache *cachep;
-	int ret, tries = 0;
+	int ret = 0;
 
 	rcu_read_lock();
 	gl = rhashtable_lookup_fast(&gl_hash_table, &name, ht_parms);
@@ -721,35 +721,32 @@ int gfs2_glock_get(struct gfs2_sbd *sdp, u64 number,
 	}
 
 again:
-	ret = rhashtable_lookup_insert_fast(&gl_hash_table, &gl->gl_node,
-					    ht_parms);
-	if (ret == 0) {
+	rcu_read_lock();
+	tmp = rhashtable_lookup_get_insert_fast(&gl_hash_table, &gl->gl_node,
+						ht_parms);
+	if (!tmp) {
 		*glp = gl;
-		return 0;
+		goto out;
 	}
-
-	if (ret == -EEXIST) {
-		ret = 0;
-		rcu_read_lock();
-		tmp = rhashtable_lookup_fast(&gl_hash_table, &name, ht_parms);
-		if (tmp == NULL || !lockref_get_not_dead(&tmp->gl_lockref)) {
-			if (++tries < 100) {
-				rcu_read_unlock();
-				cond_resched();
-				goto again;
-			}
-			tmp = NULL;
-			ret = -ENOMEM;
-		}
-		rcu_read_unlock();
-	} else {
-		WARN_ON_ONCE(ret);
+	if (IS_ERR(tmp)) {
+		ret = PTR_ERR(tmp);
+		goto out_free;
+	}
+	if (lockref_get_not_dead(&tmp->gl_lockref)) {
+		*glp = tmp;
+		goto out_free;
 	}
+	rcu_read_unlock();
+	cond_resched();
+	goto again;
+
+out_free:
 	kfree(gl->gl_lksb.sb_lvbptr);
 	kmem_cache_free(cachep, gl);
 	atomic_dec(&sdp->sd_glock_disposal);
-	*glp = tmp;
 
+out:
+	rcu_read_unlock();
 	return ret;
 }
 
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [Cluster-devel] [PATCH 0/2] GFS2 rhashtable cleanup
  2017-02-22 15:14 [Cluster-devel] [PATCH 0/2] GFS2 rhashtable cleanup Andreas Gruenbacher
  2017-02-22 15:14 ` [Cluster-devel] [PATCH 1/2] rhashtable: Add rhashtable_lookup_get_insert_fast Andreas Gruenbacher
  2017-02-22 15:14 ` [Cluster-devel] [PATCH 2/2] gfs2: Switch to rhashtable_lookup_get_insert_fast Andreas Gruenbacher
@ 2017-02-22 15:21 ` Steven Whitehouse
  2 siblings, 0 replies; 5+ messages in thread
From: Steven Whitehouse @ 2017-02-22 15:21 UTC (permalink / raw)
  To: cluster-devel.redhat.com

Hi,

Ah, thats where the rhashtable bit has got to :-)

Looks good,

Steve.

On 22/02/17 15:14, Andreas Gruenbacher wrote:
> The first of these patches adds rhashtable_lookup_get_insert_fast, which is
> modeled after rhashtable_lookup_get_insert_key and returns existing objects in
> the hash table, other than rhashtable_lookup_insert_fast which returns -EEXIST.
>
> The second of these patch cleans up the GFS2 gfs2 rhashtable code by using
> rhashtable_lookup_get_insert_fast.
>
> Andreas Gruenbacher (2):
>    rhashtable: Add rhashtable_lookup_get_insert_fast
>    gfs2: Switch to rhashtable_lookup_get_insert_fast
>
>   fs/gfs2/glock.c            | 45 +++++++++++++++++++++------------------------
>   include/linux/rhashtable.h | 22 ++++++++++++++++++++++
>   2 files changed, 43 insertions(+), 24 deletions(-)
>



^ permalink raw reply	[flat|nested] 5+ messages in thread

* [Cluster-devel] [PATCH 1/2] rhashtable: Add rhashtable_lookup_get_insert_fast
  2017-02-22 15:14 ` [Cluster-devel] [PATCH 1/2] rhashtable: Add rhashtable_lookup_get_insert_fast Andreas Gruenbacher
@ 2017-02-24 14:22   ` Herbert Xu
  0 siblings, 0 replies; 5+ messages in thread
From: Herbert Xu @ 2017-02-24 14:22 UTC (permalink / raw)
  To: cluster-devel.redhat.com

On Wed, Feb 22, 2017 at 04:14:47PM +0100, Andreas Gruenbacher wrote:
> Add rhashtable_lookup_get_insert_fast for fixed keys, similar to
> rhashtable_lookup_get_insert_key for explicit keys.
> 
> Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
> Cc: Pablo Neira Ayuso <pablo@netfilter.org>
> Cc: Herbert Xu <herbert@gondor.apana.org.au>
> Cc: Thomas Graf <tgraf@suug.ch>

Acked-by: Herbert Xu <herbert@gondor.apana.org.au>
-- 
Email: Herbert Xu <herbert@gondor.apana.org.au>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt



^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2017-02-24 14:22 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-02-22 15:14 [Cluster-devel] [PATCH 0/2] GFS2 rhashtable cleanup Andreas Gruenbacher
2017-02-22 15:14 ` [Cluster-devel] [PATCH 1/2] rhashtable: Add rhashtable_lookup_get_insert_fast Andreas Gruenbacher
2017-02-24 14:22   ` Herbert Xu
2017-02-22 15:14 ` [Cluster-devel] [PATCH 2/2] gfs2: Switch to rhashtable_lookup_get_insert_fast Andreas Gruenbacher
2017-02-22 15:21 ` [Cluster-devel] [PATCH 0/2] GFS2 rhashtable cleanup Steven Whitehouse

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.