1 /* SPDX-License-Identifier: GPL-2.0-or-later */
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.
13 #include <linux/device.h>
17 * enum rtrs_clt_state - Client states.
21 RTRS_CLT_CONNECTING_ERR
,
22 RTRS_CLT_RECONNECTING
,
31 MP_POLICY_MIN_INFLIGHT
,
34 /* see Documentation/ABI/testing/sysfs-class-rtrs-client for details */
35 struct rtrs_clt_stats_reconnects
{
40 /* see Documentation/ABI/testing/sysfs-class-rtrs-client for details */
41 struct rtrs_clt_stats_cpu_migr
{
46 /* stats for Read and write operation.
47 * see Documentation/ABI/testing/sysfs-class-rtrs-client for details
49 struct rtrs_clt_stats_rdma
{
58 struct rtrs_clt_stats_pcpu
{
59 struct rtrs_clt_stats_cpu_migr cpu_migr
;
60 struct rtrs_clt_stats_rdma rdma
;
63 struct rtrs_clt_stats
{
64 struct kobject kobj_stats
;
65 struct rtrs_clt_stats_pcpu __percpu
*pcpu_stats
;
66 struct rtrs_clt_stats_reconnects reconnects
;
72 struct rtrs_iu
*rsp_ius
;
75 struct mutex con_mutex
;
81 * rtrs_permit - permits the memory allocation for future RDMA operation.
82 * Combine with irq pinning to keep IO on same CPU.
85 enum rtrs_clt_con_type con_type
;
92 * rtrs_clt_io_req - describes one inflight IO request
94 struct rtrs_clt_io_req
{
95 struct list_head list
;
97 struct scatterlist
*sglist
; /* list holding user data */
100 unsigned int data_len
;
101 unsigned int usr_len
;
104 struct rtrs_clt_con
*con
;
105 struct rtrs_sg_desc
*desc
;
107 struct rtrs_permit
*permit
;
108 enum dma_data_direction dir
;
109 void (*conf
)(void *priv
, int errno
);
110 unsigned long start_jiffies
;
113 struct ib_cqe inv_cqe
;
114 struct completion inv_comp
;
125 struct rtrs_clt_sess
{
127 struct rtrs_clt
*clt
;
128 wait_queue_head_t state_wq
;
129 enum rtrs_clt_state state
;
130 atomic_t connected_cnt
;
131 struct mutex init_mutex
;
132 struct rtrs_clt_io_req
*reqs
;
133 struct delayed_work reconnect_dwork
;
134 struct work_struct close_work
;
135 unsigned int reconnect_attempts
;
137 struct rtrs_rbuf
*rbufs
;
142 u32 max_pages_per_mr
;
146 struct rtrs_clt_stats
*stats
;
147 /* cache hca_port and hca_name to display in sysfs */
149 char hca_name
[IB_DEVICE_NAME_MAX
];
150 struct list_head __percpu
155 struct list_head paths_list
; /* rcu protected list */
158 __rcu
* __percpu
*pcpu_path
;
161 struct mutex paths_mutex
;
162 struct mutex paths_ev_mutex
;
163 char sessname
[NAME_MAX
];
165 unsigned int max_reconnect_attempts
;
166 unsigned int reconnect_delay_sec
;
167 unsigned int max_segments
;
168 size_t max_segment_size
;
170 unsigned long *permits_map
;
173 wait_queue_head_t permits_wait
;
176 void (*link_ev
)(void *priv
,
177 enum rtrs_clt_link_ev ev
);
179 struct kobject
*kobj_paths
;
180 enum rtrs_mp_policy mp_policy
;
183 static inline struct rtrs_clt_con
*to_clt_con(struct rtrs_con
*c
)
185 return container_of(c
, struct rtrs_clt_con
, c
);
188 static inline struct rtrs_clt_sess
*to_clt_sess(struct rtrs_sess
*s
)
190 return container_of(s
, struct rtrs_clt_sess
, s
);
193 static inline int permit_size(struct rtrs_clt
*clt
)
195 return sizeof(struct rtrs_permit
) + clt
->pdu_sz
;
198 static inline struct rtrs_permit
*get_permit(struct rtrs_clt
*clt
, int idx
)
200 return (struct rtrs_permit
*)(clt
->permits
+ permit_size(clt
) * idx
);
203 int rtrs_clt_reconnect_from_sysfs(struct rtrs_clt_sess
*sess
);
204 int rtrs_clt_disconnect_from_sysfs(struct rtrs_clt_sess
*sess
);
205 int rtrs_clt_create_path_from_sysfs(struct rtrs_clt
*clt
,
206 struct rtrs_addr
*addr
);
207 int rtrs_clt_remove_path_from_sysfs(struct rtrs_clt_sess
*sess
,
208 const struct attribute
*sysfs_self
);
210 void rtrs_clt_set_max_reconnect_attempts(struct rtrs_clt
*clt
, int value
);
211 int rtrs_clt_get_max_reconnect_attempts(const struct rtrs_clt
*clt
);
212 void free_sess(struct rtrs_clt_sess
*sess
);
214 /* rtrs-clt-stats.c */
216 int rtrs_clt_init_stats(struct rtrs_clt_stats
*stats
);
218 void rtrs_clt_inc_failover_cnt(struct rtrs_clt_stats
*s
);
220 void rtrs_clt_update_wc_stats(struct rtrs_clt_con
*con
);
221 void rtrs_clt_update_all_stats(struct rtrs_clt_io_req
*req
, int dir
);
223 int rtrs_clt_reset_rdma_lat_distr_stats(struct rtrs_clt_stats
*stats
,
225 ssize_t
rtrs_clt_stats_rdma_lat_distr_to_str(struct rtrs_clt_stats
*stats
,
226 char *page
, size_t len
);
227 int rtrs_clt_reset_cpu_migr_stats(struct rtrs_clt_stats
*stats
, bool enable
);
228 int rtrs_clt_stats_migration_cnt_to_str(struct rtrs_clt_stats
*stats
, char *buf
,
230 int rtrs_clt_reset_reconnects_stat(struct rtrs_clt_stats
*stats
, bool enable
);
231 int rtrs_clt_stats_reconnects_to_str(struct rtrs_clt_stats
*stats
, char *buf
,
233 int rtrs_clt_reset_wc_comp_stats(struct rtrs_clt_stats
*stats
, bool enable
);
234 int rtrs_clt_stats_wc_completion_to_str(struct rtrs_clt_stats
*stats
, char *buf
,
236 int rtrs_clt_reset_rdma_stats(struct rtrs_clt_stats
*stats
, bool enable
);
237 ssize_t
rtrs_clt_stats_rdma_to_str(struct rtrs_clt_stats
*stats
,
238 char *page
, size_t len
);
239 int rtrs_clt_reset_all_stats(struct rtrs_clt_stats
*stats
, bool enable
);
240 ssize_t
rtrs_clt_reset_all_help(struct rtrs_clt_stats
*stats
,
241 char *page
, size_t len
);
243 /* rtrs-clt-sysfs.c */
245 int rtrs_clt_create_sysfs_root_files(struct rtrs_clt
*clt
);
246 void rtrs_clt_destroy_sysfs_root_folders(struct rtrs_clt
*clt
);
247 void rtrs_clt_destroy_sysfs_root_files(struct rtrs_clt
*clt
);
249 int rtrs_clt_create_sess_files(struct rtrs_clt_sess
*sess
);
250 void rtrs_clt_destroy_sess_files(struct rtrs_clt_sess
*sess
,
251 const struct attribute
*sysfs_self
);
253 #endif /* RTRS_CLT_H */