Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-or-later */
0002 /*
0003  * RDMA Transport Layer
0004  *
0005  * Copyright (c) 2014 - 2018 ProfitBricks GmbH. All rights reserved.
0006  * Copyright (c) 2018 - 2019 1&1 IONOS Cloud GmbH. All rights reserved.
0007  * Copyright (c) 2019 - 2020 1&1 IONOS SE. All rights reserved.
0008  */
0009 
0010 #ifndef RTRS_CLT_H
0011 #define RTRS_CLT_H
0012 
0013 #include <linux/device.h>
0014 #include "rtrs-pri.h"
0015 
0016 /**
0017  * enum rtrs_clt_state - Client states.
0018  */
0019 enum rtrs_clt_state {
0020     RTRS_CLT_CONNECTING,
0021     RTRS_CLT_CONNECTING_ERR,
0022     RTRS_CLT_RECONNECTING,
0023     RTRS_CLT_CONNECTED,
0024     RTRS_CLT_CLOSING,
0025     RTRS_CLT_CLOSED,
0026     RTRS_CLT_DEAD,
0027 };
0028 
0029 enum rtrs_mp_policy {
0030     MP_POLICY_RR,
0031     MP_POLICY_MIN_INFLIGHT,
0032     MP_POLICY_MIN_LATENCY,
0033 };
0034 
0035 /* see Documentation/ABI/testing/sysfs-class-rtrs-client for details */
0036 struct rtrs_clt_stats_reconnects {
0037     int successful_cnt;
0038     int fail_cnt;
0039 };
0040 
0041 /* see Documentation/ABI/testing/sysfs-class-rtrs-client for details */
0042 struct rtrs_clt_stats_cpu_migr {
0043     atomic_t from;
0044     int to;
0045 };
0046 
0047 /* stats for Read and write operation.
0048  * see Documentation/ABI/testing/sysfs-class-rtrs-client for details
0049  */
0050 struct rtrs_clt_stats_rdma {
0051     struct {
0052         u64 cnt;
0053         u64 size_total;
0054     } dir[2];
0055 
0056     u64 failover_cnt;
0057 };
0058 
0059 struct rtrs_clt_stats_pcpu {
0060     struct rtrs_clt_stats_cpu_migr      cpu_migr;
0061     struct rtrs_clt_stats_rdma      rdma;
0062 };
0063 
0064 struct rtrs_clt_stats {
0065     struct kobject              kobj_stats;
0066     struct rtrs_clt_stats_pcpu    __percpu  *pcpu_stats;
0067     struct rtrs_clt_stats_reconnects    reconnects;
0068     atomic_t                inflight;
0069 };
0070 
0071 struct rtrs_clt_con {
0072     struct rtrs_con c;
0073     struct rtrs_iu      *rsp_ius;
0074     u32         queue_num;
0075     unsigned int        cpu;
0076     struct mutex        con_mutex;
0077     int         cm_err;
0078 };
0079 
0080 /**
0081  * rtrs_permit - permits the memory allocation for future RDMA operation.
0082  *       Combine with irq pinning to keep IO on same CPU.
0083  */
0084 struct rtrs_permit {
0085     enum rtrs_clt_con_type con_type;
0086     unsigned int cpu_id;
0087     unsigned int mem_id;
0088     unsigned int mem_off;
0089 };
0090 
0091 /**
0092  * rtrs_clt_io_req - describes one inflight IO request
0093  */
0094 struct rtrs_clt_io_req {
0095     struct list_head        list;
0096     struct rtrs_iu      *iu;
0097     struct scatterlist  *sglist; /* list holding user data */
0098     unsigned int        sg_cnt;
0099     unsigned int        sg_size;
0100     unsigned int        data_len;
0101     unsigned int        usr_len;
0102     void            *priv;
0103     bool            in_use;
0104     enum rtrs_mp_policy     mp_policy;
0105     struct rtrs_clt_con *con;
0106     struct rtrs_sg_desc *desc;
0107     struct ib_sge       *sge;
0108     struct rtrs_permit  *permit;
0109     enum dma_data_direction dir;
0110     void            (*conf)(void *priv, int errno);
0111     unsigned long       start_jiffies;
0112 
0113     struct ib_mr        *mr;
0114     struct ib_cqe       inv_cqe;
0115     struct completion   inv_comp;
0116     int         inv_errno;
0117     bool            need_inv_comp;
0118     bool            need_inv;
0119     refcount_t      ref;
0120 };
0121 
0122 struct rtrs_rbuf {
0123     u64 addr;
0124     u32 rkey;
0125 };
0126 
0127 struct rtrs_clt_path {
0128     struct rtrs_path    s;
0129     struct rtrs_clt_sess    *clt;
0130     wait_queue_head_t   state_wq;
0131     enum rtrs_clt_state state;
0132     atomic_t        connected_cnt;
0133     struct mutex        init_mutex;
0134     struct rtrs_clt_io_req  *reqs;
0135     struct delayed_work reconnect_dwork;
0136     struct work_struct  close_work;
0137     struct work_struct  err_recovery_work;
0138     unsigned int        reconnect_attempts;
0139     bool            established;
0140     struct rtrs_rbuf    *rbufs;
0141     size_t          max_io_size;
0142     u32         max_hdr_size;
0143     u32         chunk_size;
0144     size_t          queue_depth;
0145     u32         max_pages_per_mr;
0146     u32         flags;
0147     struct kobject      kobj;
0148     u8          for_new_clt;
0149     struct rtrs_clt_stats   *stats;
0150     /* cache hca_port and hca_name to display in sysfs */
0151     u8          hca_port;
0152     char                    hca_name[IB_DEVICE_NAME_MAX];
0153     struct list_head __percpu
0154                 *mp_skip_entry;
0155 };
0156 
0157 struct rtrs_clt_sess {
0158     struct list_head    paths_list; /* rcu protected list */
0159     size_t          paths_num;
0160     struct rtrs_clt_path
0161     __rcu * __percpu    *pcpu_path;
0162     uuid_t          paths_uuid;
0163     int         paths_up;
0164     struct mutex        paths_mutex;
0165     struct mutex        paths_ev_mutex;
0166     char            sessname[NAME_MAX];
0167     u16         port;
0168     unsigned int        max_reconnect_attempts;
0169     unsigned int        reconnect_delay_sec;
0170     unsigned int        max_segments;
0171     void            *permits;
0172     unsigned long       *permits_map;
0173     size_t          queue_depth;
0174     size_t          max_io_size;
0175     wait_queue_head_t   permits_wait;
0176     size_t          pdu_sz;
0177     void            *priv;
0178     void            (*link_ev)(void *priv,
0179                        enum rtrs_clt_link_ev ev);
0180     struct device       dev;
0181     struct kobject      *kobj_paths;
0182     enum rtrs_mp_policy mp_policy;
0183 };
0184 
0185 static inline struct rtrs_clt_con *to_clt_con(struct rtrs_con *c)
0186 {
0187     return container_of(c, struct rtrs_clt_con, c);
0188 }
0189 
0190 static inline struct rtrs_clt_path *to_clt_path(struct rtrs_path *s)
0191 {
0192     return container_of(s, struct rtrs_clt_path, s);
0193 }
0194 
0195 static inline int permit_size(struct rtrs_clt_sess *clt)
0196 {
0197     return sizeof(struct rtrs_permit) + clt->pdu_sz;
0198 }
0199 
0200 static inline struct rtrs_permit *get_permit(struct rtrs_clt_sess *clt,
0201                          int idx)
0202 {
0203     return (struct rtrs_permit *)(clt->permits + permit_size(clt) * idx);
0204 }
0205 
0206 int rtrs_clt_reconnect_from_sysfs(struct rtrs_clt_path *path);
0207 void rtrs_clt_close_conns(struct rtrs_clt_path *clt_path, bool wait);
0208 int rtrs_clt_create_path_from_sysfs(struct rtrs_clt_sess *clt,
0209                      struct rtrs_addr *addr);
0210 int rtrs_clt_remove_path_from_sysfs(struct rtrs_clt_path *path,
0211                      const struct attribute *sysfs_self);
0212 
0213 void rtrs_clt_set_max_reconnect_attempts(struct rtrs_clt_sess *clt, int value);
0214 int rtrs_clt_get_max_reconnect_attempts(const struct rtrs_clt_sess *clt);
0215 void free_path(struct rtrs_clt_path *clt_path);
0216 
0217 /* rtrs-clt-stats.c */
0218 
0219 int rtrs_clt_init_stats(struct rtrs_clt_stats *stats);
0220 
0221 void rtrs_clt_inc_failover_cnt(struct rtrs_clt_stats *s);
0222 
0223 void rtrs_clt_update_wc_stats(struct rtrs_clt_con *con);
0224 void rtrs_clt_update_all_stats(struct rtrs_clt_io_req *req, int dir);
0225 
0226 int rtrs_clt_reset_rdma_lat_distr_stats(struct rtrs_clt_stats *stats,
0227                      bool enable);
0228 ssize_t rtrs_clt_stats_rdma_lat_distr_to_str(struct rtrs_clt_stats *stats,
0229                           char *page);
0230 int rtrs_clt_reset_cpu_migr_stats(struct rtrs_clt_stats *stats, bool enable);
0231 int rtrs_clt_stats_migration_from_cnt_to_str(struct rtrs_clt_stats *stats, char *buf);
0232 int rtrs_clt_stats_migration_to_cnt_to_str(struct rtrs_clt_stats *stats, char *buf);
0233 int rtrs_clt_reset_reconnects_stat(struct rtrs_clt_stats *stats, bool enable);
0234 int rtrs_clt_stats_reconnects_to_str(struct rtrs_clt_stats *stats, char *buf);
0235 int rtrs_clt_reset_rdma_stats(struct rtrs_clt_stats *stats, bool enable);
0236 ssize_t rtrs_clt_stats_rdma_to_str(struct rtrs_clt_stats *stats,
0237                     char *page);
0238 int rtrs_clt_reset_all_stats(struct rtrs_clt_stats *stats, bool enable);
0239 ssize_t rtrs_clt_reset_all_help(struct rtrs_clt_stats *stats,
0240                  char *page);
0241 
0242 /* rtrs-clt-sysfs.c */
0243 
0244 int rtrs_clt_create_sysfs_root_files(struct rtrs_clt_sess *clt);
0245 void rtrs_clt_destroy_sysfs_root(struct rtrs_clt_sess *clt);
0246 
0247 int rtrs_clt_create_path_files(struct rtrs_clt_path *clt_path);
0248 void rtrs_clt_destroy_path_files(struct rtrs_clt_path *clt_path,
0249                   const struct attribute *sysfs_self);
0250 
0251 #endif /* RTRS_CLT_H */