/*! \file linuxlist.h
 *
 * Simple doubly linked list implementation.
 *
 * Some of the internal functions ("__xxx") are useful when
 * manipulating whole llists rather than single entries, as
 * sometimes we already know the next/prev entries and we can
 * generate better code by using them directly rather than
 * using the generic single-entry routines.
 */

#pragma once

/*! \defgroup linuxlist Simple doubly linked list implementation
 *  @{
 * \file linuxlist.h */

#include <stddef.h>
#include <stdbool.h>

#ifndef inline
#define inline __inline__
#endif

static inline void prefetch(const void *x) {;}

/*! Cast a member of a structure out to the containing structure.
 *  \param[in] ptr    the pointer to the member.
 *  \param[in] type   the type of the container struct this is embedded in.
 *  \param[in] member the name of the member within the struct.
 */
#define container_of(ptr, type, member) ({			\
	const typeof( ((type *)0)->member ) *__mptr = (ptr);	\
	(type *)( (char *)__mptr - offsetof(type, member) );})


/*!
 * These are non-NULL pointers that will result in page faults
 * under normal circumstances, used to verify that nobody uses
 * non-initialized llist entries.
 */
#define LLIST_POISON1  ((void *) 0x00100100)
#define LLIST_POISON2  ((void *) 0x00200200)

/*! (double) linked list header structure */
struct llist_head {
	/*! Pointer to next and previous item */
	struct llist_head *next, *prev;
};

/*! Define a new llist_head pointing to a given llist_head.
 *  \param[in] name another llist_head to be pointed.
 */
#define LLIST_HEAD_INIT(name) { &(name), &(name) }

/*! Define a statically-initialized variable of type llist_head.
 *  \param[in] name variable (symbol) name.
 */
#define LLIST_HEAD(name) \
	struct llist_head name = LLIST_HEAD_INIT(name)

/*! Initialize a llist_head to point back to itself.
 *  \param[in] ptr llist_head to be initialized.
 */
#define INIT_LLIST_HEAD(ptr) do { \
	(ptr)->next = (ptr); (ptr)->prev = (ptr); \
} while (0)

/*
 * Insert a new entry between two known consecutive entries.
 *
 * This is only for internal llist manipulation where we know
 * the prev/next entries already!
 */
static inline void __llist_add(struct llist_head *_new,
			       struct llist_head *prev,
			       struct llist_head *next)
{
	next->prev = _new;
	_new->next = next;
	_new->prev = prev;
	prev->next = _new;
}

/*! Add a new entry into a linked list (at head).
 *  \param _new the entry to be added.
 *  \param head llist_head to prepend the element to.
 *
 * Insert a new entry after the specified head.
 * This is good for implementing stacks.
 */
static inline void llist_add(struct llist_head *_new, struct llist_head *head)
{
	__llist_add(_new, head, head->next);
}

/*! Add a new entry into a linked list (at tail).
 *  \param _new the entry to be added.
 *  \param head llist_head to append the element to.
 *
 * Insert a new entry before the specified head.
 * This is useful for implementing queues.
 */
static inline void llist_add_tail(struct llist_head *_new, struct llist_head *head)
{
	__llist_add(_new, head->prev, head);
}

/*
 * Delete a llist entry by making the prev/next entries
 * point to each other.
 *
 * This is only for internal llist manipulation where we know
 * the prev/next entries already!
 */
static inline void __llist_del(struct llist_head * prev, struct llist_head * next)
{
	next->prev = prev;
	prev->next = next;
}

/*! Delete a single entry from a linked list.
 *  \param entry the element to delete.
 *
 * Note: llist_empty on entry does not return true after this, the entry is
 * in an undefined state.
 */
static inline void llist_del(struct llist_head *entry)
{
	__llist_del(entry->prev, entry->next);
	entry->next = (struct llist_head *)LLIST_POISON1;
	entry->prev = (struct llist_head *)LLIST_POISON2;
}

/*! Delete a single entry from a linked list and reinitialize it.
 *  \param entry the element to delete and reinitialize.
 */
static inline void llist_del_init(struct llist_head *entry)
{
	__llist_del(entry->prev, entry->next);
	INIT_LLIST_HEAD(entry);
}

/*! Delete from one llist and add as another's head.
 *  \param llist the entry to move.
 *  \param head  the head that will precede our entry.
 */
