rxe_pool.h (1842B)
1/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */ 2/* 3 * Copyright (c) 2016 Mellanox Technologies Ltd. All rights reserved. 4 * Copyright (c) 2015 System Fabric Works, Inc. All rights reserved. 5 */ 6 7#ifndef RXE_POOL_H 8#define RXE_POOL_H 9 10enum rxe_elem_type { 11 RXE_TYPE_UC, 12 RXE_TYPE_PD, 13 RXE_TYPE_AH, 14 RXE_TYPE_SRQ, 15 RXE_TYPE_QP, 16 RXE_TYPE_CQ, 17 RXE_TYPE_MR, 18 RXE_TYPE_MW, 19 RXE_NUM_TYPES, /* keep me last */ 20}; 21 22struct rxe_pool_elem { 23 struct rxe_pool *pool; 24 void *obj; 25 struct kref ref_cnt; 26 struct list_head list; 27 u32 index; 28}; 29 30struct rxe_pool { 31 struct rxe_dev *rxe; 32 const char *name; 33 void (*cleanup)(struct rxe_pool_elem *elem); 34 enum rxe_elem_type type; 35 36 unsigned int max_elem; 37 atomic_t num_elem; 38 size_t elem_size; 39 size_t elem_offset; 40 41 struct xarray xa; 42 struct xa_limit limit; 43 u32 next; 44}; 45 46/* initialize a pool of objects with given limit on 47 * number of elements. gets parameters from rxe_type_info 48 * pool elements will be allocated out of a slab cache 49 */ 50void rxe_pool_init(struct rxe_dev *rxe, struct rxe_pool *pool, 51 enum rxe_elem_type type); 52 53/* free resources from object pool */ 54void rxe_pool_cleanup(struct rxe_pool *pool); 55 56/* allocate an object from pool */ 57void *rxe_alloc(struct rxe_pool *pool); 58 59/* connect already allocated object to pool */ 60int __rxe_add_to_pool(struct rxe_pool *pool, struct rxe_pool_elem *elem); 61 62#define rxe_add_to_pool(pool, obj) __rxe_add_to_pool(pool, &(obj)->elem) 63 64/* lookup an indexed object from index. takes a reference on object */ 65void *rxe_pool_get_index(struct rxe_pool *pool, u32 index); 66 67int __rxe_get(struct rxe_pool_elem *elem); 68 69#define rxe_get(obj) __rxe_get(&(obj)->elem) 70 71int __rxe_put(struct rxe_pool_elem *elem); 72 73#define rxe_put(obj) __rxe_put(&(obj)->elem) 74 75#define rxe_read(obj) kref_read(&(obj)->elem.ref_cnt) 76 77#endif /* RXE_POOL_H */