1 /* SPDX-License-Identifier: GPL-2.0-or-later */ 2 /* 3 * RDMA Network Block Driver 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 10 #ifndef RNBD_CLT_H 11 #define RNBD_CLT_H 12 13 #include <linux/wait.h> 14 #include <linux/in.h> 15 #include <linux/inet.h> 16 #include <linux/blk-mq.h> 17 #include <linux/refcount.h> 18 19 #include <rtrs.h> 20 #include "rnbd-proto.h" 21 #include "rnbd-log.h" 22 23 /* time in seconds between reconnect tries, default to 30 s */ 24 #define RECONNECT_DELAY 30 25 /* 26 * Number of times to reconnect on error before giving up, 0 for * disabled, 27 * -1 for forever 28 */ 29 #define MAX_RECONNECTS -1 30 31 enum rnbd_clt_dev_state { 32 DEV_STATE_INIT, 33 DEV_STATE_MAPPED, 34 DEV_STATE_MAPPED_DISCONNECTED, 35 DEV_STATE_UNMAPPED, 36 }; 37 38 struct rnbd_iu_comp { 39 wait_queue_head_t wait; 40 int errno; 41 }; 42 43 #ifdef CONFIG_ARCH_NO_SG_CHAIN 44 #define RNBD_INLINE_SG_CNT 0 45 #else 46 #define RNBD_INLINE_SG_CNT 2 47 #endif 48 #define RNBD_RDMA_SGL_SIZE (sizeof(struct scatterlist) * RNBD_INLINE_SG_CNT) 49 50 struct rnbd_iu { 51 union { 52 struct request *rq; /* for block io */ 53 void *buf; /* for user messages */ 54 }; 55 struct rtrs_permit *permit; 56 union { 57 /* use to send msg associated with a dev */ 58 struct rnbd_clt_dev *dev; 59 /* use to send msg associated with a sess */ 60 struct rnbd_clt_session *sess; 61 }; 62 struct sg_table sgt; 63 struct work_struct work; 64 int errno; 65 struct rnbd_iu_comp comp; 66 atomic_t refcount; 67 struct scatterlist first_sgl[]; /* must be the last one */ 68 }; 69 70 struct rnbd_cpu_qlist { 71 struct list_head requeue_list; 72 spinlock_t requeue_lock; 73 unsigned int cpu; 74 }; 75 76 struct rnbd_clt_session { 77 struct list_head list; 78 struct rtrs_clt_sess *rtrs; 79 wait_queue_head_t rtrs_waitq; 80 bool rtrs_ready; 81 struct rnbd_cpu_qlist __percpu 82 *cpu_queues; 83 DECLARE_BITMAP(cpu_queues_bm, NR_CPUS); 84 int __percpu *cpu_rr; /* per-cpu var for CPU round-robin */ 85 atomic_t busy; 86 size_t queue_depth; 87 u32 max_io_size; 88 u32 max_segments; 89 struct blk_mq_tag_set tag_set; 90 u32 nr_poll_queues; 91 struct mutex lock; /* protects state and devs_list */ 92 struct list_head devs_list; /* list of struct rnbd_clt_dev */ 93 refcount_t refcount; 94 char sessname[NAME_MAX]; 95 u8 ver; /* protocol version */ 96 }; 97 98 /** 99 * Submission queues. 100 */ 101 struct rnbd_queue { 102 struct list_head requeue_list; 103 unsigned long in_list; 104 struct rnbd_clt_dev *dev; 105 struct blk_mq_hw_ctx *hctx; 106 }; 107 108 struct rnbd_clt_dev { 109 struct kobject kobj; 110 struct rnbd_clt_session *sess; 111 struct request_queue *queue; 112 struct rnbd_queue *hw_queues; 113 u32 device_id; 114 /* local Idr index - used to track minor number allocations. */ 115 u32 clt_device_id; 116 struct mutex lock; 117 enum rnbd_clt_dev_state dev_state; 118 refcount_t refcount; 119 char *pathname; 120 enum rnbd_access_mode access_mode; 121 u32 nr_poll_queues; 122 u64 size; /* device size in bytes */ 123 struct list_head list; 124 struct gendisk *gd; 125 char *blk_symlink_name; 126 struct work_struct unmap_on_rmmod_work; 127 }; 128 129 /* rnbd-clt.c */ 130 131 struct rnbd_clt_dev *rnbd_clt_map_device(const char *sessname, 132 struct rtrs_addr *paths, 133 size_t path_cnt, u16 port_nr, 134 const char *pathname, 135 enum rnbd_access_mode access_mode, 136 u32 nr_poll_queues); 137 int rnbd_clt_unmap_device(struct rnbd_clt_dev *dev, bool force, 138 const struct attribute *sysfs_self); 139 140 int rnbd_clt_remap_device(struct rnbd_clt_dev *dev); 141 int rnbd_clt_resize_disk(struct rnbd_clt_dev *dev, sector_t newsize); 142 143 /* rnbd-clt-sysfs.c */ 144 145 int rnbd_clt_create_sysfs_files(void); 146 147 void rnbd_clt_destroy_sysfs_files(void); 148 149 void rnbd_clt_remove_dev_symlink(struct rnbd_clt_dev *dev); 150 151 #endif /* RNBD_CLT_H */ 152