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