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