rxe_pool.h 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  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. #ifndef RXE_POOL_H
  7. #define RXE_POOL_H
  8. enum rxe_elem_type {
  9. RXE_TYPE_UC,
  10. RXE_TYPE_PD,
  11. RXE_TYPE_AH,
  12. RXE_TYPE_SRQ,
  13. RXE_TYPE_QP,
  14. RXE_TYPE_CQ,
  15. RXE_TYPE_MR,
  16. RXE_TYPE_MW,
  17. RXE_NUM_TYPES, /* keep me last */
  18. };
  19. struct rxe_pool_elem {
  20. struct rxe_pool *pool;
  21. void *obj;
  22. struct kref ref_cnt;
  23. struct list_head list;
  24. struct completion complete;
  25. u32 index;
  26. };
  27. struct rxe_pool {
  28. struct rxe_dev *rxe;
  29. const char *name;
  30. void (*cleanup)(struct rxe_pool_elem *elem);
  31. enum rxe_elem_type type;
  32. unsigned int max_elem;
  33. atomic_t num_elem;
  34. size_t elem_size;
  35. size_t elem_offset;
  36. struct xarray xa;
  37. struct xa_limit limit;
  38. u32 next;
  39. };
  40. /* initialize a pool of objects with given limit on
  41. * number of elements. gets parameters from rxe_type_info
  42. * pool elements will be allocated out of a slab cache
  43. */
  44. void rxe_pool_init(struct rxe_dev *rxe, struct rxe_pool *pool,
  45. enum rxe_elem_type type);
  46. /* free resources from object pool */
  47. void rxe_pool_cleanup(struct rxe_pool *pool);
  48. /* allocate an object from pool */
  49. void *rxe_alloc(struct rxe_pool *pool);
  50. /* connect already allocated object to pool */
  51. int __rxe_add_to_pool(struct rxe_pool *pool, struct rxe_pool_elem *elem,
  52. bool sleepable);
  53. #define rxe_add_to_pool(pool, obj) __rxe_add_to_pool(pool, &(obj)->elem, true)
  54. #define rxe_add_to_pool_ah(pool, obj, sleepable) __rxe_add_to_pool(pool, \
  55. &(obj)->elem, sleepable)
  56. /* lookup an indexed object from index. takes a reference on object */
  57. void *rxe_pool_get_index(struct rxe_pool *pool, u32 index);
  58. int __rxe_get(struct rxe_pool_elem *elem);
  59. #define rxe_get(obj) __rxe_get(&(obj)->elem)
  60. int __rxe_put(struct rxe_pool_elem *elem);
  61. #define rxe_put(obj) __rxe_put(&(obj)->elem)
  62. int __rxe_cleanup(struct rxe_pool_elem *elem, bool sleepable);
  63. #define rxe_cleanup(obj) __rxe_cleanup(&(obj)->elem, true)
  64. #define rxe_cleanup_ah(obj, sleepable) __rxe_cleanup(&(obj)->elem, sleepable)
  65. #define rxe_read(obj) kref_read(&(obj)->elem.ref_cnt)
  66. void __rxe_finalize(struct rxe_pool_elem *elem);
  67. #define rxe_finalize(obj) __rxe_finalize(&(obj)->elem)
  68. #endif /* RXE_POOL_H */