static inline void llist_move(struct llist_head *llist, struct llist_head *head)
{
	__llist_del(llist->prev, llist->next);
	llist_add(llist, head);
}

/*! Delete from one llist and add as another's tail.
 *  \param llist the entry to move.
 *  \param head  the head that will follow our entry.
 */
static inline void llist_move_tail(struct llist_head *llist,
				   struct llist_head *head)
{
	__llist_del(llist->prev, llist->next);
	llist_add_tail(llist, head);
}

/*! Test whether a linked list is empty.
 *  \param[in] head the llist to test.
 *  \returns 1 if the list is empty, 0 otherwise.
 */
static inline int llist_empty(const struct llist_head *head)
{
	return head->next == head;
}

static inline void __llist_splice(struct llist_head *llist,
				  struct llist_head *head)
{
	struct llist_head *first = llist->next;
	struct llist_head *last = llist->prev;
	struct llist_head *at = head->next;

	first->prev = head;
	head->next = first;

	last->next = at;
	at->prev = last;
}

/*! Join two linked lists.
 *  \param llist the new linked list to add.
 *  \param head  the place to add llist within the other list.
 */
static inline void llist_splice(struct llist_head *llist, struct llist_head *head)
{
	if (!llist_empty(llist))
		__llist_splice(llist, head);
}

/*! Join two llists and reinitialise the emptied llist.
 *  \param llist the new linked list to add.
 *  \param head  the place to add it within the first llist.
 *
 * The llist is reinitialised.
 */
static inline void llist_splice_init(struct llist_head *llist,
				     struct llist_head *head)
{
	if (!llist_empty(llist)) {
		__llist_splice(llist, head);
		INIT_LLIST_HEAD(llist);
	}
}

/*! Get the struct containing this list entry.
 *  \param ptr    the llist_head pointer.
 *  \param type   the type of the struct this is embedded in.
 *  \param member the name of the llist_head within the struct.
 */
#define llist_entry(ptr, type, member) \
	container_of(ptr, type, member)

/*! Get the first element from a linked list.
 *  \param ptr    the list head to take the element from.
 *  \param type   the type of the struct this is embedded in.
 *  \param member the name of the list_head within the struct.
 *
 * Note, that list is expected to be not empty.
 */
#define llist_first_entry(ptr, type, member) \
	llist_entry((ptr)->next, type, member)

/*! Get the last element from a list.
 *  \param ptr    the list head to take the element from.
 *  \param type   the type of the struct this is embedded in.
 *  \param member the name of the llist_head within the struct.
 *
 * Note, that list is expected to be not empty.
 */
#define llist_last_entry(ptr, type, member) \
	llist_entry((ptr)->prev, type, member)

/*! Get the first element from a list, or NULL.
 *  \param ptr    the list head to take the element from.
 *  \param type   the type of the struct this is embedded in.
 *  \param member the name of the list_head within the struct.
 *
 * Note that if the list is empty, it returns NULL.
 */
#define llist_first_entry_or_null(ptr, type, member) \
	(!llist_empty(ptr) ? llist_first_entry(ptr, type, member) : NULL)

/*! Iterate over a linked list.
 *  \param pos  the llist_head to use as a loop counter.
 *  \param head the head of the list over which to iterate.
 */
#define llist_for_each(pos, head) \
	for (pos = (head)->next, prefetch(pos->next); pos != (head); \
		pos = pos->next, prefetch(pos->next))

/*! Iterate over a linked list (no prefetch).
 *  \param pos  the llist_head to use as a loop counter.
 *  \param head the head of the list over which to iterate.
 *
 * This variant differs from llist_for_each() in that it's the
 * simplest possible llist iteration code, no prefetching is done.
 * Use this for code that knows the llist to be very short (empty
 * or 1 entry) most of the time.
 */
#define __llist_for_each(pos, head) \
	for (pos = (head)->next; pos != (head); pos = pos->next)

/*! Iterate over a linked list backwards.
 *  \param pos  the llist_head to use as a loop counter.
 *  \param head the head of the list over which to iterate.
 */
#define llist_for_each_prev(pos, head) \
	for (pos = (head)->prev, prefetch(pos->prev); pos != (head); \
		pos = pos->prev, prefetch(pos->prev))

/*! Iterate over a linked list, safe against removal of llist entry.
 *  \param pos  the llist_head to use as a loop counter.
 *  \param n    another llist_head to use as temporary storage.
 *  \param head the head of the list over which to iterate.
 */
