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