123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251 |
- /* SPDX-License-Identifier: GPL-2.0-or-later */
- /*
- * RDMA Transport Layer
- *
- * Copyright (c) 2014 - 2018 ProfitBricks GmbH. All rights reserved.
- * Copyright (c) 2018 - 2019 1&1 IONOS Cloud GmbH. All rights reserved.
- * Copyright (c) 2019 - 2020 1&1 IONOS SE. All rights reserved.
- */
- #ifndef RTRS_CLT_H
- #define RTRS_CLT_H
- #include <linux/device.h>
- #include "rtrs-pri.h"
- /**
- * enum rtrs_clt_state - Client states.
- */
- enum rtrs_clt_state {
- RTRS_CLT_CONNECTING,
- RTRS_CLT_CONNECTING_ERR,
- RTRS_CLT_RECONNECTING,
- RTRS_CLT_CONNECTED,
- RTRS_CLT_CLOSING,
- RTRS_CLT_CLOSED,
- RTRS_CLT_DEAD,
- };
- enum rtrs_mp_policy {
- MP_POLICY_RR,
- MP_POLICY_MIN_INFLIGHT,
- MP_POLICY_MIN_LATENCY,
- };
- /* see Documentation/ABI/testing/sysfs-class-rtrs-client for details */
- struct rtrs_clt_stats_reconnects {
- int successful_cnt;
- int fail_cnt;
- };
- /* see Documentation/ABI/testing/sysfs-class-rtrs-client for details */
- struct rtrs_clt_stats_cpu_migr {
- atomic_t from;
- int to;
- };
- /* stats for Read and write operation.
- * see Documentation/ABI/testing/sysfs-class-rtrs-client for details
- */
- struct rtrs_clt_stats_rdma {
- struct {
- u64 cnt;
- u64 size_total;
- } dir[2];
- u64 failover_cnt;
- };
- struct rtrs_clt_stats_pcpu {
- struct rtrs_clt_stats_cpu_migr cpu_migr;
- struct rtrs_clt_stats_rdma rdma;
- };
- struct rtrs_clt_stats {
- struct kobject kobj_stats;
- struct rtrs_clt_stats_pcpu __percpu *pcpu_stats;
- struct rtrs_clt_stats_reconnects reconnects;
- atomic_t inflight;
- };
- struct rtrs_clt_con {
- struct rtrs_con c;
- struct rtrs_iu *rsp_ius;
- u32 queue_num;
- unsigned int cpu;
- struct mutex con_mutex;
- int cm_err;
- };
- /**
- * rtrs_permit - permits the memory allocation for future RDMA operation.
- * Combine with irq pinning to keep IO on same CPU.
- */
- struct rtrs_permit {
- enum rtrs_clt_con_type con_type;
- unsigned int cpu_id;
- unsigned int mem_id;
- unsigned int mem_off;
- };
- /**
- * rtrs_clt_io_req - describes one inflight IO request
- */
- struct rtrs_clt_io_req {
- struct list_head list;
- struct rtrs_iu *iu;
- struct scatterlist *sglist; /* list holding user data */
- unsigned int sg_cnt;
- unsigned int sg_size;
- unsigned int data_len;
- unsigned int usr_len;
- void *priv;
- bool in_use;
- enum rtrs_mp_policy mp_policy;
- struct rtrs_clt_con *con;
- struct rtrs_sg_desc *desc;
- struct ib_sge *sge;
- struct rtrs_permit *permit;
- enum dma_data_direction dir;
- void (*conf)(void *priv, int errno);
- unsigned long start_jiffies;
- struct ib_mr *mr;
- struct ib_cqe inv_cqe;
- struct completion inv_comp;
- int inv_errno;
- bool need_inv_comp;
- bool need_inv;
- refcount_t ref;
- };
- struct rtrs_rbuf {
- u64 addr;
- u32 rkey;
- };
- struct rtrs_clt_path {
- struct rtrs_path s;
- struct rtrs_clt_sess *clt;
- wait_queue_head_t state_wq;
- enum rtrs_clt_state state;
- atomic_t connected_cnt;
- struct mutex init_mutex;
- struct rtrs_clt_io_req *reqs;
- struct delayed_work reconnect_dwork;
- struct work_struct close_work;
- struct work_struct err_recovery_work;
- unsigned int reconnect_attempts;
- bool established;
- struct rtrs_rbuf *rbufs;
- size_t max_io_size;
- u32 max_hdr_size;
- u32 chunk_size;
- size_t queue_depth;
- u32 max_pages_per_mr;
- u32 flags;
- struct kobject kobj;
- u8 for_new_clt;
- struct rtrs_clt_stats *stats;
- /* cache hca_port and hca_name to display in sysfs */
- u8 hca_port;
- char hca_name[IB_DEVICE_NAME_MAX];
- struct list_head __percpu
- *mp_skip_entry;
- };
- struct rtrs_clt_sess {
- struct list_head paths_list; /* rcu protected list */
- size_t paths_num;
- struct rtrs_clt_path
- __rcu * __percpu *pcpu_path;
- uuid_t paths_uuid;
- int paths_up;
- struct mutex paths_mutex;
- struct mutex paths_ev_mutex;
- char sessname[NAME_MAX];
- u16 port;
- unsigned int max_reconnect_attempts;
- unsigned int reconnect_delay_sec;
- unsigned int max_segments;
- void *permits;
- unsigned long *permits_map;
- size_t queue_depth;
- size_t max_io_size;
- wait_queue_head_t permits_wait;
- size_t pdu_sz;
- void *priv;
- void (*link_ev)(void *priv,
- enum rtrs_clt_link_ev ev);
- struct device dev;
- struct kobject *kobj_paths;
- enum rtrs_mp_policy mp_policy;
- };
- static inline struct rtrs_clt_con *to_clt_con(struct rtrs_con *c)
- {
- return container_of(c, struct rtrs_clt_con, c);
- }
- static inline struct rtrs_clt_path *to_clt_path(struct rtrs_path *s)
- {
- return container_of(s, struct rtrs_clt_path, s);
- }
- static inline int permit_size(struct rtrs_clt_sess *clt)
- {
- return sizeof(struct rtrs_permit) + clt->pdu_sz;
- }
- static inline struct rtrs_permit *get_permit(struct rtrs_clt_sess *clt,
- int idx)
- {
- return (struct rtrs_permit *)(clt->permits + permit_size(clt) * idx);
- }
- int rtrs_clt_reconnect_from_sysfs(struct rtrs_clt_path *path);
- void rtrs_clt_close_conns(struct rtrs_clt_path *clt_path, bool wait);
- int rtrs_clt_create_path_from_sysfs(struct rtrs_clt_sess *clt,
- struct rtrs_addr *addr);
- int rtrs_clt_remove_path_from_sysfs(struct rtrs_clt_path *path,
- const struct attribute *sysfs_self);
- void rtrs_clt_set_max_reconnect_attempts(struct rtrs_clt_sess *clt, int value);
- int rtrs_clt_get_max_reconnect_attempts(const struct rtrs_clt_sess *clt);
- void free_path(struct rtrs_clt_path *clt_path);
- /* rtrs-clt-stats.c */
- int rtrs_clt_init_stats(struct rtrs_clt_stats *stats);
- void rtrs_clt_inc_failover_cnt(struct rtrs_clt_stats *s);
- void rtrs_clt_update_wc_stats(struct rtrs_clt_con *con);
- void rtrs_clt_update_all_stats(struct rtrs_clt_io_req *req, int dir);
- int rtrs_clt_reset_rdma_lat_distr_stats(struct rtrs_clt_stats *stats,
- bool enable);
- ssize_t rtrs_clt_stats_rdma_lat_distr_to_str(struct rtrs_clt_stats *stats,
- char *page);
- int rtrs_clt_reset_cpu_migr_stats(struct rtrs_clt_stats *stats, bool enable);
- int rtrs_clt_stats_migration_from_cnt_to_str(struct rtrs_clt_stats *stats, char *buf);
- int rtrs_clt_stats_migration_to_cnt_to_str(struct rtrs_clt_stats *stats, char *buf);
- int rtrs_clt_reset_reconnects_stat(struct rtrs_clt_stats *stats, bool enable);
- int rtrs_clt_stats_reconnects_to_str(struct rtrs_clt_stats *stats, char *buf);
- int rtrs_clt_reset_rdma_stats(struct rtrs_clt_stats *stats, bool enable);
- ssize_t rtrs_clt_stats_rdma_to_str(struct rtrs_clt_stats *stats,
- char *page);
- int rtrs_clt_reset_all_stats(struct rtrs_clt_stats *stats, bool enable);
- ssize_t rtrs_clt_reset_all_help(struct rtrs_clt_stats *stats,
- char *page);
- /* rtrs-clt-sysfs.c */
- int rtrs_clt_create_sysfs_root_files(struct rtrs_clt_sess *clt);
- void rtrs_clt_destroy_sysfs_root(struct rtrs_clt_sess *clt);
- int rtrs_clt_create_path_files(struct rtrs_clt_path *clt_path);
- void rtrs_clt_destroy_path_files(struct rtrs_clt_path *clt_path,
- const struct attribute *sysfs_self);
- #endif /* RTRS_CLT_H */
|