diff options
author | Thomas Graf <tgraf@suug.ch> | 2015-01-02 23:00:21 +0100 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-01-03 14:32:57 -0500 |
commit | f89bd6f87a53ce5a7d60662429591ebac2745c10 (patch) | |
tree | 69dafc1508219d2f3ee44647734db7c046f0b0f7 /include/linux/list_nulls.h | |
parent | 97defe1ecf868b8127f8e62395499d6a06e4c4b1 (diff) | |
download | op-kernel-dev-f89bd6f87a53ce5a7d60662429591ebac2745c10.zip op-kernel-dev-f89bd6f87a53ce5a7d60662429591ebac2745c10.tar.gz |
rhashtable: Supports for nulls marker
In order to allow for wider usage of rhashtable, use a special nulls
marker to terminate each chain. The reason for not using the existing
nulls_list is that the prev pointer usage would not be valid as entries
can be linked in two different buckets at the same time.
The 4 nulls base bits can be set through the rhashtable_params structure
like this:
struct rhashtable_params params = {
[...]
.nulls_base = (1U << RHT_BASE_SHIFT),
};
This reduces the hash length from 32 bits to 27 bits.
Signed-off-by: Thomas Graf <tgraf@suug.ch>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/linux/list_nulls.h')
-rw-r--r-- | include/linux/list_nulls.h | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/include/linux/list_nulls.h b/include/linux/list_nulls.h index 5d10ae36..e8c300e 100644 --- a/include/linux/list_nulls.h +++ b/include/linux/list_nulls.h @@ -21,8 +21,9 @@ struct hlist_nulls_head { struct hlist_nulls_node { struct hlist_nulls_node *next, **pprev; }; +#define NULLS_MARKER(value) (1UL | (((long)value) << 1)) #define INIT_HLIST_NULLS_HEAD(ptr, nulls) \ - ((ptr)->first = (struct hlist_nulls_node *) (1UL | (((long)nulls) << 1))) + ((ptr)->first = (struct hlist_nulls_node *) NULLS_MARKER(nulls)) #define hlist_nulls_entry(ptr, type, member) container_of(ptr,type,member) /** |