12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- /* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */
- /*
- * Copyright (c) 2016 Mellanox Technologies Ltd. All rights reserved.
- * Copyright (c) 2015 System Fabric Works, Inc. All rights reserved.
- */
- #ifndef RXE_POOL_H
- #define RXE_POOL_H
- enum rxe_elem_type {
- RXE_TYPE_UC,
- RXE_TYPE_PD,
- RXE_TYPE_AH,
- RXE_TYPE_SRQ,
- RXE_TYPE_QP,
- RXE_TYPE_CQ,
- RXE_TYPE_MR,
- RXE_TYPE_MW,
- RXE_NUM_TYPES, /* keep me last */
- };
- struct rxe_pool_elem {
- struct rxe_pool *pool;
- void *obj;
- struct kref ref_cnt;
- struct list_head list;
- struct completion complete;
- u32 index;
- };
- struct rxe_pool {
- struct rxe_dev *rxe;
- const char *name;
- void (*cleanup)(struct rxe_pool_elem *elem);
- enum rxe_elem_type type;
- unsigned int max_elem;
- atomic_t num_elem;
- size_t elem_size;
- size_t elem_offset;
- struct xarray xa;
- struct xa_limit limit;
- u32 next;
- };
- /* initialize a pool of objects with given limit on
- * number of elements. gets parameters from rxe_type_info
- * pool elements will be allocated out of a slab cache
- */
- void rxe_pool_init(struct rxe_dev *rxe, struct rxe_pool *pool,
- enum rxe_elem_type type);
- /* free resources from object pool */
- void rxe_pool_cleanup(struct rxe_pool *pool);
- /* allocate an object from pool */
- void *rxe_alloc(struct rxe_pool *pool);
- /* connect already allocated object to pool */
- int __rxe_add_to_pool(struct rxe_pool *pool, struct rxe_pool_elem *elem,
- bool sleepable);
- #define rxe_add_to_pool(pool, obj) __rxe_add_to_pool(pool, &(obj)->elem, true)
- #define rxe_add_to_pool_ah(pool, obj, sleepable) __rxe_add_to_pool(pool, \
- &(obj)->elem, sleepable)
- /* lookup an indexed object from index. takes a reference on object */
- void *rxe_pool_get_index(struct rxe_pool *pool, u32 index);
- int __rxe_get(struct rxe_pool_elem *elem);
- #define rxe_get(obj) __rxe_get(&(obj)->elem)
- int __rxe_put(struct rxe_pool_elem *elem);
- #define rxe_put(obj) __rxe_put(&(obj)->elem)
- int __rxe_cleanup(struct rxe_pool_elem *elem, bool sleepable);
- #define rxe_cleanup(obj) __rxe_cleanup(&(obj)->elem, true)
- #define rxe_cleanup_ah(obj, sleepable) __rxe_cleanup(&(obj)->elem, sleepable)
- #define rxe_read(obj) kref_read(&(obj)->elem.ref_cnt)
- void __rxe_finalize(struct rxe_pool_elem *elem);
- #define rxe_finalize(obj) __rxe_finalize(&(obj)->elem)
- #endif /* RXE_POOL_H */
|