aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/list_nulls.h
diff options
context:
space:
mode:
authorThomas Graf <tgraf@suug.ch>2015-01-02 23:00:21 +0100
committerDavid S. Miller <davem@davemloft.net>2015-01-03 14:32:57 -0500
commitf89bd6f87a53ce5a7d60662429591ebac2745c10 (patch)
tree69dafc1508219d2f3ee44647734db7c046f0b0f7 /include/linux/list_nulls.h
parentrhashtable: Per bucket locks & deferred expansion/shrinking (diff)
downloadlinux-dev-f89bd6f87a53ce5a7d60662429591ebac2745c10.tar.xz
linux-dev-f89bd6f87a53ce5a7d60662429591ebac2745c10.zip
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.h3
1 files changed, 2 insertions, 1 deletions
diff --git a/include/linux/list_nulls.h b/include/linux/list_nulls.h
index 5d10ae364b5e..e8c300e06438 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)
/**