diff --git a/CMakeLists.txt b/CMakeLists.txt index a829cd477..c997c6d90 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,7 @@ # COPYRIGHT (c) 2016 Obsidian Research Corporation. See COPYING file # Run cmake as: # mkdir build +# cd build # cmake -GNinja .. # ninja # @@ -37,6 +38,8 @@ set(BUILD_INCLUDE ${CMAKE_BINARY_DIR}/include) set(BUILD_BIN ${CMAKE_BINARY_DIR}/bin) # Libraries set(BUILD_LIB ${CMAKE_BINARY_DIR}/lib) +# Common code +set(COMMON_CODE utils) # Location to place provider .driver files set(CONFIG_DIR "${CMAKE_INSTALL_FULL_SYSCONFDIR}/libibverbs.d") @@ -137,6 +140,10 @@ RDMA_AddOptCFlag(CMAKE_SHARED_LINKER_FLAGS SUPPORTS_NO_UNDEFINED "-Wl,--no-undef # Verify that GNU --version-script and asm(".symver") works find_package(LDSymVer REQUIRED) +#------------------------- +# Common code +include_directories(${COMMON_CODE}) + #------------------------- # Find libraries # pthread diff --git a/ibacm/linux/osd.h b/ibacm/linux/osd.h index 5ca4c6f55..1a738e0bf 100644 --- a/ibacm/linux/osd.h +++ b/ibacm/linux/osd.h @@ -46,6 +46,8 @@ #include #include +#include "../../utils/math.h" + #define ACM_CONF_DIR IBACM_CONFIG_PATH #define ACM_ADDR_FILE "ibacm_addr.cfg" #define ACM_OPTS_FILE "ibacm_opts.cfg" @@ -53,12 +55,6 @@ #define LIB_DESTRUCTOR __attribute__((destructor)) #define CDECL_FUNC -#define container_of(ptr, type, field) \ - ((type *) ((void *) ptr - offsetof(type, field))) - -#define min(a, b) (a < b ? a : b) -#define max(a, b) (a > b ? a : b) - #if __BYTE_ORDER == __LITTLE_ENDIAN #define htonll(x) bswap_64(x) #else diff --git a/libibverbs/examples/rc_pingpong.c b/libibverbs/examples/rc_pingpong.c index 967678362..cc45741be 100644 --- a/libibverbs/examples/rc_pingpong.c +++ b/libibverbs/examples/rc_pingpong.c @@ -49,13 +49,7 @@ #include "pingpong.h" -#ifndef max -#define max(x, y) (((x) > (y)) ? (x) : (y)) -#endif - -#ifndef min -#define min(x, y) (((x) < (y)) ? (x) : (y)) -#endif +#include "../../utils/math.h" enum { PINGPONG_RECV_WRID = 1, diff --git a/libmlx5/src/buf.c b/libmlx5/src/buf.c index c827930fd..ec8611e4f 100644 --- a/libmlx5/src/buf.c +++ b/libmlx5/src/buf.c @@ -259,16 +259,17 @@ static int alloc_huge_buf(struct mlx5_context *mctx, struct mlx5_buf *buf, size_t size, int page_size) { int found = 0; - LIST_HEAD(slist); int nchunk; struct mlx5_hugetlb_mem *hmem; + struct list_node *tmp, *cur; int ret; buf->length = align(size, MLX5_Q_CHUNK_SIZE); nchunk = buf->length / MLX5_Q_CHUNK_SIZE; mlx5_spin_lock(&mctx->hugetlb_lock); - list_for_each_entry(hmem, &mctx->hugetlb_list, list) { + list_for_each_node_safe(cur, tmp, &mctx->hugetlb_list) { + hmem = list_node(cur, struct mlx5_hugetlb_mem, entry); if (bitmap_avail(&hmem->bitmap)) { buf->base = bitmap_alloc_range(&hmem->bitmap, nchunk, 1); if (buf->base != -1) { @@ -297,9 +298,9 @@ static int alloc_huge_buf(struct mlx5_context *mctx, struct mlx5_buf *buf, mlx5_spin_lock(&mctx->hugetlb_lock); if (bitmap_avail(&hmem->bitmap)) - list_add(&hmem->list, &mctx->hugetlb_list); + list_add_node(&hmem->entry, &mctx->hugetlb_list); else - list_add_tail(&hmem->list, &mctx->hugetlb_list); + list_add_node_tail(&hmem->entry, &mctx->hugetlb_list); mlx5_spin_unlock(&mctx->hugetlb_lock); } @@ -318,7 +319,7 @@ static int alloc_huge_buf(struct mlx5_context *mctx, struct mlx5_buf *buf, mlx5_spin_lock(&mctx->hugetlb_lock); bitmap_free_range(&hmem->bitmap, buf->base, nchunk); if (bitmap_empty(&hmem->bitmap)) { - list_del(&hmem->list); + list_del_node(&hmem->entry); mlx5_spin_unlock(&mctx->hugetlb_lock); free_huge_mem(hmem); } else @@ -335,7 +336,7 @@ static void free_huge_buf(struct mlx5_context *ctx, struct mlx5_buf *buf) mlx5_spin_lock(&ctx->hugetlb_lock); bitmap_free_range(&buf->hmem->bitmap, buf->base, nchunk); if (bitmap_empty(&buf->hmem->bitmap)) { - list_del(&buf->hmem->list); + list_del_node(&buf->hmem->entry); mlx5_spin_unlock(&ctx->hugetlb_lock); free_huge_mem(buf->hmem); } else diff --git a/libmlx5/src/list.h b/libmlx5/src/list.h deleted file mode 100644 index cd7d25ba3..000000000 --- a/libmlx5/src/list.h +++ /dev/null @@ -1,331 +0,0 @@ -#ifndef _LINUX_LIST_H -#define _LINUX_LIST_H - -/* - * These are non-NULL pointers that will result in page faults - * under normal circumstances, used to verify that nobody uses - * non-initialized list entries. - */ -#define LIST_POISON1 ((void *) 0x00100100) -#define LIST_POISON2 ((void *) 0x00200200) - -/* - * Simple doubly linked list implementation. - * - * Some of the internal functions ("__xxx") are useful when - * manipulating whole lists 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. - */ - -struct list_head { - struct list_head *next, *prev; -}; - -#define LIST_HEAD_INIT(name) { &(name), &(name) } - -#define LIST_HEAD(name) \ - struct list_head name = LIST_HEAD_INIT(name) - -#define INIT_LIST_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 list manipulation where we know - * the prev/next entries already! - */ -static inline void __list_add(struct list_head *new, - struct list_head *prev, - struct list_head *next) -{ - next->prev = new; - new->next = next; - new->prev = prev; - prev->next = new; -} - -/** - * list_add - add a new entry - * @new: new entry to be added - * @head: list head to add it after - * - * Insert a new entry after the specified head. - * This is good for implementing stacks. - */ -static inline void list_add(struct list_head *new, struct list_head *head) -{ - __list_add(new, head, head->next); -} - -/** - * list_add_tail - add a new entry - * @new: new entry to be added - * @head: list head to add it before - * - * Insert a new entry before the specified head. - * This is useful for implementing queues. - */ -static inline void list_add_tail(struct list_head *new, struct list_head *head) -{ - __list_add(new, head->prev, head); -} - -/* - * Delete a list entry by making the prev/next entries - * point to each other. - * - * This is only for internal list manipulation where we know - * the prev/next entries already! - */ -static inline void __list_del(struct list_head *prev, struct list_head *next) -{ - next->prev = prev; - prev->next = next; -} - -/** - * list_del - deletes entry from list. - * @entry: the element to delete from the list. - * Note: list_empty on entry does not return true after this, the entry is - * in an undefined state. - */ -static inline void list_del(struct list_head *entry) -{ - __list_del(entry->prev, entry->next); - entry->next = LIST_POISON1; - entry->prev = LIST_POISON2; -} - -/** - * list_del_init - deletes entry from list and reinitialize it. - * @entry: the element to delete from the list. - */ -static inline void list_del_init(struct list_head *entry) -{ - __list_del(entry->prev, entry->next); - INIT_LIST_HEAD(entry); -} - -/** - * list_move - delete from one list and add as another's head - * @list: the entry to move - * @head: the head that will precede our entry - */ -static inline void list_move(struct list_head *list, struct list_head *head) -{ - __list_del(list->prev, list->next); - list_add(list, head); -} - -/** - * list_move_tail - delete from one list and add as another's tail - * @list: the entry to move - * @head: the head that will follow our entry - */ -static inline void list_move_tail(struct list_head *list, - struct list_head *head) -{ - __list_del(list->prev, list->next); - list_add_tail(list, head); -} - -/** - * list_empty - tests whether a list is empty - * @head: the list to test. - */ -static inline int list_empty(const struct list_head *head) -{ - return head->next == head; -} - -/** - * list_empty_careful - tests whether a list is - * empty _and_ checks that no other CPU might be - * in the process of still modifying either member - * - * NOTE: using list_empty_careful() without synchronization - * can only be safe if the only activity that can happen - * to the list entry is list_del_init(). Eg. it cannot be used - * if another CPU could re-list_add() it. - * - * @head: the list to test. - */ -static inline int list_empty_careful(const struct list_head *head) -{ - struct list_head *next = head->next; - return (next == head) && (next == head->prev); -} - -static inline void __list_splice(struct list_head *list, - struct list_head *head) -{ - struct list_head *first = list->next; - struct list_head *last = list->prev; - struct list_head *at = head->next; - - first->prev = head; - head->next = first; - - last->next = at; - at->prev = last; -} - -/** - * list_splice - join two lists - * @list: the new list to add. - * @head: the place to add it in the first list. - */ -static inline void list_splice(struct list_head *list, struct list_head *head) -{ - if (!list_empty(list)) - __list_splice(list, head); -} - -/** - * list_splice_init - join two lists and reinitialise the emptied list. - * @list: the new list to add. - * @head: the place to add it in the first list. - * - * The list at @list is reinitialised - */ -static inline void list_splice_init(struct list_head *list, - struct list_head *head) -{ - if (!list_empty(list)) { - __list_splice(list, head); - INIT_LIST_HEAD(list); - } -} - -#ifndef offsetof -#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) -#endif - -/** - * container_of - cast a member of a structure out to the containing structure - * - * @ptr: the pointer to the member. - * @type: the type of the container struct this is embedded in. - * @member: the name of the member within the struct. - * - */ -#ifndef container_of -#define container_of(ptr, type, member) ({ \ - const typeof(((type *)0)->member)*__mptr = (ptr); \ - (type *)((char *)__mptr - offsetof(type, member)); }) -#endif - - -/** - * list_entry - get the struct for this entry - * @ptr: the &struct list_head pointer. - * @type: the type of the struct this is embedded in. - * @member: the name of the list_struct within the struct. - */ -#define list_entry(ptr, type, member) \ - container_of(ptr, type, member) - -/** - * list_for_each - iterate over a list - * @pos: the &struct list_head to use as a loop counter. - * @head: the head for your list. - */ -#define list_for_each(pos, head) \ - for (pos = (head)->next; prefetch(pos->next), pos != (head); \ - pos->next) - -/** - * __list_for_each - iterate over a list - * @pos: the &struct list_head to use as a loop counter. - * @head: the head for your list. - * - * This variant differs from list_for_each() in that it's the - * simplest possible list iteration code, no prefetching is done. - * Use this for code that knows the list to be very short (empty - * or 1 entry) most of the time. - */ -#define __list_for_each(pos, head) \ - for (pos = (head)->next; pos != (head); pos = pos->next) - -/** - * list_for_each_prev - iterate over a list backwards - * @pos: the &struct list_head to use as a loop counter. - * @head: the head for your list. - */ -#define list_for_each_prev(pos, head) \ - for (pos = (head)->prev; prefetch(pos->prev), pos != (head); \ - pos = pos->prev) - -/** - * list_for_each_safe - iterate over a list safe against removal of list entry - * @pos: the &struct list_head to use as a loop counter. - * @n: another &struct list_head to use as temporary storage - * @head: the head for your list. - */ -#define list_for_each_safe(pos, n, head) \ - for (pos = (head)->next, n = pos->next; pos != (head); \ - pos = n, n = pos->next) - -/** - * list_for_each_entry - iterate over list of given type - * @pos: the type * to use as a loop counter. - * @head: the head for your list. - * @member: the name of the list_struct within the struct. - */ -#define list_for_each_entry(pos, head, member) \ - for (pos = list_entry((head)->next, typeof(*pos), member); \ - &pos->member != (head); \ - pos = list_entry(pos->member.next, typeof(*pos), member)) - -/** - * list_for_each_entry_reverse - iterate backwards over list of given type. - * @pos: the type * to use as a loop counter. - * @head: the head for your list. - * @member: the name of the list_struct within the struct. - */ -#define list_for_each_entry_reverse(pos, head, member) \ - for (pos = list_entry((head)->prev, typeof(*pos), member); \ - prefetch(pos->member.prev), &pos->member != (head); \ - pos = list_entry(pos->member.prev, typeof(*pos), member)) - -/** - * list_prepare_entry - prepare a pos entry for use as a start point in - * list_for_each_entry_continue - * @pos: the type * to use as a start point - * @head: the head of the list - * @member: the name of the list_struct within the struct. - */ -#define list_prepare_entry(pos, head, member) \ - ((pos) ? : list_entry(head, typeof(*pos), member)) - -/** - * list_for_each_entry_continue - iterate over list of given type - * continuing after existing point - * @pos: the type * to use as a loop counter. - * @head: the head for your list. - * @member: the name of the list_struct within the struct. - */ -#define list_for_each_entry_continue(pos, head, member) \ - for (pos = list_entry(pos->member.next, typeof(*pos), member); \ - prefetch(pos->member.next), &pos->member != (head); \ - pos = list_entry(pos->member.next, typeof(*pos), member)) - -/** - * list_for_each_entry_safe - iterate over list of given type safe against removal of list entry - * @pos: the type * to use as a loop counter. - * @n: another type * to use as temporary storage - * @head: the head for your list. - * @member: the name of the list_struct within the struct. - */ -#define list_for_each_entry_safe(pos, n, head, member) \ - for (pos = list_entry((head)->next, typeof(*pos), member), \ - n = list_entry(pos->member.next, typeof(*pos), member); \ - &pos->member != (head); \ - pos = n, n = list_entry(n->member.next, typeof(*n), member)) - -#endif - diff --git a/libmlx5/src/mlx5.h b/libmlx5/src/mlx5.h index dc90892d8..739249941 100644 --- a/libmlx5/src/mlx5.h +++ b/libmlx5/src/mlx5.h @@ -39,9 +39,11 @@ #include #include #include "mlx5-abi.h" -#include "list.h" #include "bitmap.h" +#include "../../utils/math.h" +#include "../../utils/list.h" + #ifdef __GNUC__ #define likely(x) __builtin_expect((x), 1) #define unlikely(x) __builtin_expect((x), 0) @@ -91,20 +93,6 @@ #endif -#ifndef min -#define min(a, b) \ - ({ typeof(a) _a = (a); \ - typeof(b) _b = (b); \ - _a < _b ? _a : _b; }) -#endif - -#ifndef max -#define max(a, b) \ - ({ typeof(a) _a = (a); \ - typeof(b) _b = (b); \ - _a > _b ? _a : _b; }) -#endif - #define HIDDEN __attribute__((visibility("hidden"))) #ifdef HAVE_FUNC_ATTRIBUTE_ALWAYS_INLINE @@ -367,7 +355,7 @@ struct mlx5_hugetlb_mem { int shmid; void *shmaddr; struct mlx5_bitmap bitmap; - struct list_head list; + struct list_node entry; }; struct mlx5_buf { diff --git a/libocrdma/src/ocrdma_main.c b/libocrdma/src/ocrdma_main.c index 5c494d842..6bd892c1f 100644 --- a/libocrdma/src/ocrdma_main.c +++ b/libocrdma/src/ocrdma_main.c @@ -46,7 +46,7 @@ #include "ocrdma_main.h" #include "ocrdma_abi.h" -#include "ocrdma_list.h" +#include "../../utils/list.h" #include #include @@ -68,7 +68,7 @@ struct { UCNA(EMULEX, GEN1), UCNA(EMULEX, GEN2), UCNA(EMULEX, GEN2_VF) }; -static DBLY_LIST_HEAD(ocrdma_dev_list); +static LIST_HEAD(ocrdma_dev_list); static struct ibv_context *ocrdma_alloc_context(struct ibv_device *, int); static void ocrdma_free_context(struct ibv_context *); @@ -222,7 +222,7 @@ struct ibv_device *ocrdma_driver_init(const char *uverbs_sys_path, pthread_mutex_init(&dev->dev_lock, NULL); pthread_spin_init(&dev->flush_q_lock, PTHREAD_PROCESS_PRIVATE); dev->ibv_dev.ops = ocrdma_dev_ops; - INIT_DBLY_LIST_NODE(&dev->entry); + INIT_LIST_NODE(&dev->entry); list_lock(&ocrdma_dev_list); list_add_node_tail(&dev->entry, &ocrdma_dev_list); list_unlock(&ocrdma_dev_list); @@ -244,7 +244,7 @@ void ocrdma_register_driver(void) static __attribute__ ((destructor)) void ocrdma_unregister_driver(void) { - struct ocrdma_list_node *cur, *tmp; + struct list_node *cur, *tmp; struct ocrdma_device *dev; list_lock(&ocrdma_dev_list); list_for_each_node_safe(cur, tmp, &ocrdma_dev_list) { diff --git a/libocrdma/src/ocrdma_main.h b/libocrdma/src/ocrdma_main.h index c81188b77..c7359c8ff 100644 --- a/libocrdma/src/ocrdma_main.h +++ b/libocrdma/src/ocrdma_main.h @@ -42,7 +42,7 @@ #include #include -#include "ocrdma_list.h" +#include "../../utils/list.h" #define ocrdma_err(format, arg...) printf(format, ##arg) @@ -58,7 +58,7 @@ struct ocrdma_device { struct ocrdma_qp **qp_tbl; pthread_mutex_t dev_lock; pthread_spinlock_t flush_q_lock; - struct ocrdma_list_node entry; + struct list_node entry; int id; int gen; uint32_t wqe_size; @@ -106,8 +106,8 @@ struct ocrdma_cq { uint8_t deferred_arm; uint8_t deferred_sol; uint8_t first_arm; - struct ocrdma_list_head sq_head; - struct ocrdma_list_head rq_head; + struct list_head sq_head; + struct list_head rq_head; }; enum { @@ -203,8 +203,8 @@ struct ocrdma_qp { enum ibv_qp_type qp_type; enum ocrdma_qp_state state; - struct ocrdma_list_node sq_entry; - struct ocrdma_list_node rq_entry; + struct list_node sq_entry; + struct list_node rq_entry; uint16_t id; uint16_t rsvd; uint32_t db_shift; diff --git a/libocrdma/src/ocrdma_verbs.c b/libocrdma/src/ocrdma_verbs.c index 606262606..3efc8bbdb 100644 --- a/libocrdma/src/ocrdma_verbs.c +++ b/libocrdma/src/ocrdma_verbs.c @@ -51,7 +51,7 @@ #include "ocrdma_main.h" #include "ocrdma_abi.h" -#include "ocrdma_list.h" +#include "../../utils/list.h" static void ocrdma_ring_cq_db(struct ocrdma_cq *cq, uint32_t armed, int solicited, uint32_t num_cqe); @@ -307,8 +307,8 @@ static struct ibv_cq *ocrdma_create_cq_common(struct ibv_context *context, ocrdma_ring_cq_db(cq, 0, 0, 0); } cq->ibv_cq.cqe = cqe; - INIT_DBLY_LIST_HEAD(&cq->sq_head); - INIT_DBLY_LIST_HEAD(&cq->rq_head); + INIT_LIST_HEAD(&cq->sq_head); + INIT_LIST_HEAD(&cq->rq_head); return &cq->ibv_cq; cq_err2: (void)ibv_cmd_destroy_cq(&cq->ibv_cq); @@ -621,8 +621,8 @@ struct ibv_qp *ocrdma_create_qp(struct ibv_pd *pd, } } qp->state = OCRDMA_QPS_RST; - INIT_DBLY_LIST_NODE(&qp->sq_entry); - INIT_DBLY_LIST_NODE(&qp->rq_entry); + INIT_LIST_NODE(&qp->sq_entry); + INIT_LIST_NODE(&qp->rq_entry); return &qp->ibv_qp; map_err: @@ -663,7 +663,7 @@ static int ocrdma_is_qp_in_sq_flushlist(struct ocrdma_cq *cq, struct ocrdma_qp *qp) { struct ocrdma_qp *list_qp; - struct ocrdma_list_node *cur, *tmp; + struct list_node *cur, *tmp; int found = 0; list_for_each_node_safe(cur, tmp, &cq->sq_head) { list_qp = list_node(cur, struct ocrdma_qp, sq_entry); @@ -679,7 +679,7 @@ static int ocrdma_is_qp_in_rq_flushlist(struct ocrdma_cq *cq, struct ocrdma_qp *qp) { struct ocrdma_qp *list_qp; - struct ocrdma_list_node *cur, *tmp; + struct list_node *cur, *tmp; int found = 0; list_for_each_node_safe(cur, tmp, &cq->rq_head) { list_qp = list_node(cur, struct ocrdma_qp, rq_entry); @@ -2034,7 +2034,7 @@ int ocrdma_poll_cq(struct ibv_cq *ibcq, int num_entries, struct ibv_wc *wc) int cqes_to_poll = num_entries; int num_os_cqe = 0, err_cqes = 0; struct ocrdma_qp *qp; - struct ocrdma_list_node *cur, *tmp; + struct list_node *cur, *tmp; cq = get_ocrdma_cq(ibcq); pthread_spin_lock(&cq->cq_lock); diff --git a/librdmacm/src/cma.h b/librdmacm/src/cma.h index 98eba8dc2..83d98b0d0 100644 --- a/librdmacm/src/cma.h +++ b/librdmacm/src/cma.h @@ -47,6 +47,8 @@ #include #include +#include "../../utils/math.h" + #ifdef INCLUDE_VALGRIND # include # ifndef VALGRIND_MAKE_MEM_DEFINED @@ -68,15 +70,6 @@ static inline uint64_t htonll(uint64_t x) { return x; } static inline uint64_t ntohll(uint64_t x) { return x; } #endif -#define max(a, b) ((a) > (b) ? a : b) -#define min(a, b) ((a) < (b) ? a : b) - -#ifndef container_of -#define container_of(ptr, type, field) \ - ((type *) ((void *)ptr - offsetof(type, field))) -#endif - - /* * Fast synchronization for low contention locking. */ diff --git a/libocrdma/src/ocrdma_list.h b/utils/list.h similarity index 71% rename from libocrdma/src/ocrdma_list.h rename to utils/list.h index 1e0f1ff6d..bc03e2bca 100644 --- a/libocrdma/src/ocrdma_list.h +++ b/utils/list.h @@ -32,33 +32,33 @@ * THE POSSIBILITY OF SUCH DAMAGE. */ -#ifndef __OCRDMA_LIST_H__ -#define __OCRDMA_LIST_H__ +#ifndef _RDMA_LIST_H__ +#define _RDMA_LIST_H__ -struct ocrdma_list_node { - struct ocrdma_list_node *next, *prev; +struct list_node { + struct list_node *next, *prev; }; -struct ocrdma_list_head { - struct ocrdma_list_node node; +struct list_head { + struct list_node node; pthread_mutex_t lock; }; -#define DBLY_LIST_HEAD_INIT(name) { { &(name.node), &(name.node) } , \ +#define LIST_HEAD_INIT(name) { { &(name.node), &(name.node) } , \ PTHREAD_MUTEX_INITIALIZER } -#define DBLY_LIST_HEAD(name) \ - struct ocrdma_list_head name = DBLY_LIST_HEAD_INIT(name); \ +#define LIST_HEAD(name) \ + struct list_head name = LIST_HEAD_INIT(name); -#define INIT_DBLY_LIST_NODE(ptr) do { \ +#define INIT_LIST_NODE(ptr) do { \ (ptr)->next = (ptr); (ptr)->prev = (ptr); \ } while (0) -#define INIT_DBLY_LIST_HEAD(ptr) INIT_DBLY_LIST_NODE(ptr.node) +#define INIT_LIST_HEAD(ptr) INIT_LIST_NODE(ptr.node) -static inline void __list_add_node(struct ocrdma_list_node *new, - struct ocrdma_list_node *prev, - struct ocrdma_list_node *next) +static inline void __list_add_node(struct list_node *new, + struct list_node *prev, + struct list_node *next) { next->prev = new; new->next = next; @@ -66,20 +66,27 @@ static inline void __list_add_node(struct ocrdma_list_node *new, prev->next = new; } -static inline void list_add_node_tail(struct ocrdma_list_node *new, - struct ocrdma_list_head *head) +static inline void list_add_node_tail(struct list_node *new, + struct list_head *head) { __list_add_node(new, head->node.prev, &head->node); } -static inline void __list_del_node(struct ocrdma_list_node *prev, - struct ocrdma_list_node *next) +static inline void list_add_node(struct list_node *new, + struct list_head *head) +{ + __list_add_node(new, &head->node, head->node.next); +} + + +static inline void __list_del_node(struct list_node *prev, + struct list_node *next) { next->prev = prev; prev->next = next; } -static inline void list_del_node(struct ocrdma_list_node *entry) +static inline void list_del_node(struct list_node *entry) { __list_del_node(entry->prev, entry->next); entry->next = entry->prev = 0; @@ -93,12 +100,12 @@ static inline void list_del_node(struct ocrdma_list_node *entry) /** * list_for_each_node_safe - iterate over a list safe against removal of list entry - * @pos: the &struct ocrdma_list_head to use as a loop counter. - * @n: another &struct ocrdma_list_head to use as temporary storage + * @pos: the &struct list_head to use as a loop counter. + * @n: another &struct list_head to use as temporary storage * @head: the head for your list. */ #define list_for_each_node_safe(pos, n, head) \ for (pos = (head)->node.next, n = pos->next; pos != &((head)->node); \ pos = n, n = pos->next) -#endif /* __OCRDMA_LIST_H__ */ +#endif /* _RDMA_LIST_H_ */ diff --git a/utils/math.h b/utils/math.h new file mode 100644 index 000000000..ffef54396 --- /dev/null +++ b/utils/math.h @@ -0,0 +1,44 @@ +/* + * This software is available to you under a choice of one of two + * licenses. You may choose to be licensed under the terms of the GNU + * General Public License (GPL) Version 2, available from the file + * COPYING in the main directory of this source tree, or the + * OpenIB.org BSD license below: + * + * Redistribution and use in source and binary forms, with or + * without modification, are permitted provided that the following + * conditions are met: + * + * - Redistributions of source code must retain the above + * copyright notice, this list of conditions and the following + * disclaimer. + * + * - Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */ + +#ifndef _RDMA_MATH_H_ +#define _RDMA_MATH_H_ +/* + * This include contains all common mathematical functions + */ +#ifndef min +#define min(a, b) (((a) < (b)) ? (a) : (b)) +#endif + +#ifndef max +#define max(a, b) (((a) > (b)) ? (a) : (b)) +#endif +#endif /* _RDMA_MATH_H_ */