1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
|
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
* Copyright (c) 2025, Stefan Metzmacher
*/
#ifndef __FS_SMB_COMMON_SMBDIRECT_INTERNAL_H__
#define __FS_SMB_COMMON_SMBDIRECT_INTERNAL_H__
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
#include "smbdirect.h"
#include "pdu.h"
#include "public.h"
#include <linux/mutex.h>
struct smbdirect_module_state {
struct mutex mutex;
struct {
struct workqueue_struct *accept;
struct workqueue_struct *connect;
struct workqueue_struct *idle;
struct workqueue_struct *refill;
struct workqueue_struct *immediate;
struct workqueue_struct *cleanup;
} workqueues;
struct {
rwlock_t lock;
struct list_head list;
} devices;
};
extern struct smbdirect_module_state smbdirect_globals;
#include "socket.h"
struct smbdirect_device {
struct list_head list;
struct ib_device *ib_dev;
/*
* copy of ib_dev->name,
* in order to print renames
*/
char ib_name[IB_DEVICE_NAME_MAX];
};
int smbdirect_socket_init_new(struct net *net, struct smbdirect_socket *sc);
int smbdirect_socket_init_accepting(struct rdma_cm_id *id, struct smbdirect_socket *sc);
void __smbdirect_socket_schedule_cleanup(struct smbdirect_socket *sc,
const char *macro_name,
unsigned int lvl,
const char *func,
unsigned int line,
int error,
enum smbdirect_socket_status *force_status);
#define smbdirect_socket_schedule_cleanup(__sc, __error) \
__smbdirect_socket_schedule_cleanup(__sc, \
"smbdirect_socket_schedule_cleanup", SMBDIRECT_LOG_ERR, \
__func__, __LINE__, __error, NULL)
#define smbdirect_socket_schedule_cleanup_lvl(__sc, __lvl, __error) \
__smbdirect_socket_schedule_cleanup(__sc, \
"smbdirect_socket_schedule_cleanup_lvl", __lvl, \
__func__, __LINE__, __error, NULL)
#define smbdirect_socket_schedule_cleanup_status(__sc, __lvl, __error, __status) do { \
enum smbdirect_socket_status __force_status = __status; \
__smbdirect_socket_schedule_cleanup(__sc, \
"smbdirect_socket_schedule_cleanup_status", __lvl, \
__func__, __LINE__, __error, &__force_status); \
} while (0)
void smbdirect_socket_destroy_sync(struct smbdirect_socket *sc);
int smbdirect_socket_wait_for_credits(struct smbdirect_socket *sc,
enum smbdirect_socket_status expected_status,
int unexpected_errno,
wait_queue_head_t *waitq,
atomic_t *total_credits,
int needed);
void smbdirect_connection_rdma_established(struct smbdirect_socket *sc);
void smbdirect_connection_negotiation_done(struct smbdirect_socket *sc);
int smbdirect_connection_create_qp(struct smbdirect_socket *sc);
void smbdirect_connection_destroy_qp(struct smbdirect_socket *sc);
int smbdirect_connection_create_mem_pools(struct smbdirect_socket *sc);
void smbdirect_connection_destroy_mem_pools(struct smbdirect_socket *sc);
struct smbdirect_send_io *smbdirect_connection_alloc_send_io(struct smbdirect_socket *sc);
void smbdirect_connection_free_send_io(struct smbdirect_send_io *msg);
struct smbdirect_recv_io *smbdirect_connection_get_recv_io(struct smbdirect_socket *sc);
void smbdirect_connection_put_recv_io(struct smbdirect_recv_io *msg);
void smbdirect_connection_reassembly_append_recv_io(struct smbdirect_socket *sc,
struct smbdirect_recv_io *msg,
u32 data_length);
struct smbdirect_recv_io *
smbdirect_connection_reassembly_first_recv_io(struct smbdirect_socket *sc);
void smbdirect_connection_negotiate_rdma_resources(struct smbdirect_socket *sc,
u8 peer_initiator_depth,
u8 peer_responder_resources,
const struct rdma_conn_param *param);
void smbdirect_connection_idle_timer_work(struct work_struct *work);
u16 smbdirect_connection_grant_recv_credits(struct smbdirect_socket *sc);
int smbdirect_connection_post_send_wr(struct smbdirect_socket *sc,
struct ib_send_wr *wr);
int smbdirect_connection_post_recv_io(struct smbdirect_recv_io *msg);
void smbdirect_connection_recv_io_done(struct ib_cq *cq, struct ib_wc *wc);
int smbdirect_connection_recv_io_refill(struct smbdirect_socket *sc);
int smbdirect_connection_create_mr_list(struct smbdirect_socket *sc);
void smbdirect_connection_destroy_mr_list(struct smbdirect_socket *sc);
int smbdirect_accept_connect_request(struct smbdirect_socket *sc,
const struct rdma_conn_param *param);
void smbdirect_accept_negotiate_finish(struct smbdirect_socket *sc, u32 ntstatus);
__init int smbdirect_devices_init(void);
__exit void smbdirect_devices_exit(void);
#endif /* __FS_SMB_COMMON_SMBDIRECT_INTERNAL_H__ */
|