| /* 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__ */ |