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