#define llist_for_each_safe(pos, n, head) \
	for (pos = (head)->next, n = pos->next; pos != (head); \
		pos = n, n = pos->next)

/*! Iterate over a linked list of a given type.
 *  \param pos    the 'type *' to use as a loop counter.
 *  \param head   the head of the list over which to iterate.
 *  \param member the name of the llist_head within the struct pos.
 */
#define llist_for_each_entry(pos, head, member)				\
	for (pos = llist_entry((head)->next, typeof(*pos), member),	\
		     prefetch(pos->member.next);			\
	     &pos->member != (head); 					\
	     pos = llist_entry(pos->member.next, typeof(*pos), member),	\
		     prefetch(pos->member.next))

/*! Iterate backwards over a linked list of a given type.
 *  \param pos    the 'type *' to use as a loop counter.
 *  \param head   the head of the list over which to iterate.
 *  \param member the name of the llist_head within the struct pos.
 */
#define llist_for_each_entry_reverse(pos, head, member)			\
	for (pos = llist_entry((head)->prev, typeof(*pos), member),	\
		     prefetch(pos->member.prev);			\
	     &pos->member != (head); 					\
	     pos = llist_entry(pos->member.prev, typeof(*pos), member),	\
		     prefetch(pos->member.prev))

/*! Iterate over a linked list of a given type,
 *  continuing after an existing point.
 *  \param pos    the 'type *' to use as a loop counter.
 *  \param head   the head of the list over which to iterate.
 *  \param member the name of the llist_head within the struct pos.
 */
#define llist_for_each_entry_continue(pos, head, member) 		\
	for (pos = llist_entry(pos->member.next, typeof(*pos), member),	\
		     prefetch(pos->member.next);			\
	     &pos->member != (head);					\
	     pos = llist_entry(pos->member.next, typeof(*pos), member),	\
		     prefetch(pos->member.next))

/*! Iterate over llist of given type, safe against removal of
 *  non-consecutive(!) llist entries.
 *  \param pos    the 'type *' to use as a loop counter.
 *  \param n      another 'type *' to use as temporary storage.
 *  \param head   the head of the list over which to iterate.
 *  \param member the name of the llist_head within the struct pos.
 */
#define llist_for_each_entry_safe(pos, n, head, member)			\
	for (pos = llist_entry((head)->next, typeof(*pos), member),	\
		n = llist_entry(pos->member.next, typeof(*pos), member);	\
	     &pos->member != (head); 					\
	     pos = n, n = llist_entry(n->member.next, typeof(*n), member))

/*! Iterate over an rcu-protected llist.
 *  \param pos  the llist_head to use as a loop counter.
 *  \param head the head of the list over which to iterate.
 */
#define llist_for_each_rcu(pos, head) \
	for (pos = (head)->next, prefetch(pos->next); pos != (head); \
		pos = pos->next, ({ smp_read_barrier_depends(); 0;}), prefetch(pos->next))

#define __llist_for_each_rcu(pos, head) \
	for (pos = (head)->next; pos != (head); \
		pos = pos->next, ({ smp_read_barrier_depends(); 0;}))

/*! Iterate over an rcu-protected llist, safe against removal of llist entry.
 *  \param pos  the llist_head to use as a loop counter.
 *  \param n    another llist_head to use as temporary storage.
 *  \param head the head of the list over which to iterate.
 */
#define llist_for_each_safe_rcu(pos, n, head) \
	for (pos = (head)->next, n = pos->next; pos != (head); \
		pos = n, ({ smp_read_barrier_depends(); 0;}), n = pos->next)

/*! Iterate over an rcu-protected llist of a given type.
 *  \param pos    the 'type *' to use as a loop counter.
 *  \param head   the head of the list over which to iterate.
 *  \param member the name of the llist_struct within the struct.
 */
#define llist_for_each_entry_rcu(pos, head, member)			\
	for (pos = llist_entry((head)->next, typeof(*pos), member),	\
		     prefetch(pos->member.next);			\
	     &pos->member != (head); 					\
	     pos = llist_entry(pos->member.next, typeof(*pos), member),	\
		     ({ smp_read_barrier_depends(); 0;}),		\
		     prefetch(pos->member.next))


/*! Iterate over an rcu-protected llist, continuing after existing point.
 *  \param pos  the llist_head to use as a loop counter.
 *  \param head the head of the list over which to iterate.
 */
