xref: /linux/fs/smb/server/transport_rdma.c (revision 8ab992f815d6736b5c7a6f5fd7bfe7bc106bb3dc)
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  *   Copyright (C) 2017, Microsoft Corporation.
4  *   Copyright (C) 2018, LG Electronics.
5  *
6  *   Author(s): Long Li <longli@microsoft.com>,
7  *		Hyunchul Lee <hyc.lee@gmail.com>
8  */
9 
10 #define SUBMOD_NAME	"smb_direct"
11 
12 #include <linux/kthread.h>
13 #include <linux/list.h>
14 #include <linux/string_choices.h>
15 
16 #include "glob.h"
17 #include "connection.h"
18 #include "smb_common.h"
19 #include "../common/smb2status.h"
20 #include "transport_rdma.h"
21 
22 
23 #define SMB_DIRECT_PORT_IWARP		5445
24 #define SMB_DIRECT_PORT_INFINIBAND	445
25 
26 /* SMB_DIRECT negotiation timeout (for the server) in seconds */
27 #define SMB_DIRECT_NEGOTIATE_TIMEOUT		5
28 
29 /* The timeout to wait for a keepalive message from peer in seconds */
30 #define SMB_DIRECT_KEEPALIVE_SEND_INTERVAL	120
31 
32 /* The timeout to wait for a keepalive message from peer in seconds */
33 #define SMB_DIRECT_KEEPALIVE_RECV_TIMEOUT	5
34 
35 /*
36  * Default maximum number of RDMA read/write outstanding on this connection
37  * This value is possibly decreased during QP creation on hardware limit
38  */
39 #define SMB_DIRECT_CM_INITIATOR_DEPTH		8
40 
41 /*
42  * User configurable initial values per SMB_DIRECT transport connection
43  * as defined in [MS-SMBD] 3.1.1.1
44  * Those may change after a SMB_DIRECT negotiation
45  */
46 
47 /* The local peer's maximum number of credits to grant to the peer */
48 static int smb_direct_receive_credit_max = 255;
49 
50 /* The remote peer's credit request of local peer */
51 static int smb_direct_send_credit_target = 255;
52 
53 /* The maximum single message size can be sent to remote peer */
54 static int smb_direct_max_send_size = 1364;
55 
56 /*
57  * The maximum fragmented upper-layer payload receive size supported
58  *
59  * Assume max_payload_per_credit is
60  * smb_direct_receive_credit_max - 24 = 1340
61  *
62  * The maximum number would be
63  * smb_direct_receive_credit_max * max_payload_per_credit
64  *
65  *                       1340 * 255 = 341700 (0x536C4)
66  *
67  * The minimum value from the spec is 131072 (0x20000)
68  *
69  * For now we use the logic we used before:
70  *                 (1364 * 255) / 2 = 173910 (0x2A756)
71  */
72 static int smb_direct_max_fragmented_recv_size = (1364 * 255) / 2;
73 
74 /*  The maximum single-message size which can be received */
75 static int smb_direct_max_receive_size = 1364;
76 
77 static int smb_direct_max_read_write_size = SMBD_DEFAULT_IOSIZE;
78 
79 static struct smb_direct_listener {
80 	int			port;
81 
82 	struct task_struct	*thread;
83 
84 	struct smbdirect_socket *socket;
85 } smb_direct_ib_listener, smb_direct_iw_listener;
86 
87 struct smb_direct_transport {
88 	struct ksmbd_transport	transport;
89 
90 	struct smbdirect_socket *socket;
91 };
92 
smb_direct_logging_needed(struct smbdirect_socket * sc,void * private_ptr,unsigned int lvl,unsigned int cls)93 static bool smb_direct_logging_needed(struct smbdirect_socket *sc,
94 				      void *private_ptr,
95 				      unsigned int lvl,
96 				      unsigned int cls)
97 {
98 	if (lvl <= SMBDIRECT_LOG_ERR)
99 		return true;
100 
101 	if (lvl > SMBDIRECT_LOG_INFO)
102 		return false;
103 
104 	switch (cls) {
105 	/*
106 	 * These were more or less also logged before
107 	 * the move to common code.
108 	 *
109 	 * SMBDIRECT_LOG_RDMA_MR was not used, but
110 	 * that's client only code and we should
111 	 * notice if it's used on the server...
112 	 */
113 	case SMBDIRECT_LOG_RDMA_EVENT:
114 	case SMBDIRECT_LOG_RDMA_SEND:
115 	case SMBDIRECT_LOG_RDMA_RECV:
116 	case SMBDIRECT_LOG_WRITE:
117 	case SMBDIRECT_LOG_READ:
118 	case SMBDIRECT_LOG_NEGOTIATE:
119 	case SMBDIRECT_LOG_OUTGOING:
120 	case SMBDIRECT_LOG_RDMA_RW:
121 	case SMBDIRECT_LOG_RDMA_MR:
122 		return true;
123 	/*
124 	 * These were not logged before the move
125 	 * to common code.
126 	 */
127 	case SMBDIRECT_LOG_KEEP_ALIVE:
128 	case SMBDIRECT_LOG_INCOMING:
129 		return false;
130 	}
131 
132 	/*
133 	 * Log all unknown messages
134 	 */
135 	return true;
136 }
137 
smb_direct_logging_vaprintf(struct smbdirect_socket * sc,const char * func,unsigned int line,void * private_ptr,unsigned int lvl,unsigned int cls,struct va_format * vaf)138 static void smb_direct_logging_vaprintf(struct smbdirect_socket *sc,
139 					const char *func,
140 					unsigned int line,
141 					void *private_ptr,
142 					unsigned int lvl,
143 					unsigned int cls,
144 					struct va_format *vaf)
145 {
146 	if (lvl <= SMBDIRECT_LOG_ERR)
147 		pr_err("%pV", vaf);
148 	else
149 		ksmbd_debug(RDMA, "%pV", vaf);
150 }
151 
152 #define KSMBD_TRANS(t) (&(t)->transport)
153 #define SMBD_TRANS(t)	(container_of(t, \
154 				struct smb_direct_transport, transport))
155 
156 static const struct ksmbd_transport_ops ksmbd_smb_direct_transport_ops;
157 
init_smbd_max_io_size(unsigned int sz)158 void init_smbd_max_io_size(unsigned int sz)
159 {
160 	sz = clamp_val(sz, SMBD_MIN_IOSIZE, SMBD_MAX_IOSIZE);
161 	smb_direct_max_read_write_size = sz;
162 }
163 
get_smbd_max_read_write_size(struct ksmbd_transport * kt)164 unsigned int get_smbd_max_read_write_size(struct ksmbd_transport *kt)
165 {
166 	struct smb_direct_transport *t;
167 	const struct smbdirect_socket_parameters *sp;
168 
169 	if (kt->ops != &ksmbd_smb_direct_transport_ops)
170 		return 0;
171 
172 	t = SMBD_TRANS(kt);
173 	sp = smbdirect_socket_get_current_parameters(t->socket);
174 
175 	return sp->max_read_write_size;
176 }
177 
alloc_transport(struct smbdirect_socket * sc)178 static struct smb_direct_transport *alloc_transport(struct smbdirect_socket *sc)
179 {
180 	struct smb_direct_transport *t;
181 	struct ksmbd_conn *conn;
182 
183 	t = kzalloc_obj(*t, KSMBD_DEFAULT_GFP);
184 	if (!t)
185 		return NULL;
186 	t->socket = sc;
187 
188 	conn = ksmbd_conn_alloc();
189 	if (!conn)
190 		goto conn_alloc_failed;
191 
192 	down_write(&conn_list_lock);
193 	hash_add(conn_list, &conn->hlist, 0);
194 	up_write(&conn_list_lock);
195 
196 	conn->transport = KSMBD_TRANS(t);
197 	KSMBD_TRANS(t)->conn = conn;
198 	KSMBD_TRANS(t)->ops = &ksmbd_smb_direct_transport_ops;
199 
200 	return t;
201 
202 conn_alloc_failed:
203 	kfree(t);
204 	return NULL;
205 }
206 
smb_direct_free_transport(struct ksmbd_transport * kt)207 static void smb_direct_free_transport(struct ksmbd_transport *kt)
208 {
209 	struct smb_direct_transport *t = SMBD_TRANS(kt);
210 
211 	smbdirect_socket_release(t->socket);
212 	kfree(t);
213 }
214 
free_transport(struct smb_direct_transport * t)215 static void free_transport(struct smb_direct_transport *t)
216 {
217 	smbdirect_socket_shutdown(t->socket);
218 	ksmbd_conn_free(KSMBD_TRANS(t)->conn);
219 }
220 
smb_direct_read(struct ksmbd_transport * t,char * buf,unsigned int size,int unused)221 static int smb_direct_read(struct ksmbd_transport *t, char *buf,
222 			   unsigned int size, int unused)
223 {
224 	struct smb_direct_transport *st = SMBD_TRANS(t);
225 	struct smbdirect_socket *sc = st->socket;
226 	struct msghdr msg = { .msg_flags = 0, };
227 	struct kvec iov = {
228 		.iov_base = buf,
229 		.iov_len = size,
230 	};
231 	int ret;
232 
233 	iov_iter_kvec(&msg.msg_iter, ITER_DEST, &iov, 1, size);
234 
235 	ret = smbdirect_connection_recvmsg(sc, &msg, 0);
236 	if (ret == -ERESTARTSYS)
237 		ret = -EINTR;
238 	return ret;
239 }
240 
smb_direct_writev(struct ksmbd_transport * t,struct kvec * iov,int niovs,int buflen,bool need_invalidate,unsigned int remote_key)241 static int smb_direct_writev(struct ksmbd_transport *t,
242 			     struct kvec *iov, int niovs, int buflen,
243 			     bool need_invalidate, unsigned int remote_key)
244 {
245 	struct smb_direct_transport *st = SMBD_TRANS(t);
246 	struct smbdirect_socket *sc = st->socket;
247 	struct iov_iter iter;
248 
249 	iov_iter_kvec(&iter, ITER_SOURCE, iov, niovs, buflen);
250 
251 	return smbdirect_connection_send_iter(sc, &iter, 0,
252 					      need_invalidate, remote_key);
253 }
254 
smb_direct_rdma_write(struct ksmbd_transport * t,void * buf,unsigned int buflen,struct smbdirect_buffer_descriptor_v1 * desc,unsigned int desc_len)255 static int smb_direct_rdma_write(struct ksmbd_transport *t,
256 				 void *buf, unsigned int buflen,
257 				 struct smbdirect_buffer_descriptor_v1 *desc,
258 				 unsigned int desc_len)
259 {
260 	struct smb_direct_transport *st = SMBD_TRANS(t);
261 	struct smbdirect_socket *sc = st->socket;
262 
263 	return smbdirect_connection_rdma_xmit(sc, buf, buflen,
264 					      desc, desc_len, false);
265 }
266 
smb_direct_rdma_read(struct ksmbd_transport * t,void * buf,unsigned int buflen,struct smbdirect_buffer_descriptor_v1 * desc,unsigned int desc_len)267 static int smb_direct_rdma_read(struct ksmbd_transport *t,
268 				void *buf, unsigned int buflen,
269 				struct smbdirect_buffer_descriptor_v1 *desc,
270 				unsigned int desc_len)
271 {
272 	struct smb_direct_transport *st = SMBD_TRANS(t);
273 	struct smbdirect_socket *sc = st->socket;
274 
275 	return smbdirect_connection_rdma_xmit(sc, buf, buflen,
276 					      desc, desc_len, true);
277 }
278 
smb_direct_disconnect(struct ksmbd_transport * t)279 static void smb_direct_disconnect(struct ksmbd_transport *t)
280 {
281 	struct smb_direct_transport *st = SMBD_TRANS(t);
282 	struct smbdirect_socket *sc = st->socket;
283 
284 	ksmbd_debug(RDMA, "Disconnecting sc=%p\n", sc);
285 
286 	free_transport(st);
287 }
288 
smb_direct_shutdown(struct ksmbd_transport * t)289 static void smb_direct_shutdown(struct ksmbd_transport *t)
290 {
291 	struct smb_direct_transport *st = SMBD_TRANS(t);
292 	struct smbdirect_socket *sc = st->socket;
293 
294 	ksmbd_debug(RDMA, "smb-direct shutdown sc=%p\n", sc);
295 
296 	smbdirect_socket_shutdown(sc);
297 }
298 
smb_direct_new_connection(struct smb_direct_listener * listener,struct smbdirect_socket * client_sc)299 static int smb_direct_new_connection(struct smb_direct_listener *listener,
300 				     struct smbdirect_socket *client_sc)
301 {
302 	struct smb_direct_transport *t;
303 	struct task_struct *handler;
304 	int ret;
305 
306 	t = alloc_transport(client_sc);
307 	if (!t) {
308 		smbdirect_socket_release(client_sc);
309 		return -ENOMEM;
310 	}
311 
312 	handler = kthread_run(ksmbd_conn_handler_loop,
313 			      KSMBD_TRANS(t)->conn, "ksmbd:r%u",
314 			      listener->port);
315 	if (IS_ERR(handler)) {
316 		ret = PTR_ERR(handler);
317 		pr_err("Can't start thread\n");
318 		goto out_err;
319 	}
320 
321 	return 0;
322 out_err:
323 	free_transport(t);
324 	return ret;
325 }
326 
smb_direct_listener_kthread_fn(void * p)327 static int smb_direct_listener_kthread_fn(void *p)
328 {
329 	struct smb_direct_listener *listener = (struct smb_direct_listener *)p;
330 	struct smbdirect_socket *client_sc = NULL;
331 
332 	while (!kthread_should_stop()) {
333 		struct proto_accept_arg arg = { .err = -EINVAL, };
334 		long timeo = MAX_SCHEDULE_TIMEOUT;
335 
336 		if (!listener->socket)
337 			break;
338 		client_sc = smbdirect_socket_accept(listener->socket, timeo, &arg);
339 		if (!client_sc && arg.err == -EINVAL)
340 			break;
341 		if (!client_sc)
342 			continue;
343 
344 		ksmbd_debug(CONN, "connect success: accepted new connection\n");
345 		smb_direct_new_connection(listener, client_sc);
346 	}
347 
348 	ksmbd_debug(CONN, "releasing socket\n");
349 	return 0;
350 }
351 
smb_direct_listener_destroy(struct smb_direct_listener * listener)352 static void smb_direct_listener_destroy(struct smb_direct_listener *listener)
353 {
354 	int ret;
355 
356 	if (listener->socket)
357 		smbdirect_socket_shutdown(listener->socket);
358 
359 	if (listener->thread) {
360 		ret = kthread_stop(listener->thread);
361 		if (ret)
362 			pr_err("failed to stop forker thread\n");
363 		listener->thread = NULL;
364 	}
365 
366 	if (listener->socket) {
367 		smbdirect_socket_release(listener->socket);
368 		listener->socket = NULL;
369 	}
370 
371 	listener->port = 0;
372 }
373 
smb_direct_listen(struct smb_direct_listener * listener,int port)374 static int smb_direct_listen(struct smb_direct_listener *listener,
375 			     int port)
376 {
377 	struct net *net = current->nsproxy->net_ns;
378 	struct task_struct *kthread;
379 	struct sockaddr_in sin = {
380 		.sin_family		= AF_INET,
381 		.sin_addr.s_addr	= htonl(INADDR_ANY),
382 		.sin_port		= htons(port),
383 	};
384 	struct smbdirect_socket_parameters init_params = {};
385 	struct smbdirect_socket_parameters *sp;
386 	struct smbdirect_socket *sc;
387 	u64 port_flags = 0;
388 	int ret;
389 
390 	switch (port) {
391 	case SMB_DIRECT_PORT_IWARP:
392 		/*
393 		 * only allow iWarp devices
394 		 * for port 5445.
395 		 */
396 		port_flags |= SMBDIRECT_FLAG_PORT_RANGE_ONLY_IW;
397 		break;
398 	case SMB_DIRECT_PORT_INFINIBAND:
399 		/*
400 		 * only allow InfiniBand, RoCEv1 or RoCEv2
401 		 * devices for port 445.
402 		 *
403 		 * (Basically don't allow iWarp devices)
404 		 */
405 		port_flags |= SMBDIRECT_FLAG_PORT_RANGE_ONLY_IB;
406 		break;
407 	default:
408 		pr_err("unsupported smbdirect port=%d!\n", port);
409 		return -ENODEV;
410 	}
411 
412 	ret = smbdirect_socket_create_kern(net, &sc);
413 	if (ret) {
414 		pr_err("smbdirect_socket_create_kern() failed: %d %1pe\n",
415 		       ret, ERR_PTR(ret));
416 		return ret;
417 	}
418 
419 	/*
420 	 * Create the initial parameters
421 	 */
422 	sp = &init_params;
423 	sp->flags |= port_flags;
424 	sp->negotiate_timeout_msec = SMB_DIRECT_NEGOTIATE_TIMEOUT * 1000;
425 	sp->initiator_depth = SMB_DIRECT_CM_INITIATOR_DEPTH;
426 	sp->responder_resources = 1;
427 	sp->recv_credit_max = smb_direct_receive_credit_max;
428 	sp->send_credit_target = smb_direct_send_credit_target;
429 	sp->max_send_size = smb_direct_max_send_size;
430 	sp->max_fragmented_recv_size = smb_direct_max_fragmented_recv_size;
431 	sp->max_recv_size = smb_direct_max_receive_size;
432 	sp->max_read_write_size = smb_direct_max_read_write_size;
433 	sp->keepalive_interval_msec = SMB_DIRECT_KEEPALIVE_SEND_INTERVAL * 1000;
434 	sp->keepalive_timeout_msec = SMB_DIRECT_KEEPALIVE_RECV_TIMEOUT * 1000;
435 
436 	smbdirect_socket_set_logging(sc, NULL,
437 				     smb_direct_logging_needed,
438 				     smb_direct_logging_vaprintf);
439 	ret = smbdirect_socket_set_initial_parameters(sc, sp);
440 	if (ret) {
441 		pr_err("Failed smbdirect_socket_set_initial_parameters(): %d %1pe\n",
442 		       ret, ERR_PTR(ret));
443 		goto err;
444 	}
445 	ret = smbdirect_socket_set_kernel_settings(sc, IB_POLL_WORKQUEUE, KSMBD_DEFAULT_GFP);
446 	if (ret) {
447 		pr_err("Failed smbdirect_socket_set_kernel_settings(): %d %1pe\n",
448 		       ret, ERR_PTR(ret));
449 		goto err;
450 	}
451 
452 	ret = smbdirect_socket_bind(sc, (struct sockaddr *)&sin);
453 	if (ret) {
454 		pr_err("smbdirect_socket_bind() failed: %d %1pe\n",
455 		       ret, ERR_PTR(ret));
456 		goto err;
457 	}
458 
459 	ret = smbdirect_socket_listen(sc, 10);
460 	if (ret) {
461 		pr_err("Port[%d] smbdirect_socket_listen() failed: %d %1pe\n",
462 		       port, ret, ERR_PTR(ret));
463 		goto err;
464 	}
465 
466 	listener->port = port;
467 	listener->socket = sc;
468 
469 	kthread = kthread_run(smb_direct_listener_kthread_fn,
470 			      listener,
471 			      "ksmbd-smbdirect-listener-%u", port);
472 	if (IS_ERR(kthread)) {
473 		ret = PTR_ERR(kthread);
474 		pr_err("Can't start ksmbd listen kthread: %d %1pe\n",
475 		       ret, ERR_PTR(ret));
476 		goto err;
477 	}
478 
479 	listener->thread = kthread;
480 	return 0;
481 err:
482 	smb_direct_listener_destroy(listener);
483 	return ret;
484 }
485 
ksmbd_rdma_init(void)486 int ksmbd_rdma_init(void)
487 {
488 	int ret;
489 
490 	smb_direct_ib_listener = smb_direct_iw_listener = (struct smb_direct_listener) {
491 		.socket = NULL,
492 	};
493 
494 	ret = smb_direct_listen(&smb_direct_ib_listener,
495 				SMB_DIRECT_PORT_INFINIBAND);
496 	if (ret) {
497 		pr_err("Can't listen on InfiniBand/RoCEv1/RoCEv2: %d\n", ret);
498 		goto err;
499 	}
500 
501 	ksmbd_debug(RDMA, "InfiniBand/RoCEv1/RoCEv2 RDMA listener. socket=%p\n",
502 		    smb_direct_ib_listener.socket);
503 
504 	ret = smb_direct_listen(&smb_direct_iw_listener,
505 				SMB_DIRECT_PORT_IWARP);
506 	if (ret) {
507 		pr_err("Can't listen on iWarp: %d\n", ret);
508 		goto err;
509 	}
510 
511 	ksmbd_debug(RDMA, "iWarp RDMA listener. socket=%p\n",
512 		    smb_direct_iw_listener.socket);
513 
514 	return 0;
515 err:
516 	ksmbd_rdma_stop_listening();
517 	return ret;
518 }
519 
ksmbd_rdma_stop_listening(void)520 void ksmbd_rdma_stop_listening(void)
521 {
522 	smb_direct_listener_destroy(&smb_direct_ib_listener);
523 	smb_direct_listener_destroy(&smb_direct_iw_listener);
524 }
525 
ksmbd_rdma_capable_netdev(struct net_device * netdev)526 bool ksmbd_rdma_capable_netdev(struct net_device *netdev)
527 {
528 	u8 node_type = smbdirect_netdev_rdma_capable_node_type(netdev);
529 
530 	return node_type != RDMA_NODE_UNSPECIFIED;
531 }
532 
533 static const struct ksmbd_transport_ops ksmbd_smb_direct_transport_ops = {
534 	.disconnect	= smb_direct_disconnect,
535 	.shutdown	= smb_direct_shutdown,
536 	.writev		= smb_direct_writev,
537 	.read		= smb_direct_read,
538 	.rdma_read	= smb_direct_rdma_read,
539 	.rdma_write	= smb_direct_rdma_write,
540 	.free_transport = smb_direct_free_transport,
541 };
542 
543 MODULE_IMPORT_NS("SMBDIRECT");
544