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 | |