Merge tag 'block-5.11-2020-12-23' of git://git.kernel.dk/linux-block
[linux-2.6-microblaze.git] / drivers / block / rnbd / rnbd-clt.h
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 /* Max. number of segments per IO request, Mellanox Connect X ~ Connect X5,
24  * choose minimial 30 for all, minus 1 for internal protocol, so 29.
25  */
26 #define BMAX_SEGMENTS 29
27 /*  time in seconds between reconnect tries, default to 30 s */
28 #define RECONNECT_DELAY 30
29 /*
30  * Number of times to reconnect on error before giving up, 0 for * disabled,
31  * -1 for forever
32  */
33 #define MAX_RECONNECTS -1
34
35 enum rnbd_clt_dev_state {
36         DEV_STATE_INIT,
37         DEV_STATE_MAPPED,
38         DEV_STATE_MAPPED_DISCONNECTED,
39         DEV_STATE_UNMAPPED,
40 };
41
42 struct rnbd_iu_comp {
43         wait_queue_head_t wait;
44         int errno;
45 };
46
47 #ifdef CONFIG_ARCH_NO_SG_CHAIN
48 #define RNBD_INLINE_SG_CNT 0
49 #else
50 #define RNBD_INLINE_SG_CNT 2
51 #endif
52 #define RNBD_RDMA_SGL_SIZE (sizeof(struct scatterlist) * RNBD_INLINE_SG_CNT)
53
54 struct rnbd_iu {
55         union {
56                 struct request *rq; /* for block io */
57                 void *buf; /* for user messages */
58         };
59         struct rtrs_permit      *permit;
60         union {
61                 /* use to send msg associated with a dev */
62                 struct rnbd_clt_dev *dev;
63                 /* use to send msg associated with a sess */
64                 struct rnbd_clt_session *sess;
65         };
66         struct sg_table         sgt;
67         struct work_struct      work;
68         int                     errno;
69         struct rnbd_iu_comp     comp;
70         atomic_t                refcount;
71         struct scatterlist      first_sgl[]; /* must be the last one */
72 };
73
74 struct rnbd_cpu_qlist {
75         struct list_head        requeue_list;
76         spinlock_t              requeue_lock;
77         unsigned int            cpu;
78 };
79
80 struct rnbd_clt_session {
81         struct list_head        list;
82         struct rtrs_clt        *rtrs;
83         wait_queue_head_t       rtrs_waitq;
84         bool                    rtrs_ready;
85         struct rnbd_cpu_qlist   __percpu
86                                 *cpu_queues;
87         DECLARE_BITMAP(cpu_queues_bm, NR_CPUS);
88         int     __percpu        *cpu_rr; /* per-cpu var for CPU round-robin */
89         atomic_t                busy;
90         int                     queue_depth;
91         u32                     max_io_size;
92         struct blk_mq_tag_set   tag_set;
93         struct mutex            lock; /* protects state and devs_list */
94         struct list_head        devs_list; /* list of struct rnbd_clt_dev */
95         refcount_t              refcount;
96         char                    sessname[NAME_MAX];
97         u8                      ver; /* protocol version */
98 };
99
100 /**
101  * Submission queues.
102  */
103 struct rnbd_queue {
104         struct list_head        requeue_list;
105         unsigned long           in_list;
106         struct rnbd_clt_dev     *dev;
107         struct blk_mq_hw_ctx    *hctx;
108 };
109
110 struct rnbd_clt_dev {
111         struct rnbd_clt_session *sess;
112         struct request_queue    *queue;
113         struct rnbd_queue       *hw_queues;
114         u32                     device_id;
115         /* local Idr index - used to track minor number allocations. */
116         u32                     clt_device_id;
117         struct mutex            lock;
118         enum rnbd_clt_dev_state dev_state;
119         char                    *pathname;
120         enum rnbd_access_mode   access_mode;
121         bool                    read_only;
122         bool                    rotational;
123         bool                    wc;
124         bool                    fua;
125         u32                     max_hw_sectors;
126         u32                     max_write_same_sectors;
127         u32                     max_discard_sectors;
128         u32                     discard_granularity;
129         u32                     discard_alignment;
130         u16                     secure_discard;
131         u16                     physical_block_size;
132         u16                     logical_block_size;
133         u16                     max_segments;
134         size_t                  nsectors;
135         u64                     size;           /* device size in bytes */
136         struct list_head        list;
137         struct gendisk          *gd;
138         struct kobject          kobj;
139         char                    *blk_symlink_name;
140         refcount_t              refcount;
141         struct work_struct      unmap_on_rmmod_work;
142 };
143
144 /* rnbd-clt.c */
145
146 struct rnbd_clt_dev *rnbd_clt_map_device(const char *sessname,
147                                            struct rtrs_addr *paths,
148                                            size_t path_cnt, u16 port_nr,
149                                            const char *pathname,
150                                            enum rnbd_access_mode access_mode);
151 int rnbd_clt_unmap_device(struct rnbd_clt_dev *dev, bool force,
152                            const struct attribute *sysfs_self);
153
154 int rnbd_clt_remap_device(struct rnbd_clt_dev *dev);
155 int rnbd_clt_resize_disk(struct rnbd_clt_dev *dev, size_t newsize);
156
157 /* rnbd-clt-sysfs.c */
158
159 int rnbd_clt_create_sysfs_files(void);
160
161 void rnbd_clt_destroy_sysfs_files(void);
162 void rnbd_clt_destroy_default_group(void);
163
164 void rnbd_clt_remove_dev_symlink(struct rnbd_clt_dev *dev);
165
166 #endif /* RNBD_CLT_H */