xref: /linux/fs/smb/client/smbdirect.h (revision a9401710a5f5681abd2a6f21f9e76bc9f2e81891)
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /*
3  *   Copyright (C) 2017, Microsoft Corporation.
4  *
5  *   Author(s): Long Li <longli@microsoft.com>
6  */
7 #ifndef _SMBDIRECT_H
8 #define _SMBDIRECT_H
9 
10 #ifdef CONFIG_CIFS_SMB_DIRECT
11 #define cifs_rdma_enabled(server)	((server)->rdma)
12 
13 #include "cifsglob.h"
14 #include <rdma/ib_verbs.h>
15 #include <rdma/rdma_cm.h>
16 #include <linux/mempool.h>
17 
18 #include "../common/smbdirect/smbdirect.h"
19 #include "../common/smbdirect/smbdirect_socket.h"
20 
21 extern int rdma_readwrite_threshold;
22 extern int smbd_max_frmr_depth;
23 extern int smbd_keep_alive_interval;
24 extern int smbd_max_receive_size;
25 extern int smbd_max_fragmented_recv_size;
26 extern int smbd_max_send_size;
27 extern int smbd_send_credit_target;
28 extern int smbd_receive_credit_max;
29 
30 /*
31  * The context for the SMBDirect transport
32  * Everything related to the transport is here. It has several logical parts
33  * 1. RDMA related structures
34  * 2. SMBDirect connection parameters
35  * 3. Memory registrations
36  * 4. Receive and reassembly queues for data receive path
37  * 5. mempools for allocating packets
38  */
39 struct smbd_connection {
40 	struct smbdirect_socket socket;
41 };
42 
43 /* Create a SMBDirect session */
44 struct smbd_connection *smbd_get_connection(
45 	struct TCP_Server_Info *server, struct sockaddr *dstaddr);
46 
47 const struct smbdirect_socket_parameters *smbd_get_parameters(struct smbd_connection *conn);
48 
49 /* Reconnect SMBDirect session */
50 int smbd_reconnect(struct TCP_Server_Info *server);
51 /* Destroy SMBDirect session */
52 void smbd_destroy(struct TCP_Server_Info *server);
53 
54 /* Interface for carrying upper layer I/O through send/recv */
55 int smbd_recv(struct smbd_connection *info, struct msghdr *msg);
56 int smbd_send(struct TCP_Server_Info *server,
57 	int num_rqst, struct smb_rqst *rqst);
58 
59 /* Interfaces to register and deregister MR for RDMA read/write */
60 struct smbdirect_mr_io *smbd_register_mr(
61 	struct smbd_connection *info, struct iov_iter *iter,
62 	bool writing, bool need_invalidate);
63 int smbd_deregister_mr(struct smbdirect_mr_io *mr);
64 
65 #else
66 #define cifs_rdma_enabled(server)	0
67 struct smbd_connection {};
smbd_get_connection(struct TCP_Server_Info * server,struct sockaddr * dstaddr)68 static inline void *smbd_get_connection(
69 	struct TCP_Server_Info *server, struct sockaddr *dstaddr) {return NULL;}
smbd_reconnect(struct TCP_Server_Info * server)70 static inline int smbd_reconnect(struct TCP_Server_Info *server) {return -1; }
smbd_destroy(struct TCP_Server_Info * server)71 static inline void smbd_destroy(struct TCP_Server_Info *server) {}
smbd_recv(struct smbd_connection * info,struct msghdr * msg)72 static inline int smbd_recv(struct smbd_connection *info, struct msghdr *msg) {return -1; }
smbd_send(struct TCP_Server_Info * server,int num_rqst,struct smb_rqst * rqst)73 static inline int smbd_send(struct TCP_Server_Info *server, int num_rqst, struct smb_rqst *rqst) {return -1; }
74 #endif
75 
76 #endif
77