xref: /linux/fs/smb/smbdirect/socket.c (revision 83684c4e4d62cb02b2e4d0d18963d1035439278e)
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  *   Copyright (C) 2017, Microsoft Corporation.
4  *   Copyright (c) 2025, Stefan Metzmacher
5  */
6 
7 #include "internal.h"
8 
9 bool smbdirect_frwr_is_supported(const struct ib_device_attr *attrs)
10 {
11 	/*
12 	 * Test if FRWR (Fast Registration Work Requests) is supported on the
13 	 * device This implementation requires FRWR on RDMA read/write return
14 	 * value: true if it is supported
15 	 */
16 
17 	if (!(attrs->device_cap_flags & IB_DEVICE_MEM_MGT_EXTENSIONS))
18 		return false;
19 	if (attrs->max_fast_reg_page_list_len == 0)
20 		return false;
21 	return true;
22 }
23 EXPORT_SYMBOL_GPL(smbdirect_frwr_is_supported);
24 
25 static void smbdirect_socket_cleanup_work(struct work_struct *work);
26 
27 static int smbdirect_socket_rdma_event_handler(struct rdma_cm_id *id,
28 					       struct rdma_cm_event *event)
29 {
30 	struct smbdirect_socket *sc = id->context;
31 	int ret = -ESTALE;
32 
33 	/*
34 	 * This should be replaced before any real work
35 	 * starts! So it should never be called!
36 	 */
37 
38 	if (event->event == RDMA_CM_EVENT_DEVICE_REMOVAL)
39 		ret = -ENETDOWN;
40 	if (IS_ERR(SMBDIRECT_DEBUG_ERR_PTR(event->status)))
41 		ret = event->status;
42 	pr_err("%s (first_error=%1pe, expected=%s) => event=%s status=%d => ret=%1pe\n",
43 		smbdirect_socket_status_string(sc->status),
44 		SMBDIRECT_DEBUG_ERR_PTR(sc->first_error),
45 		rdma_event_msg(sc->rdma.expected_event),
46 		rdma_event_msg(event->event),
47 		event->status,
48 		SMBDIRECT_DEBUG_ERR_PTR(ret));
49 	WARN_ONCE(1, "%s should not be called!\n", __func__);
50 	sc->rdma.cm_id = NULL;
51 	return -ESTALE;
52 }
53 
54 int smbdirect_socket_init_new(struct net *net, struct smbdirect_socket *sc)
55 {
56 	struct rdma_cm_id *id;
57 	int ret;
58 
59 	smbdirect_socket_init(sc);
60 
61 	id = rdma_create_id(net,
62 			    smbdirect_socket_rdma_event_handler,
63 			    sc,
64 			    RDMA_PS_TCP,
65 			    IB_QPT_RC);
66 	if (IS_ERR(id)) {
67 		pr_err("%s: rdma_create_id() failed %1pe\n", __func__, id);
68 		return PTR_ERR(id);
69 	}
70 
71 	ret = rdma_set_afonly(id, 1);
72 	if (ret) {
73 		rdma_destroy_id(id);
74 		pr_err("%s: rdma_set_afonly() failed %1pe\n",
75 		       __func__, SMBDIRECT_DEBUG_ERR_PTR(ret));
76 		return ret;
77 	}
78 
79 	sc->rdma.cm_id = id;
80 
81 	INIT_WORK(&sc->disconnect_work, smbdirect_socket_cleanup_work);
82 
83 	return 0;
84 }
85 
86 int smbdirect_socket_create_kern(struct net *net, struct smbdirect_socket **_sc)
87 {
88 	struct smbdirect_socket *sc;
89 	int ret;
90 
91 	ret = -ENOMEM;
92 	sc = kzalloc_obj(*sc);
93 	if (!sc)
94 		goto alloc_failed;
95 
96 	ret = smbdirect_socket_init_new(net, sc);
97 	if (ret)
98 		goto init_failed;
99 
100 	kref_init(&sc->refs.destroy);
101 
102 	*_sc = sc;
103 	return 0;
104 
105 init_failed:
106 	kfree(sc);
107 alloc_failed:
108 	return ret;
109 }
110 EXPORT_SYMBOL_GPL(smbdirect_socket_create_kern);
111 
112 int smbdirect_socket_init_accepting(struct rdma_cm_id *id, struct smbdirect_socket *sc)
113 {
114 	smbdirect_socket_init(sc);
115 
116 	sc->rdma.cm_id = id;
117 	sc->rdma.cm_id->context = sc;
118 	sc->rdma.cm_id->event_handler = smbdirect_socket_rdma_event_handler;
119 
120 	sc->ib.dev = sc->rdma.cm_id->device;
121 
122 	INIT_WORK(&sc->disconnect_work, smbdirect_socket_cleanup_work);
123 
124 	return 0;
125 }
126 
127 int smbdirect_socket_create_accepting(struct rdma_cm_id *id, struct smbdirect_socket **_sc)
128 {
129 	struct smbdirect_socket *sc;
130 	int ret;
131 
132 	ret = -ENOMEM;
133 	sc = kzalloc_obj(*sc);
134 	if (!sc)
135 		goto alloc_failed;
136 
137 	ret = smbdirect_socket_init_accepting(id, sc);
138 	if (ret)
139 		goto init_failed;
140 
141 	kref_init(&sc->refs.destroy);
142 
143 	*_sc = sc;
144 	return 0;
145 
146 init_failed:
147 	kfree(sc);
148 alloc_failed:
149 	return ret;
150 }
151 EXPORT_SYMBOL_GPL(smbdirect_socket_create_accepting);
152 
153 int smbdirect_socket_set_initial_parameters(struct smbdirect_socket *sc,
154 					    const struct smbdirect_socket_parameters *sp)
155 {
156 	/*
157 	 * This is only allowed before connect or accept
158 	 */
159 	WARN_ONCE(sc->status != SMBDIRECT_SOCKET_CREATED,
160 		  "status=%s first_error=%1pe",
161 		  smbdirect_socket_status_string(sc->status),
162 		  SMBDIRECT_DEBUG_ERR_PTR(sc->first_error));
163 	if (sc->status != SMBDIRECT_SOCKET_CREATED)
164 		return -EINVAL;
165 
166 	if (sp->flags & ~SMBDIRECT_FLAG_PORT_RANGE_MASK)
167 		return -EINVAL;
168 
169 	if (sp->initiator_depth > U8_MAX)
170 		return -EINVAL;
171 	if (sp->responder_resources > U8_MAX)
172 		return -EINVAL;
173 
174 	if (sp->flags & SMBDIRECT_FLAG_PORT_RANGE_ONLY_IB &&
175 	    sp->flags & SMBDIRECT_FLAG_PORT_RANGE_ONLY_IW)
176 		return -EINVAL;
177 	else if (sp->flags & SMBDIRECT_FLAG_PORT_RANGE_ONLY_IB)
178 		rdma_restrict_node_type(sc->rdma.cm_id, RDMA_NODE_IB_CA);
179 	else if (sp->flags & SMBDIRECT_FLAG_PORT_RANGE_ONLY_IW)
180 		rdma_restrict_node_type(sc->rdma.cm_id, RDMA_NODE_RNIC);
181 
182 	/*
183 	 * Make a copy of the callers parameters
184 	 * from here we only work on the copy
185 	 *
186 	 * TODO: do we want consistency checking?
187 	 */
188 	sc->parameters = *sp;
189 
190 	return 0;
191 }
192 EXPORT_SYMBOL_GPL(smbdirect_socket_set_initial_parameters);
193 
194 const struct smbdirect_socket_parameters *
195 smbdirect_socket_get_current_parameters(struct smbdirect_socket *sc)
196 {
197 	return &sc->parameters;
198 }
199 EXPORT_SYMBOL_GPL(smbdirect_socket_get_current_parameters);
200 
201 int smbdirect_socket_set_kernel_settings(struct smbdirect_socket *sc,
202 					 enum ib_poll_context poll_ctx,
203 					 gfp_t gfp_mask)
204 {
205 	/*
206 	 * This is only allowed before connect or accept
207 	 */
208 	WARN_ONCE(sc->status != SMBDIRECT_SOCKET_CREATED,
209 		  "status=%s first_error=%1pe",
210 		  smbdirect_socket_status_string(sc->status),
211 		  SMBDIRECT_DEBUG_ERR_PTR(sc->first_error));
212 	if (sc->status != SMBDIRECT_SOCKET_CREATED)
213 		return -EINVAL;
214 
215 	sc->ib.poll_ctx = poll_ctx;
216 
217 	sc->send_io.mem.gfp_mask = gfp_mask;
218 	sc->recv_io.mem.gfp_mask = gfp_mask;
219 	sc->rw_io.mem.gfp_mask = gfp_mask;
220 
221 	return 0;
222 }
223 EXPORT_SYMBOL_GPL(smbdirect_socket_set_kernel_settings);
224 
225 void smbdirect_socket_set_logging(struct smbdirect_socket *sc,
226 				  void *private_ptr,
227 				  bool (*needed)(struct smbdirect_socket *sc,
228 						 void *private_ptr,
229 						 unsigned int lvl,
230 						 unsigned int cls),
231 				  void (*vaprintf)(struct smbdirect_socket *sc,
232 						   const char *func,
233 						   unsigned int line,
234 						   void *private_ptr,
235 						   unsigned int lvl,
236 						   unsigned int cls,
237 						   struct va_format *vaf))
238 {
239 	sc->logging.private_ptr = private_ptr;
240 	sc->logging.needed = needed;
241 	sc->logging.vaprintf = vaprintf;
242 }
243 EXPORT_SYMBOL_GPL(smbdirect_socket_set_logging);
244 
245 static void smbdirect_socket_wake_up_all(struct smbdirect_socket *sc)
246 {
247 	/*
248 	 * Wake up all waiters in all wait queues
249 	 * in order to notice the broken connection.
250 	 */
251 	wake_up_all(&sc->status_wait);
252 	wake_up_all(&sc->listen.wait_queue);
253 	wake_up_all(&sc->send_io.bcredits.wait_queue);
254 	wake_up_all(&sc->send_io.lcredits.wait_queue);
255 	wake_up_all(&sc->send_io.credits.wait_queue);
256 	wake_up_all(&sc->send_io.pending.zero_wait_queue);
257 	wake_up_all(&sc->recv_io.reassembly.wait_queue);
258 	wake_up_all(&sc->rw_io.credits.wait_queue);
259 	wake_up_all(&sc->mr_io.ready.wait_queue);
260 }
261 
262 void __smbdirect_socket_schedule_cleanup(struct smbdirect_socket *sc,
263 					 const char *macro_name,
264 					 unsigned int lvl,
265 					 const char *func,
266 					 unsigned int line,
267 					 int error,
268 					 enum smbdirect_socket_status *force_status)
269 {
270 	struct smbdirect_socket *psc, *tsc;
271 	unsigned long flags;
272 	bool was_first = false;
273 
274 	if (!sc->first_error) {
275 		___smbdirect_log_generic(sc, func, line,
276 			lvl,
277 			SMBDIRECT_LOG_RDMA_EVENT,
278 			"%s(%1pe%s%s) called from %s in line=%u status=%s\n",
279 			macro_name,
280 			SMBDIRECT_DEBUG_ERR_PTR(error),
281 			force_status ? ", " : "",
282 			force_status ? smbdirect_socket_status_string(*force_status) : "",
283 			func, line,
284 			smbdirect_socket_status_string(sc->status));
285 		if (error)
286 			sc->first_error = error;
287 		else
288 			sc->first_error = -ECONNABORTED;
289 		was_first = true;
290 	}
291 
292 	/*
293 	 * make sure other work (than disconnect_work)
294 	 * is not queued again but here we don't block and avoid
295 	 * disable[_delayed]_work_sync()
296 	 */
297 	disable_work(&sc->connect.work);
298 	disable_work(&sc->recv_io.posted.refill_work);
299 	disable_work(&sc->idle.immediate_work);
300 	sc->idle.keepalive = SMBDIRECT_KEEPALIVE_NONE;
301 	disable_delayed_work(&sc->idle.timer_work);
302 
303 	/*
304 	 * In case we were a listener we need to
305 	 * disconnect all pending and ready sockets
306 	 *
307 	 * First we move ready sockets to pending again.
308 	 *
309 	 * Only a socket that was a listener (listen.backlog != -1) owns a
310 	 * populated listen.ready/pending list.  Guarding on that also keeps
311 	 * lockdep quiet: without it, the listener holds sc->listen.lock while
312 	 * the loop recurses into each child psc, which takes psc->listen.lock.
313 	 * Those are always different instances of the same lock class -- a
314 	 * child never listens, so the nesting is strictly listener -> child
315 	 * and cannot really deadlock -- but lockdep only sees the class and
316 	 * reports "possible recursive locking".  A child has empty listen
317 	 * lists and nothing to do here, so skipping it loses nothing, and a
318 	 * pending child stays on its listener's list for the free path
319 	 * (smbdirect_socket_destroy) to reap.
320 	 */
321 	if (sc->listen.backlog != -1) { /* was a listener */
322 		spin_lock_irqsave(&sc->listen.lock, flags);
323 		list_splice_init(&sc->listen.ready, &sc->listen.pending);
324 		list_for_each_entry_safe(psc, tsc, &sc->listen.pending, accept.list)
325 			smbdirect_socket_schedule_cleanup(psc, sc->first_error);
326 		spin_unlock_irqrestore(&sc->listen.lock, flags);
327 	}
328 
329 	switch (sc->status) {
330 	case SMBDIRECT_SOCKET_RESOLVE_ADDR_FAILED:
331 	case SMBDIRECT_SOCKET_RESOLVE_ROUTE_FAILED:
332 	case SMBDIRECT_SOCKET_RDMA_CONNECT_FAILED:
333 	case SMBDIRECT_SOCKET_NEGOTIATE_FAILED:
334 	case SMBDIRECT_SOCKET_ERROR:
335 	case SMBDIRECT_SOCKET_DISCONNECTING:
336 	case SMBDIRECT_SOCKET_DISCONNECTED:
337 	case SMBDIRECT_SOCKET_DESTROYED:
338 		/*
339 		 * Keep the current error status
340 		 */
341 		break;
342 
343 	case SMBDIRECT_SOCKET_RESOLVE_ADDR_NEEDED:
344 	case SMBDIRECT_SOCKET_RESOLVE_ADDR_RUNNING:
345 		sc->status = SMBDIRECT_SOCKET_RESOLVE_ADDR_FAILED;
346 		break;
347 
348 	case SMBDIRECT_SOCKET_RESOLVE_ROUTE_NEEDED:
349 	case SMBDIRECT_SOCKET_RESOLVE_ROUTE_RUNNING:
350 		sc->status = SMBDIRECT_SOCKET_RESOLVE_ROUTE_FAILED;
351 		break;
352 
353 	case SMBDIRECT_SOCKET_RDMA_CONNECT_NEEDED:
354 	case SMBDIRECT_SOCKET_RDMA_CONNECT_RUNNING:
355 		sc->status = SMBDIRECT_SOCKET_RDMA_CONNECT_FAILED;
356 		break;
357 
358 	case SMBDIRECT_SOCKET_NEGOTIATE_NEEDED:
359 	case SMBDIRECT_SOCKET_NEGOTIATE_RUNNING:
360 		sc->status = SMBDIRECT_SOCKET_NEGOTIATE_FAILED;
361 		break;
362 
363 	case SMBDIRECT_SOCKET_CREATED:
364 	case SMBDIRECT_SOCKET_LISTENING:
365 		sc->status = SMBDIRECT_SOCKET_DISCONNECTED;
366 		break;
367 
368 	case SMBDIRECT_SOCKET_CONNECTED:
369 		sc->status = SMBDIRECT_SOCKET_ERROR;
370 		break;
371 	}
372 
373 	if (force_status && (was_first || *force_status > sc->status))
374 		sc->status = *force_status;
375 
376 	/*
377 	 * Wake up all waiters in all wait queues
378 	 * in order to notice the broken connection.
379 	 */
380 	smbdirect_socket_wake_up_all(sc);
381 
382 	queue_work(sc->workqueues.cleanup, &sc->disconnect_work);
383 }
384 
385 static void smbdirect_socket_cleanup_work(struct work_struct *work)
386 {
387 	struct smbdirect_socket *sc =
388 		container_of(work, struct smbdirect_socket, disconnect_work);
389 	struct smbdirect_socket *psc, *tsc;
390 	unsigned long flags;
391 
392 	/*
393 	 * This should not never be called in an interrupt!
394 	 */
395 	WARN_ON_ONCE(in_interrupt());
396 
397 	if (!sc->first_error) {
398 		smbdirect_log_rdma_event(sc, SMBDIRECT_LOG_ERR,
399 			"%s called with first_error==0\n",
400 			smbdirect_socket_status_string(sc->status));
401 
402 		sc->first_error = -ECONNABORTED;
403 	}
404 
405 	/*
406 	 * make sure this and other work is not queued again
407 	 * but here we don't block and avoid
408 	 * disable[_delayed]_work_sync()
409 	 */
410 	disable_work(&sc->disconnect_work);
411 	disable_work(&sc->connect.work);
412 	disable_work(&sc->recv_io.posted.refill_work);
413 	disable_work(&sc->idle.immediate_work);
414 	sc->idle.keepalive = SMBDIRECT_KEEPALIVE_NONE;
415 	disable_delayed_work(&sc->idle.timer_work);
416 
417 	/*
418 	 * In case we were a listener we need to
419 	 * disconnect all pending and ready sockets
420 	 *
421 	 * First we move ready sockets to pending again.
422 	 *
423 	 * Guarded on listen.backlog != -1 for the same reason as in
424 	 * __smbdirect_socket_schedule_cleanup(): only a listener owns a
425 	 * populated listen list, and skipping the block for a child avoids
426 	 * nesting psc->listen.lock under a listener's listen.lock (different
427 	 * instances of one class -- harmless, but lockdep cannot tell).
428 	 */
429 	if (sc->listen.backlog != -1) { /* was a listener */
430 		spin_lock_irqsave(&sc->listen.lock, flags);
431 		list_splice_init(&sc->listen.ready, &sc->listen.pending);
432 		list_for_each_entry_safe(psc, tsc, &sc->listen.pending, accept.list)
433 			smbdirect_socket_schedule_cleanup(psc, sc->first_error);
434 		spin_unlock_irqrestore(&sc->listen.lock, flags);
435 	}
436 
437 	switch (sc->status) {
438 	case SMBDIRECT_SOCKET_NEGOTIATE_NEEDED:
439 	case SMBDIRECT_SOCKET_NEGOTIATE_RUNNING:
440 	case SMBDIRECT_SOCKET_NEGOTIATE_FAILED:
441 	case SMBDIRECT_SOCKET_CONNECTED:
442 	case SMBDIRECT_SOCKET_ERROR:
443 		sc->status = SMBDIRECT_SOCKET_DISCONNECTING;
444 		/*
445 		 * Make sure we hold the callback lock
446 		 * im order to coordinate with the
447 		 * rdma_event handlers, typically
448 		 * smbdirect_connection_rdma_event_handler(),
449 		 * and smbdirect_socket_destroy().
450 		 *
451 		 * So that the order of ib_drain_qp()
452 		 * and rdma_disconnect() is controlled
453 		 * by the mutex.
454 		 */
455 		rdma_lock_handler(sc->rdma.cm_id);
456 		rdma_disconnect(sc->rdma.cm_id);
457 		rdma_unlock_handler(sc->rdma.cm_id);
458 		break;
459 
460 	case SMBDIRECT_SOCKET_CREATED:
461 	case SMBDIRECT_SOCKET_LISTENING:
462 	case SMBDIRECT_SOCKET_RESOLVE_ADDR_NEEDED:
463 	case SMBDIRECT_SOCKET_RESOLVE_ADDR_RUNNING:
464 	case SMBDIRECT_SOCKET_RESOLVE_ADDR_FAILED:
465 	case SMBDIRECT_SOCKET_RESOLVE_ROUTE_NEEDED:
466 	case SMBDIRECT_SOCKET_RESOLVE_ROUTE_RUNNING:
467 	case SMBDIRECT_SOCKET_RESOLVE_ROUTE_FAILED:
468 	case SMBDIRECT_SOCKET_RDMA_CONNECT_NEEDED:
469 	case SMBDIRECT_SOCKET_RDMA_CONNECT_RUNNING:
470 	case SMBDIRECT_SOCKET_RDMA_CONNECT_FAILED:
471 		/*
472 		 * rdma_{accept,connect}() never reached
473 		 * RDMA_CM_EVENT_ESTABLISHED
474 		 */
475 		sc->status = SMBDIRECT_SOCKET_DISCONNECTED;
476 		break;
477 
478 	case SMBDIRECT_SOCKET_DISCONNECTING:
479 	case SMBDIRECT_SOCKET_DISCONNECTED:
480 	case SMBDIRECT_SOCKET_DESTROYED:
481 		break;
482 	}
483 
484 	/*
485 	 * Wake up all waiters in all wait queues
486 	 * in order to notice the broken connection.
487 	 */
488 	smbdirect_socket_wake_up_all(sc);
489 }
490 
491 static void smbdirect_socket_destroy(struct smbdirect_socket *sc)
492 {
493 	struct smbdirect_socket *psc, *tsc;
494 	size_t psockets;
495 	struct smbdirect_recv_io *recv_io;
496 	struct smbdirect_recv_io *recv_tmp;
497 	LIST_HEAD(all_list);
498 	LIST_HEAD(pending_list);
499 	unsigned long flags;
500 
501 	smbdirect_log_rdma_event(sc, SMBDIRECT_LOG_INFO,
502 		"status=%s first_error=%1pe",
503 		smbdirect_socket_status_string(sc->status),
504 		SMBDIRECT_DEBUG_ERR_PTR(sc->first_error));
505 
506 	/*
507 	 * This should not never be called in an interrupt!
508 	 */
509 	WARN_ON_ONCE(in_interrupt());
510 
511 	if (sc->status == SMBDIRECT_SOCKET_DESTROYED)
512 		return;
513 
514 	WARN_ONCE(sc->status != SMBDIRECT_SOCKET_DISCONNECTED,
515 		  "status=%s first_error=%1pe",
516 		  smbdirect_socket_status_string(sc->status),
517 		  SMBDIRECT_DEBUG_ERR_PTR(sc->first_error));
518 
519 	/*
520 	 * The listener should clear this before we reach this
521 	 */
522 	WARN_ONCE(sc->accept.listener,
523 		  "status=%s first_error=%1pe",
524 		  smbdirect_socket_status_string(sc->status),
525 		  SMBDIRECT_DEBUG_ERR_PTR(sc->first_error));
526 
527 	/*
528 	 * Wake up all waiters in all wait queues
529 	 * in order to notice the broken connection.
530 	 *
531 	 * Most likely this was already called via
532 	 * smbdirect_socket_cleanup_work(), but call it again...
533 	 */
534 	smbdirect_socket_wake_up_all(sc);
535 
536 	disable_work_sync(&sc->disconnect_work);
537 	disable_work_sync(&sc->connect.work);
538 	disable_work_sync(&sc->recv_io.posted.refill_work);
539 	disable_work_sync(&sc->idle.immediate_work);
540 	disable_delayed_work_sync(&sc->idle.timer_work);
541 
542 	if (sc->rdma.cm_id)
543 		rdma_lock_handler(sc->rdma.cm_id);
544 
545 	if (sc->ib.qp) {
546 		smbdirect_log_rdma_event(sc, SMBDIRECT_LOG_INFO,
547 			"drain qp\n");
548 		ib_drain_qp(sc->ib.qp);
549 	}
550 
551 	/*
552 	 * In case we were a listener we need to
553 	 * disconnect all pending and ready sockets
554 	 *
555 	 * We move ready sockets to pending again.
556 	 *
557 	 * Capture them here -- rdma_lock_handler(sc->rdma.cm_id) is held above,
558 	 * so a concurrent CM CONNECT_REQUEST cannot add more; sc->listen.lock
559 	 * below only protects the list splice itself -- but DEFER releasing
560 	 * them until the listener's cm_id is destroyed:
561 	 *
562 	 * - smbdirect_socket_release() -> smbdirect_socket_destroy() takes the
563 	 *   child's own rdma_lock_handler() lock (&id_priv->handler_mutex).
564 	 *   The listener's and the child's cm_id are always different
565 	 *   instances, so the nesting cannot really deadlock, but lockdep only
566 	 *   sees one lock class and reports "possible recursive locking".
567 	 *
568 	 * - rdma_destroy_id() of a child before the listener's own
569 	 *   rdma_destroy_id() below lets _cma_cancel_listens() walk the freed
570 	 *   child id_priv (KASAN slab-use-after-free in __mutex_lock()).
571 	 *
572 	 * The children are independent sockets whose teardown does not need
573 	 * the listener's handler lock.
574 	 */
575 	spin_lock_irqsave(&sc->listen.lock, flags);
576 	list_splice_tail_init(&sc->listen.ready, &pending_list);
577 	list_splice_tail_init(&sc->listen.pending, &pending_list);
578 	spin_unlock_irqrestore(&sc->listen.lock, flags);
579 
580 	/* It's not possible for upper layer to get to reassembly */
581 	if (sc->listen.backlog == -1) /* was not a listener */
582 		smbdirect_log_rdma_event(sc, SMBDIRECT_LOG_INFO,
583 			"drain the reassembly queue\n");
584 	spin_lock_irqsave(&sc->recv_io.reassembly.lock, flags);
585 	list_splice_tail_init(&sc->recv_io.reassembly.list, &all_list);
586 	spin_unlock_irqrestore(&sc->recv_io.reassembly.lock, flags);
587 	list_for_each_entry_safe(recv_io, recv_tmp, &all_list, list)
588 		smbdirect_connection_put_recv_io(recv_io);
589 	sc->recv_io.reassembly.data_length = 0;
590 
591 	if (sc->listen.backlog == -1) /* was not a listener */
592 		smbdirect_log_rdma_event(sc, SMBDIRECT_LOG_INFO,
593 			"freeing mr list\n");
594 	smbdirect_connection_destroy_mr_list(sc);
595 
596 	if (sc->listen.backlog == -1) /* was not a listener */
597 		smbdirect_log_rdma_event(sc, SMBDIRECT_LOG_INFO,
598 			"destroying qp\n");
599 	smbdirect_connection_destroy_qp(sc);
600 	if (sc->rdma.cm_id) {
601 		rdma_unlock_handler(sc->rdma.cm_id);
602 		smbdirect_log_rdma_event(sc, SMBDIRECT_LOG_INFO,
603 			"destroying cm_id\n");
604 		rdma_destroy_id(sc->rdma.cm_id);
605 		sc->rdma.cm_id = NULL;
606 	}
607 
608 	/*
609 	 * The listener's rdma_lock_handler() lock is dropped and its cm_id is
610 	 * destroyed, so it is safe to release the child sockets captured
611 	 * above: each release recurses into smbdirect_socket_destroy() and
612 	 * takes that child's own handler_mutex without nesting it under the
613 	 * listener's, and _cma_cancel_listens() can no longer reach them.
614 	 */
615 	psockets = list_count_nodes(&pending_list);
616 	if (sc->listen.backlog != -1) /* was a listener */
617 		smbdirect_log_rdma_event(sc, SMBDIRECT_LOG_INFO,
618 			"release %zu pending sockets\n", psockets);
619 	list_for_each_entry_safe(psc, tsc, &pending_list, accept.list) {
620 		list_del_init(&psc->accept.list);
621 		psc->accept.listener = NULL;
622 		smbdirect_socket_release(psc);
623 	}
624 	if (sc->listen.backlog != -1) /* was a listener */
625 		smbdirect_log_rdma_event(sc, SMBDIRECT_LOG_INFO,
626 			"released %zu pending sockets\n", psockets);
627 
628 	if (sc->listen.backlog == -1) /* was not a listener */
629 		smbdirect_log_rdma_event(sc, SMBDIRECT_LOG_INFO,
630 			"destroying mem pools\n");
631 	smbdirect_connection_destroy_mem_pools(sc);
632 
633 	sc->status = SMBDIRECT_SOCKET_DESTROYED;
634 
635 	smbdirect_log_rdma_event(sc, SMBDIRECT_LOG_INFO,
636 		"rdma session destroyed\n");
637 }
638 
639 void smbdirect_socket_destroy_sync(struct smbdirect_socket *sc)
640 {
641 	smbdirect_log_rdma_event(sc, SMBDIRECT_LOG_INFO,
642 		"status=%s first_error=%1pe",
643 		smbdirect_socket_status_string(sc->status),
644 		SMBDIRECT_DEBUG_ERR_PTR(sc->first_error));
645 
646 	/*
647 	 * This should not never be called in an interrupt!
648 	 */
649 	WARN_ON_ONCE(in_interrupt());
650 
651 	/*
652 	 * First we try to disable the work
653 	 * without disable_work_sync() in a
654 	 * non blocking way, if it's already
655 	 * running it will be handles by
656 	 * disable_work_sync() below.
657 	 *
658 	 * Here we just want to make sure queue_work() in
659 	 * smbdirect_socket_schedule_cleanup_lvl()
660 	 * is a no-op.
661 	 */
662 	disable_work(&sc->disconnect_work);
663 
664 	if (!sc->first_error)
665 		/*
666 		 * SMBDIRECT_LOG_INFO is enough here
667 		 * as this is the typical case where
668 		 * we terminate the connection ourself.
669 		 */
670 		smbdirect_socket_schedule_cleanup_lvl(sc,
671 						      SMBDIRECT_LOG_INFO,
672 						      -ESHUTDOWN);
673 
674 	smbdirect_log_rdma_event(sc, SMBDIRECT_LOG_INFO,
675 		"cancelling and disable disconnect_work\n");
676 	disable_work_sync(&sc->disconnect_work);
677 
678 	smbdirect_log_rdma_event(sc, SMBDIRECT_LOG_INFO,
679 		"destroying rdma session\n");
680 	if (sc->status < SMBDIRECT_SOCKET_DISCONNECTING)
681 		smbdirect_socket_cleanup_work(&sc->disconnect_work);
682 	if (sc->status < SMBDIRECT_SOCKET_DISCONNECTED) {
683 		smbdirect_log_rdma_event(sc, SMBDIRECT_LOG_INFO,
684 			"wait for transport being disconnected\n");
685 		wait_event(sc->status_wait, sc->status == SMBDIRECT_SOCKET_DISCONNECTED);
686 		smbdirect_log_rdma_event(sc, SMBDIRECT_LOG_INFO,
687 			"waited for transport being disconnected\n");
688 	}
689 
690 	/*
691 	 * Once we reached SMBDIRECT_SOCKET_DISCONNECTED,
692 	 * we should call smbdirect_socket_destroy()
693 	 */
694 	smbdirect_socket_destroy(sc);
695 	smbdirect_log_rdma_event(sc, SMBDIRECT_LOG_INFO,
696 		"status=%s first_error=%1pe",
697 		smbdirect_socket_status_string(sc->status),
698 		SMBDIRECT_DEBUG_ERR_PTR(sc->first_error));
699 }
700 
701 int smbdirect_socket_bind(struct smbdirect_socket *sc, struct sockaddr *addr)
702 {
703 	int ret;
704 
705 	if (sc->status != SMBDIRECT_SOCKET_CREATED)
706 		return -EINVAL;
707 
708 	ret = rdma_bind_addr(sc->rdma.cm_id, addr);
709 	if (ret)
710 		return ret;
711 
712 	return 0;
713 }
714 EXPORT_SYMBOL_GPL(smbdirect_socket_bind);
715 
716 void smbdirect_socket_shutdown(struct smbdirect_socket *sc)
717 {
718 	smbdirect_socket_schedule_cleanup_lvl(sc, SMBDIRECT_LOG_INFO, -ESHUTDOWN);
719 }
720 EXPORT_SYMBOL_GPL(smbdirect_socket_shutdown);
721 
722 static void smbdirect_socket_release_disconnect(struct kref *kref)
723 {
724 	struct smbdirect_socket *sc =
725 		container_of(kref, struct smbdirect_socket, refs.disconnect);
726 
727 	/*
728 	 * For now do a sync disconnect/destroy
729 	 */
730 	smbdirect_socket_destroy_sync(sc);
731 }
732 
733 static void smbdirect_socket_release_destroy(struct kref *kref)
734 {
735 	struct smbdirect_socket *sc =
736 		container_of(kref, struct smbdirect_socket, refs.destroy);
737 
738 	/*
739 	 * Do a sync disconnect/destroy...
740 	 * hopefully a no-op, as it should be already
741 	 * in DESTROYED state, before we free the memory.
742 	 */
743 	smbdirect_socket_destroy_sync(sc);
744 	kfree(sc);
745 }
746 
747 void smbdirect_socket_release(struct smbdirect_socket *sc)
748 {
749 	/*
750 	 * We expect only 1 disconnect reference
751 	 * and if it is already 0, it's a use after free!
752 	 */
753 	WARN_ON_ONCE(kref_read(&sc->refs.disconnect) != 1);
754 	WARN_ON(!kref_put(&sc->refs.disconnect, smbdirect_socket_release_disconnect));
755 
756 	/*
757 	 * This may not trigger smbdirect_socket_release_destroy(),
758 	 * if struct smbdirect_socket is embedded in another structure
759 	 * indicated by REFCOUNT_MAX.
760 	 */
761 	kref_put(&sc->refs.destroy, smbdirect_socket_release_destroy);
762 }
763 EXPORT_SYMBOL_GPL(smbdirect_socket_release);
764 
765 int smbdirect_socket_wait_for_credits(struct smbdirect_socket *sc,
766 				      enum smbdirect_socket_status expected_status,
767 				      int unexpected_errno,
768 				      wait_queue_head_t *waitq,
769 				      atomic_t *total_credits,
770 				      int needed)
771 {
772 	int ret;
773 
774 	if (WARN_ON_ONCE(needed < 0))
775 		return -EINVAL;
776 
777 	do {
778 		if (atomic_sub_return(needed, total_credits) >= 0)
779 			return 0;
780 
781 		atomic_add(needed, total_credits);
782 		ret = wait_event_interruptible(*waitq,
783 					       atomic_read(total_credits) >= needed ||
784 					       sc->status != expected_status);
785 
786 		if (sc->status != expected_status)
787 			return unexpected_errno;
788 		else if (ret < 0)
789 			return ret;
790 	} while (true);
791 }
792