rtrs-clt.h 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. /* SPDX-License-Identifier: GPL-2.0-or-later */
  2. /*
  3. * RDMA Transport Layer
  4. *
  5. * Copyright (c) 2014 - 2018 ProfitBricks GmbH. All rights reserved.
  6. * Copyright (c) 2018 - 2019 1&1 IONOS Cloud GmbH. All rights reserved.
  7. * Copyright (c) 2019 - 2020 1&1 IONOS SE. All rights reserved.
  8. */
  9. #ifndef RTRS_CLT_H
  10. #define RTRS_CLT_H
  11. #include <linux/device.h>
  12. #include "rtrs-pri.h"
  13. /**
  14. * enum rtrs_clt_state - Client states.
  15. */
  16. enum rtrs_clt_state {
  17. RTRS_CLT_CONNECTING,
  18. RTRS_CLT_CONNECTING_ERR,
  19. RTRS_CLT_RECONNECTING,
  20. RTRS_CLT_CONNECTED,
  21. RTRS_CLT_CLOSING,
  22. RTRS_CLT_CLOSED,
  23. RTRS_CLT_DEAD,
  24. };
  25. enum rtrs_mp_policy {
  26. MP_POLICY_RR,
  27. MP_POLICY_MIN_INFLIGHT,
  28. MP_POLICY_MIN_LATENCY,
  29. };
  30. /* see Documentation/ABI/testing/sysfs-class-rtrs-client for details */
  31. struct rtrs_clt_stats_reconnects {
  32. int successful_cnt;
  33. int fail_cnt;
  34. };
  35. /* see Documentation/ABI/testing/sysfs-class-rtrs-client for details */
  36. struct rtrs_clt_stats_cpu_migr {
  37. atomic_t from;
  38. int to;
  39. };
  40. /* stats for Read and write operation.
  41. * see Documentation/ABI/testing/sysfs-class-rtrs-client for details
  42. */
  43. struct rtrs_clt_stats_rdma {
  44. struct {
  45. u64 cnt;
  46. u64 size_total;
  47. } dir[2];
  48. u64 failover_cnt;
  49. };
  50. struct rtrs_clt_stats_pcpu {
  51. struct rtrs_clt_stats_cpu_migr cpu_migr;
  52. struct rtrs_clt_stats_rdma rdma;
  53. };
  54. struct rtrs_clt_stats {
  55. struct kobject kobj_stats;
  56. struct rtrs_clt_stats_pcpu __percpu *pcpu_stats;
  57. struct rtrs_clt_stats_reconnects reconnects;
  58. atomic_t inflight;
  59. };
  60. struct rtrs_clt_con {
  61. struct rtrs_con c;
  62. struct rtrs_iu *rsp_ius;
  63. u32 queue_num;
  64. unsigned int cpu;
  65. struct mutex con_mutex;
  66. int cm_err;
  67. };
  68. /**
  69. * rtrs_permit - permits the memory allocation for future RDMA operation.
  70. * Combine with irq pinning to keep IO on same CPU.
  71. */
  72. struct rtrs_permit {
  73. enum rtrs_clt_con_type con_type;
  74. unsigned int cpu_id;
  75. unsigned int mem_id;
  76. unsigned int mem_off;
  77. };
  78. /**
  79. * rtrs_clt_io_req - describes one inflight IO request
  80. */
  81. struct rtrs_clt_io_req {
  82. struct list_head list;
  83. struct rtrs_iu *iu;
  84. struct scatterlist *sglist; /* list holding user data */
  85. unsigned int sg_cnt;
  86. unsigned int sg_size;
  87. unsigned int data_len;
  88. unsigned int usr_len;
  89. void *priv;
  90. bool in_use;
  91. enum rtrs_mp_policy mp_policy;
  92. struct rtrs_clt_con *con;
  93. struct rtrs_sg_desc *desc;
  94. struct ib_sge *sge;
  95. struct rtrs_permit *permit;
  96. enum dma_data_direction dir;
  97. void (*conf)(void *priv, int errno);
  98. unsigned long start_jiffies;
  99. struct ib_mr *mr;
  100. struct ib_cqe inv_cqe;
  101. struct completion inv_comp;
  102. int inv_errno;
  103. bool need_inv_comp;
  104. bool need_inv;
  105. refcount_t ref;
  106. };
  107. struct rtrs_rbuf {
  108. u64 addr;
  109. u32 rkey;
  110. };
  111. struct rtrs_clt_path {
  112. struct rtrs_path s;
  113. struct rtrs_clt_sess *clt;
  114. wait_queue_head_t state_wq;
  115. enum rtrs_clt_state state;
  116. atomic_t connected_cnt;
  117. struct mutex init_mutex;
  118. struct rtrs_clt_io_req *reqs;
  119. struct delayed_work reconnect_dwork;
  120. struct work_struct close_work;
  121. struct work_struct err_recovery_work;
  122. unsigned int reconnect_attempts;
  123. bool established;
  124. struct rtrs_rbuf *rbufs;
  125. size_t max_io_size;
  126. u32 max_hdr_size;
  127. u32 chunk_size;
  128. size_t queue_depth;
  129. u32 max_pages_per_mr;
  130. u32 flags;
  131. struct kobject kobj;
  132. u8 for_new_clt;
  133. struct rtrs_clt_stats *stats;
  134. /* cache hca_port and hca_name to display in sysfs */
  135. u8 hca_port;
  136. char hca_name[IB_DEVICE_NAME_MAX];
  137. struct list_head __percpu
  138. *mp_skip_entry;
  139. };
  140. struct rtrs_clt_sess {
  141. struct list_head paths_list; /* rcu protected list */
  142. size_t paths_num;
  143. struct rtrs_clt_path
  144. __rcu * __percpu *pcpu_path;
  145. uuid_t paths_uuid;
  146. int paths_up;
  147. struct mutex paths_mutex;
  148. struct mutex paths_ev_mutex;
  149. char sessname[NAME_MAX];
  150. u16 port;
  151. unsigned int max_reconnect_attempts;
  152. unsigned int reconnect_delay_sec;
  153. unsigned int max_segments;
  154. void *permits;
  155. unsigned long *permits_map;
  156. size_t queue_depth;
  157. size_t max_io_size;
  158. wait_queue_head_t permits_wait;
  159. size_t pdu_sz;
  160. void *priv;
  161. void (*link_ev)(void *priv,
  162. enum rtrs_clt_link_ev ev);
  163. struct device dev;
  164. struct kobject *kobj_paths;
  165. enum rtrs_mp_policy mp_policy;
  166. };
  167. static inline struct rtrs_clt_con *to_clt_con(struct rtrs_con *c)
  168. {
  169. return container_of(c, struct rtrs_clt_con, c);
  170. }
  171. static inline struct rtrs_clt_path *to_clt_path(struct rtrs_path *s)
  172. {
  173. return container_of(s, struct rtrs_clt_path, s);
  174. }
  175. static inline int permit_size(struct rtrs_clt_sess *clt)
  176. {
  177. return sizeof(struct rtrs_permit) + clt->pdu_sz;
  178. }
  179. static inline struct rtrs_permit *get_permit(struct rtrs_clt_sess *clt,
  180. int idx)
  181. {
  182. return (struct rtrs_permit *)(clt->permits + permit_size(clt) * idx);
  183. }
  184. int rtrs_clt_reconnect_from_sysfs(struct rtrs_clt_path *path);
  185. void rtrs_clt_close_conns(struct rtrs_clt_path *clt_path, bool wait);
  186. int rtrs_clt_create_path_from_sysfs(struct rtrs_clt_sess *clt,
  187. struct rtrs_addr *addr);
  188. int rtrs_clt_remove_path_from_sysfs(struct rtrs_clt_path *path,
  189. const struct attribute *sysfs_self);
  190. void rtrs_clt_set_max_reconnect_attempts(struct rtrs_clt_sess *clt, int value);
  191. int rtrs_clt_get_max_reconnect_attempts(const struct rtrs_clt_sess *clt);
  192. void free_path(struct rtrs_clt_path *clt_path);
  193. /* rtrs-clt-stats.c */
  194. int rtrs_clt_init_stats(struct rtrs_clt_stats *stats);
  195. void rtrs_clt_inc_failover_cnt(struct rtrs_clt_stats *s);
  196. void rtrs_clt_update_wc_stats(struct rtrs_clt_con *con);
  197. void rtrs_clt_update_all_stats(struct rtrs_clt_io_req *req, int dir);
  198. int rtrs_clt_reset_rdma_lat_distr_stats(struct rtrs_clt_stats *stats,
  199. bool enable);
  200. ssize_t rtrs_clt_stats_rdma_lat_distr_to_str(struct rtrs_clt_stats *stats,
  201. char *page);
  202. int rtrs_clt_reset_cpu_migr_stats(struct rtrs_clt_stats *stats, bool enable);
  203. int rtrs_clt_stats_migration_from_cnt_to_str(struct rtrs_clt_stats *stats, char *buf);
  204. int rtrs_clt_stats_migration_to_cnt_to_str(struct rtrs_clt_stats *stats, char *buf);
  205. int rtrs_clt_reset_reconnects_stat(struct rtrs_clt_stats *stats, bool enable);
  206. int rtrs_clt_stats_reconnects_to_str(struct rtrs_clt_stats *stats, char *buf);
  207. int rtrs_clt_reset_rdma_stats(struct rtrs_clt_stats *stats, bool enable);
  208. ssize_t rtrs_clt_stats_rdma_to_str(struct rtrs_clt_stats *stats,
  209. char *page);
  210. int rtrs_clt_reset_all_stats(struct rtrs_clt_stats *stats, bool enable);
  211. ssize_t rtrs_clt_reset_all_help(struct rtrs_clt_stats *stats,
  212. char *page);
  213. /* rtrs-clt-sysfs.c */
  214. int rtrs_clt_create_sysfs_root_files(struct rtrs_clt_sess *clt);
  215. void rtrs_clt_destroy_sysfs_root(struct rtrs_clt_sess *clt);
  216. int rtrs_clt_create_path_files(struct rtrs_clt_path *clt_path);
  217. void rtrs_clt_destroy_path_files(struct rtrs_clt_path *clt_path,
  218. const struct attribute *sysfs_self);
  219. #endif /* RTRS_CLT_H */