Commit 9186c90b authored by David S. Miller's avatar David S. Miller

Merge branch 'rhashtable-bitlocks'

NeilBrown says:

====================
Convert rhashtable to use bitlocks

This series converts rhashtable to use a per-bucket bitlock
rather than a separate array of spinlocks.
This:
  reduces memory usage
  results in slightly fewer memory accesses
  slightly improves parallelism
  makes a configuration option unnecessary

The main change from previous version is to use a distinct type for
the pointer in the bucket which has a bit-lock in it.  This
helped find two places where rht_ptr() was missed, one
in  rhashtable_free_and_destroy() in print_ht in the test code.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 1e045a62 149212f0
...@@ -48,7 +48,6 @@ typedef int (*rht_obj_cmpfn_t)(struct rhashtable_compare_arg *arg, ...@@ -48,7 +48,6 @@ typedef int (*rht_obj_cmpfn_t)(struct rhashtable_compare_arg *arg,
* @head_offset: Offset of rhash_head in struct to be hashed * @head_offset: Offset of rhash_head in struct to be hashed
* @max_size: Maximum size while expanding * @max_size: Maximum size while expanding
* @min_size: Minimum size while shrinking * @min_size: Minimum size while shrinking
* @locks_mul: Number of bucket locks to allocate per cpu (default: 32)
* @automatic_shrinking: Enable automatic shrinking of tables * @automatic_shrinking: Enable automatic shrinking of tables
* @hashfn: Hash function (default: jhash2 if !(key_len % 4), or jhash) * @hashfn: Hash function (default: jhash2 if !(key_len % 4), or jhash)
* @obj_hashfn: Function to hash object * @obj_hashfn: Function to hash object
...@@ -62,7 +61,6 @@ struct rhashtable_params { ...@@ -62,7 +61,6 @@ struct rhashtable_params {
unsigned int max_size; unsigned int max_size;
u16 min_size; u16 min_size;
bool automatic_shrinking; bool automatic_shrinking;
u8 locks_mul;
rht_hashfn_t hashfn; rht_hashfn_t hashfn;
rht_obj_hashfn_t obj_hashfn; rht_obj_hashfn_t obj_hashfn;
rht_obj_cmpfn_t obj_cmpfn; rht_obj_cmpfn_t obj_cmpfn;
......
This diff is collapsed.
...@@ -101,7 +101,6 @@ static const struct rhashtable_params ipc_kht_params = { ...@@ -101,7 +101,6 @@ static const struct rhashtable_params ipc_kht_params = {
.head_offset = offsetof(struct kern_ipc_perm, khtnode), .head_offset = offsetof(struct kern_ipc_perm, khtnode),
.key_offset = offsetof(struct kern_ipc_perm, key), .key_offset = offsetof(struct kern_ipc_perm, key),
.key_len = FIELD_SIZEOF(struct kern_ipc_perm, key), .key_len = FIELD_SIZEOF(struct kern_ipc_perm, key),
.locks_mul = 1,
.automatic_shrinking = true, .automatic_shrinking = true,
}; };
......
This diff is collapsed.
...@@ -500,7 +500,7 @@ static unsigned int __init print_ht(struct rhltable *rhlt) ...@@ -500,7 +500,7 @@ static unsigned int __init print_ht(struct rhltable *rhlt)
struct rhash_head *pos, *next; struct rhash_head *pos, *next;
struct test_obj_rhl *p; struct test_obj_rhl *p;
pos = rht_dereference(tbl->buckets[i], ht); pos = rht_ptr(rht_dereference(tbl->buckets[i], ht));
next = !rht_is_a_nulls(pos) ? rht_dereference(pos->next, ht) : NULL; next = !rht_is_a_nulls(pos) ? rht_dereference(pos->next, ht) : NULL;
if (!rht_is_a_nulls(pos)) { if (!rht_is_a_nulls(pos)) {
......
...@@ -33,7 +33,6 @@ static const struct rhashtable_params br_fdb_rht_params = { ...@@ -33,7 +33,6 @@ static const struct rhashtable_params br_fdb_rht_params = {
.key_offset = offsetof(struct net_bridge_fdb_entry, key), .key_offset = offsetof(struct net_bridge_fdb_entry, key),
.key_len = sizeof(struct net_bridge_fdb_key), .key_len = sizeof(struct net_bridge_fdb_key),
.automatic_shrinking = true, .automatic_shrinking = true,
.locks_mul = 1,
}; };
static struct kmem_cache *br_fdb_cache __read_mostly; static struct kmem_cache *br_fdb_cache __read_mostly;
......
...@@ -44,7 +44,6 @@ static const struct rhashtable_params br_mdb_rht_params = { ...@@ -44,7 +44,6 @@ static const struct rhashtable_params br_mdb_rht_params = {
.key_offset = offsetof(struct net_bridge_mdb_entry, addr), .key_offset = offsetof(struct net_bridge_mdb_entry, addr),
.key_len = sizeof(struct br_ip), .key_len = sizeof(struct br_ip),
.automatic_shrinking = true, .automatic_shrinking = true,
.locks_mul = 1,
}; };
static void br_multicast_start_querier(struct net_bridge *br, static void br_multicast_start_querier(struct net_bridge *br,
......
...@@ -21,7 +21,6 @@ static const struct rhashtable_params br_vlan_rht_params = { ...@@ -21,7 +21,6 @@ static const struct rhashtable_params br_vlan_rht_params = {
.key_offset = offsetof(struct net_bridge_vlan, vid), .key_offset = offsetof(struct net_bridge_vlan, vid),
.key_len = sizeof(u16), .key_len = sizeof(u16),
.nelem_hint = 3, .nelem_hint = 3,
.locks_mul = 1,
.max_size = VLAN_N_VID, .max_size = VLAN_N_VID,
.obj_cmpfn = br_vlan_cmp, .obj_cmpfn = br_vlan_cmp,
.automatic_shrinking = true, .automatic_shrinking = true,
......
...@@ -34,7 +34,6 @@ static const struct rhashtable_params br_vlan_tunnel_rht_params = { ...@@ -34,7 +34,6 @@ static const struct rhashtable_params br_vlan_tunnel_rht_params = {
.key_offset = offsetof(struct net_bridge_vlan, tinfo.tunnel_id), .key_offset = offsetof(struct net_bridge_vlan, tinfo.tunnel_id),
.key_len = sizeof(__be64), .key_len = sizeof(__be64),
.nelem_hint = 3, .nelem_hint = 3,
.locks_mul = 1,
.obj_cmpfn = br_vlan_tunid_cmp, .obj_cmpfn = br_vlan_tunid_cmp,
.automatic_shrinking = true, .automatic_shrinking = true,
}; };
......
...@@ -373,7 +373,6 @@ static const struct rhashtable_params ipmr_rht_params = { ...@@ -373,7 +373,6 @@ static const struct rhashtable_params ipmr_rht_params = {
.key_offset = offsetof(struct mfc_cache, cmparg), .key_offset = offsetof(struct mfc_cache, cmparg),
.key_len = sizeof(struct mfc_cache_cmp_arg), .key_len = sizeof(struct mfc_cache_cmp_arg),
.nelem_hint = 3, .nelem_hint = 3,
.locks_mul = 1,
.obj_cmpfn = ipmr_hash_cmp, .obj_cmpfn = ipmr_hash_cmp,
.automatic_shrinking = true, .automatic_shrinking = true,
}; };
......
...@@ -355,7 +355,6 @@ static const struct rhashtable_params ip6mr_rht_params = { ...@@ -355,7 +355,6 @@ static const struct rhashtable_params ip6mr_rht_params = {
.key_offset = offsetof(struct mfc6_cache, cmparg), .key_offset = offsetof(struct mfc6_cache, cmparg),
.key_len = sizeof(struct mfc6_cache_cmp_arg), .key_len = sizeof(struct mfc6_cache_cmp_arg),
.nelem_hint = 3, .nelem_hint = 3,
.locks_mul = 1,
.obj_cmpfn = ip6mr_hash_cmp, .obj_cmpfn = ip6mr_hash_cmp,
.automatic_shrinking = true, .automatic_shrinking = true,
}; };
......
...@@ -53,7 +53,6 @@ static const struct rhashtable_params nft_chain_ht_params = { ...@@ -53,7 +53,6 @@ static const struct rhashtable_params nft_chain_ht_params = {
.hashfn = nft_chain_hash, .hashfn = nft_chain_hash,
.obj_hashfn = nft_chain_hash_obj, .obj_hashfn = nft_chain_hash_obj,
.obj_cmpfn = nft_chain_hash_cmp, .obj_cmpfn = nft_chain_hash_cmp,
.locks_mul = 1,
.automatic_shrinking = true, .automatic_shrinking = true,
}; };
......
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