#define llist_for_each_continue_rcu(pos, head) \
	for ((pos) = (pos)->next, prefetch((pos)->next); (pos) != (head); \
		(pos) = (pos)->next, ({ smp_read_barrier_depends(); 0;}), prefetch((pos)->next))

/*! Count number of llist items by iterating.
 *  \param head the llist head to count items of.
 *  \returns Number of items.
 *
 * This function is not efficient, mostly useful for small lists and non time
 * critical cases like unit tests.
 */
static inline unsigned int llist_count(const struct llist_head *head)
{
	struct llist_head *entry;
	unsigned int i = 0;
	llist_for_each(entry, head)
		i++;
	return i;
}



/*! Double linked lists with a single pointer list head.
 * Mostly useful for hash tables where the two pointer list head is
 * too wasteful.
 * You lose the ability to access the tail in O(1).
 */

struct hlist_head {
	struct hlist_node *first;
};

struct hlist_node {
	struct hlist_node *next, **pprev;
};

#define HLIST_HEAD_INIT { .first = NULL }
#define HLIST_HEAD(name) struct hlist_head name = {  .first = NULL }
#define INIT_HLIST_HEAD(ptr) ((ptr)->first = NULL)
static inline void INIT_HLIST_NODE(struct hlist_node *h)
{
	h->next = NULL;
	h->pprev = NULL;
}

#define READ_ONCE(x)	x
#define WRITE_ONCE(a, b) a = b

/*! Has node been removed from list and reinitialized?.
 * \param[in] h: Node to be checked
 * \return 1 if node is unhashed; 0 if not
 *
 * Not that not all removal functions will leave a node in unhashed
 * state.  For example, hlist_nulls_del_init_rcu() does leave the
 * node in unhashed state, but hlist_nulls_del() does not.
 */
static inline int hlist_unhashed(const struct hlist_node *h)
{
	return !h->pprev;
}

/*! Version of hlist_unhashed for lockless use.
 * \param[in] n Node to be checked
 * \return 1 if node is unhashed; 0 if not
 *
 * This variant of hlist_unhashed() must be used in lockless contexts
 * to avoid potential load-tearing.  The READ_ONCE() is paired with the
 * various WRITE_ONCE() in hlist helpers that are defined below.
 */
static inline int hlist_unhashed_lockless(const struct hlist_node *h)
{
	return !READ_ONCE(h->pprev);
}

/*!Is the specified hlist_head structure an empty hlist?.
 * \param[in] h Structure to check.
 * \return 1 if hlist is empty; 0 if not
 */
static inline int hlist_empty(const struct hlist_head *h)
{
	return !READ_ONCE(h->first);
}

static inline void __hlist_del(struct hlist_node *n)
{
	struct hlist_node *next = n->next;
	struct hlist_node **pprev = n->pprev;

	WRITE_ONCE(*pprev, next);
	if (next)
		WRITE_ONCE(next->pprev, pprev);
}

/*! Delete the specified hlist_node from its list.
 *  \param[in] n: Node to delete.
 *
 * Note that this function leaves the node in hashed state.  Use
 * hlist_del_init() or similar instead to unhash @n.
 */
static inline void hlist_del(struct hlist_node *n)
{
	__hlist_del(n);
	n->next = (struct hlist_node *)LLIST_POISON1;
	n->pprev = (struct hlist_node **)LLIST_POISON2;
}

/*! Delete the specified hlist_node from its list and initialize.
 * \param[in] n Node to delete.
 *
 * Note that this function leaves the node in unhashed state.
 */
static inline void hlist_del_init(struct hlist_node *n)
{
	if (!hlist_unhashed(n)) {
		__hlist_del(n);
		INIT_HLIST_NODE(n);
	}
}

/*! add a new entry at the beginning of the hlist.
 * \param[in] n new entry to be added
 * \param[in] h hlist head to add it after
 *
 * Insert a new entry after the specified head.
 * This is good for implementing stacks.
 */
static inline void hlist_add_head(struct hlist_node *n, struct hlist_head *h)
{
	struct hlist_node *first = h->first;
	WRITE_ONCE(n->next, first);
	if (first)
		WRITE_ONCE(first->pprev, &n->next);
	WRITE_ONCE(h->first, n);
	WRITE_ONCE(n->pprev, &h->first);
}

/*! add a new entry before the one specified.
 * @n: new entry to be added
 * @next: hlist node to add it before, which must be non-NULL
 */
