Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/drivers/block/rnbd/rnbd-clt.h
26282 views
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
153