Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/external/bsd/common/include/linux Rewrite linux hlist wi...
details: https://anonhg.NetBSD.org/src/rev/de1fe73b9a7e
branches: trunk
changeset: 365809:de1fe73b9a7e
user: riastradh <riastradh%NetBSD.org@localhost>
date: Mon Aug 27 06:50:03 2018 +0000
description:
Rewrite linux hlist with our pslist.
Upstream uses RCU for this now, so we need it.
diffstat:
sys/external/bsd/common/include/linux/list.h | 125 +++++++++++---------------
1 files changed, 53 insertions(+), 72 deletions(-)
diffs (163 lines):
diff -r bbf6d1057601 -r de1fe73b9a7e sys/external/bsd/common/include/linux/list.h
--- a/sys/external/bsd/common/include/linux/list.h Mon Aug 27 06:49:52 2018 +0000
+++ b/sys/external/bsd/common/include/linux/list.h Mon Aug 27 06:50:03 2018 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: list.h,v 1.6 2018/08/27 06:23:19 riastradh Exp $ */
+/* $NetBSD: list.h,v 1.7 2018/08/27 06:50:03 riastradh Exp $ */
/*-
* Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -45,6 +45,7 @@
#define _LINUX_LIST_H_
#include <sys/null.h>
+#include <sys/pslist.h>
#include <sys/queue.h>
#include <linux/kernel.h>
@@ -254,94 +255,74 @@
* `H'ead-only/`H'ash-table doubly-linked lists.
*/
-LIST_HEAD(hlist_head, hlist_node);
-struct hlist_node {
- LIST_ENTRY(hlist_node) hln_entry;
-};
-
-/*
- * XXX This works only because LIST_HEAD_INITIALIZER doesn't actually
- * use the name. Really, this is just initialization to a null
- * pointer.
- */
-#define HLIST_HEAD_INIT LIST_HEAD_INITIALIZER(dummy)
-
-static inline void
-INIT_HLIST_HEAD(struct hlist_head *head)
-{
- LIST_INIT(head);
-}
-
-static inline bool
-hlist_empty(struct hlist_head *head)
-{
- return LIST_EMPTY(head);
-}
+#define hlist_head pslist_head
+#define hlist_node pslist_entry
-static inline struct hlist_node *
-hlist_first(struct hlist_head *head)
-{
- return LIST_FIRST(head);
-}
-
-static inline struct hlist_node *
-hlist_next(struct hlist_node *node)
-{
- return LIST_NEXT(node, hln_entry);
-}
-
-static inline void
-hlist_add_head(struct hlist_node *node, struct hlist_head *head)
-{
- LIST_INSERT_HEAD(head, node, hln_entry);
-}
-
-static inline void
-hlist_add_after(struct hlist_node *node, struct hlist_node *next)
-{
- LIST_INSERT_AFTER(node, next, hln_entry);
-}
+#define HLIST_HEAD_INIT PSLIST_INITIALIZER
+#define INIT_HLIST_HEAD PSLIST_INIT
+#define hlist_empty(h) (pslist_writer_first(h) == NULL)
+#define hlist_first pslist_writer_first
+#define hlist_next pslist_writer_next
+#define hlist_add_head(n, h) pslist_writer_insert_head(h, n)
static inline void
hlist_del(struct hlist_node *node)
{
- LIST_REMOVE(node, hln_entry);
+
+ pslist_writer_remove(node);
+ /* XXX abstraction violation */
+ node->ple_prevp = _PSLIST_POISON;
}
static inline void
hlist_del_init(struct hlist_node *node)
{
- LIST_REMOVE(node, hln_entry);
+
+ /* XXX abstraction violation */
+ if (node->ple_prevp != NULL)
+ pslist_writer_remove(node);
}
#define hlist_entry(PTR, TYPE, FIELD) container_of(PTR, TYPE, FIELD)
-#define hlist_for_each(VAR, HEAD) LIST_FOREACH(VAR, HEAD, hln_entry)
-#define hlist_for_each_safe(VAR, NEXT, HEAD) \
- LIST_FOREACH_SAFE(VAR, HEAD, hln_entry, NEXT)
-
-#define hlist_for_each_entry(VAR, HEAD, FIELD) \
- for ((VAR) = hlist_entry(LIST_FIRST((HEAD)), typeof(*(VAR)), FIELD); \
- &(VAR)->FIELD != NULL; \
- (VAR) = hlist_entry(LIST_NEXT(&(VAR)->FIELD, hln_entry), \
- typeof(*(VAR)), FIELD))
+#define hlist_for_each(VAR, HEAD) \
+ for ((VAR) = hlist_first(HEAD); (VAR) != NULL; (VAR) = hlist_next(VAR))
+#define hlist_for_each_safe(VAR, NEXT, HEAD) \
+ for ((VAR) = hlist_first(HEAD), \
+ (NEXT) = ((VAR) == NULL ? NULL : hlist_next(HEAD)); \
+ (VAR) != NULL; \
+ (VAR) = (NEXT))
+#define hlist_for_each_entry(VAR, HEAD, FIELD) \
+ for ((VAR) = (hlist_first(HEAD) == NULL ? NULL : \
+ hlist_entry(hlist_first(HEAD), typeof(*(VAR)), \
+ FIELD)); \
+ (VAR) != NULL; \
+ (VAR) = (hlist_next(VAR) == NULL ? NULL : \
+ hlist_entry(hlist_next(VAR), typeof(*(VAR)), FIELD)))
#define hlist_for_each_entry_safe(VAR, NEXT, HEAD, FIELD) \
- for ((VAR) = hlist_entry(LIST_FIRST((HEAD)), typeof(*(VAR)), FIELD), \
- (NEXT) = (&(VAR)->FIELD == NULL ? NULL : \
- hlist_entry(LIST_NEXT(&(VAR)->FIELD, hln_entry), \
- typeof(*(VAR)), FIELD)); \
- &(VAR)->FIELD != NULL; \
+ for ((VAR) = (hlist_first(HEAD) == NULL ? NULL : \
+ hlist_entry(hlist_first(HEAD), typeof(*(VAR)), \
+ FIELD)), \
+ (NEXT) = ((VAR) == NULL ? NULL : \
+ hlist_entry(hlist_next(&(VAR)->FIELD), typeof(*(VAR)),\
+ FIELD)); \
+ (VAR) != NULL; \
(VAR) = (NEXT))
-/*
- * XXX The nominally RCU-safe APIs below lack dependent read barriers,
- * so they're not actually RCU-safe...on the alpha, anyway. Someone^TM
- * should fix this.
- */
+#define hlist_add_behind_rcu(n, p) pslist_writer_insert_after(p, n)
+#define hlist_add_head_rcu pslist_writer_insert_head
+#define hlist_del_init_rcu hlist_del_init /* no special needs */
+
+#define hlist_first_rcu pslist_reader_first
+#define hlist_next_rcu pslist_reader_next
-#define hlist_add_after_rcu hlist_add_after
-#define hlist_add_head_rcu hlist_add_head
-#define hlist_del_init_rcu hlist_del_init
-#define hlist_for_each_entry_rcu hlist_for_each_entry
+#define hlist_for_each_entry_rcu(VAR, HEAD, FIELD) \
+ for ((VAR) = (hlist_first_rcu(HEAD) == NULL ? NULL : \
+ hlist_entry(hlist_first_rcu(HEAD), typeof(*(VAR)), \
+ FIELD)); \
+ (VAR) != NULL; \
+ (VAR) = (hlist_next_rcu(VAR) == NULL ? NULL : \
+ hlist_entry(hlist_next_rcu(VAR), typeof(*(VAR)), \
+ FIELD)))
#endif /* _LINUX_LIST_H_ */
Home |
Main Index |
Thread Index |
Old Index