static inline void hlist_add_before(struct hlist_node *n,
				    struct hlist_node *next)
{
	WRITE_ONCE(n->pprev, next->pprev);
	WRITE_ONCE(n->next, next);
	WRITE_ONCE(next->pprev, &n->next);
	WRITE_ONCE(*(n->pprev), n);
}

/*! add a new entry after the one specified
 * \param[in] n new entry to be added
 * \param[in] prev hlist node to add it after, which must be non-NULL
 */
static inline void hlist_add_behind(struct hlist_node *n,
				    struct hlist_node *prev)
{
	WRITE_ONCE(n->next, prev->next);
	WRITE_ONCE(prev->next, n);
	WRITE_ONCE(n->pprev, &prev->next);

	if (n->next)
		WRITE_ONCE(n->next->pprev, &n->next);
}

/*! create a fake hlist consisting of a single headless node.
 * \param[in] n Node to make a fake list out of
 *
 * This makes @n appear to be its own predecessor on a headless hlist.
 * The point of this is to allow things like hlist_del() to work correctly
 * in cases where there is no list.
 */
static inline void hlist_add_fake(struct hlist_node *n)
{
	n->pprev = &n->next;
}

/*! Is this node a fake hlist?.
 * \param[in] h Node to check for being a self-referential fake hlist.
 */
static inline bool hlist_fake(struct hlist_node *h)
{
	return h->pprev == &h->next;
}

/*!is node the only element of the specified hlist?.
 * \param[in] n Node to check for singularity.
 * \param[in] h Header for potentially singular list.
 *
 * Check whether the node is the only node of the head without
 * accessing head, thus avoiding unnecessary cache misses.
 */
static inline bool
hlist_is_singular_node(struct hlist_node *n, struct hlist_head *h)
{
	return !n->next && n->pprev == &h->first;
}

/*! Move an hlist.
 * \param[in] old hlist_head for old list.
 * \param[in] new hlist_head for new list.
 *
 * Move a list from one list head to another. Fixup the pprev
 * reference of the first entry if it exists.
 */
static inline void hlist_move_list(struct hlist_head *old,
				   struct hlist_head *_new)
{
	_new->first = old->first;
	if (_new->first)
		_new->first->pprev = &_new->first;
	old->first = NULL;
}

#define hlist_entry(ptr, type, member) container_of(ptr,type,member)

#define hlist_for_each(pos, head) \
	for (pos = (head)->first; pos ; pos = pos->next)

#define hlist_for_each_safe(pos, n, head) \
	for (pos = (head)->first; pos && ({ n = pos->next; 1; }); \
	     pos = n)

#define hlist_entry_safe(ptr, type, member) \
	({ typeof(ptr) ____ptr = (ptr); \
	   ____ptr ? hlist_entry(____ptr, type, member) : NULL; \
	})

/*! iterate over list of given type.
 * \param[out] pos	the type * to use as a loop cursor.
 * \param[in] head	the head for your list.
 * \param[in] member	the name of the hlist_node within the struct.
 */
#define hlist_for_each_entry(pos, head, member)				\
	for (pos = hlist_entry_safe((head)->first, typeof(*(pos)), member);\
	     pos;							\
	     pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member))

/*! iterate over a hlist continuing after current point.
 * \param[out] pos	the type * to use as a loop cursor.
 * \param[in] member	the name of the hlist_node within the struct.
 */
#define hlist_for_each_entry_continue(pos, member)			\
	for (pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member);\
	     pos;							\
	     pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member))

/*! iterate over a hlist continuing from current point.
 * \param[out] pos	the type * to use as a loop cursor.
 * \param[in] member	the name of the hlist_node within the struct.
 */
#define hlist_for_each_entry_from(pos, member)				\
	for (; pos;							\
	     pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member))

/*! hlist_for_each_entry_safe - iterate over list of given type safe against removal of list entry.
 * \param[out] pos the type * to use as a loop cursor.
 * \param[out] n a &struct hlist_node to use as temporary storage
 * \param[in] head the head for your list.
 * \param[in] member the name of the hlist_node within the struct
 */
#define hlist_for_each_entry_safe(pos, n, head, member) 		\
	for (pos = hlist_entry_safe((head)->first, typeof(*pos), member);\
	     pos && ({ n = pos->member.next; 1; });			\
	     pos = hlist_entry_safe(n, typeof(*pos), member))


/*!
 *  @}
 */
