svc_rdma_transport.c 37.9 KB
Newer Older
1
/*
S
Steve Wise 已提交
2
 * Copyright (c) 2014 Open Grid Computing, Inc. All rights reserved.
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
 * Copyright (c) 2005-2007 Network Appliance, Inc. All rights reserved.
 *
 * This software is available to you under a choice of one of two
 * licenses.  You may choose to be licensed under the terms of the GNU
 * General Public License (GPL) Version 2, available from the file
 * COPYING in the main directory of this source tree, or the BSD-type
 * license below:
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *      Redistributions of source code must retain the above copyright
 *      notice, this list of conditions and the following disclaimer.
 *
 *      Redistributions in binary form must reproduce the above
 *      copyright notice, this list of conditions and the following
 *      disclaimer in the documentation and/or other materials provided
 *      with the distribution.
 *
 *      Neither the name of the Network Appliance, Inc. nor the names of
 *      its contributors may be used to endorse or promote products
 *      derived from this software without specific prior written
 *      permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * Author: Tom Tucker <tom@opengridcomputing.com>
 */

#include <linux/sunrpc/svc_xprt.h>
#include <linux/sunrpc/debug.h>
#include <linux/sunrpc/rpc_rdma.h>
46
#include <linux/interrupt.h>
47
#include <linux/sched.h>
48
#include <linux/slab.h>
49
#include <linux/spinlock.h>
50
#include <linux/workqueue.h>
51 52 53
#include <rdma/ib_verbs.h>
#include <rdma/rdma_cm.h>
#include <linux/sunrpc/svc_rdma.h>
54
#include <linux/export.h>
55
#include "xprt_rdma.h"
56 57 58

#define RPCDBG_FACILITY	RPCDBG_SVCXPRT

59
static struct svcxprt_rdma *rdma_create_xprt(struct svc_serv *, int);
60
static struct svc_xprt *svc_rdma_create(struct svc_serv *serv,
61
					struct net *net,
62 63 64 65 66 67 68 69
					struct sockaddr *sa, int salen,
					int flags);
static struct svc_xprt *svc_rdma_accept(struct svc_xprt *xprt);
static void svc_rdma_release_rqst(struct svc_rqst *);
static void dto_tasklet_func(unsigned long data);
static void svc_rdma_detach(struct svc_xprt *xprt);
static void svc_rdma_free(struct svc_xprt *xprt);
static int svc_rdma_has_wspace(struct svc_xprt *xprt);
70
static int svc_rdma_secure_port(struct svc_rqst *);
71 72 73
static void rq_cq_reap(struct svcxprt_rdma *xprt);
static void sq_cq_reap(struct svcxprt_rdma *xprt);

R
Roel Kluin 已提交
74
static DECLARE_TASKLET(dto_tasklet, dto_tasklet_func, 0UL);
75 76 77 78 79 80 81 82 83 84 85 86 87
static DEFINE_SPINLOCK(dto_lock);
static LIST_HEAD(dto_xprt_q);

static struct svc_xprt_ops svc_rdma_ops = {
	.xpo_create = svc_rdma_create,
	.xpo_recvfrom = svc_rdma_recvfrom,
	.xpo_sendto = svc_rdma_sendto,
	.xpo_release_rqst = svc_rdma_release_rqst,
	.xpo_detach = svc_rdma_detach,
	.xpo_free = svc_rdma_free,
	.xpo_prep_reply_hdr = svc_rdma_prep_reply_hdr,
	.xpo_has_wspace = svc_rdma_has_wspace,
	.xpo_accept = svc_rdma_accept,
88
	.xpo_secure_port = svc_rdma_secure_port,
89 90 91 92 93 94
};

struct svc_xprt_class svc_rdma_class = {
	.xcl_name = "rdma",
	.xcl_owner = THIS_MODULE,
	.xcl_ops = &svc_rdma_ops,
95
	.xcl_max_payload = RPCSVC_MAXPAYLOAD_RDMA,
96
	.xcl_ident = XPRT_TRANSPORT_RDMA,
97 98
};

99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
#if defined(CONFIG_SUNRPC_BACKCHANNEL)
static struct svc_xprt *svc_rdma_bc_create(struct svc_serv *, struct net *,
					   struct sockaddr *, int, int);
static void svc_rdma_bc_detach(struct svc_xprt *);
static void svc_rdma_bc_free(struct svc_xprt *);

static struct svc_xprt_ops svc_rdma_bc_ops = {
	.xpo_create = svc_rdma_bc_create,
	.xpo_detach = svc_rdma_bc_detach,
	.xpo_free = svc_rdma_bc_free,
	.xpo_prep_reply_hdr = svc_rdma_prep_reply_hdr,
	.xpo_secure_port = svc_rdma_secure_port,
};

struct svc_xprt_class svc_rdma_bc_class = {
	.xcl_name = "rdma-bc",
	.xcl_owner = THIS_MODULE,
	.xcl_ops = &svc_rdma_bc_ops,
	.xcl_max_payload = (1024 - RPCRDMA_HDRLEN_MIN)
};

static struct svc_xprt *svc_rdma_bc_create(struct svc_serv *serv,
					   struct net *net,
					   struct sockaddr *sa, int salen,
					   int flags)
{
	struct svcxprt_rdma *cma_xprt;
	struct svc_xprt *xprt;

	cma_xprt = rdma_create_xprt(serv, 0);
	if (!cma_xprt)
		return ERR_PTR(-ENOMEM);
	xprt = &cma_xprt->sc_xprt;

	svc_xprt_init(net, &svc_rdma_bc_class, xprt, serv);
	serv->sv_bc_xprt = xprt;

	dprintk("svcrdma: %s(%p)\n", __func__, xprt);
	return xprt;
}

static void svc_rdma_bc_detach(struct svc_xprt *xprt)
{
	dprintk("svcrdma: %s(%p)\n", __func__, xprt);
}

static void svc_rdma_bc_free(struct svc_xprt *xprt)
{
	struct svcxprt_rdma *rdma =
		container_of(xprt, struct svcxprt_rdma, sc_xprt);

	dprintk("svcrdma: %s(%p)\n", __func__, xprt);
	if (xprt)
		kfree(rdma);
}
#endif	/* CONFIG_SUNRPC_BACKCHANNEL */

156 157 158 159
struct svc_rdma_op_ctxt *svc_rdma_get_context(struct svcxprt_rdma *xprt)
{
	struct svc_rdma_op_ctxt *ctxt;

160 161
	ctxt = kmem_cache_alloc(svc_rdma_ctxt_cachep,
				GFP_KERNEL | __GFP_NOFAIL);
162 163 164
	ctxt->xprt = xprt;
	INIT_LIST_HEAD(&ctxt->dto_q);
	ctxt->count = 0;
T
Tom Tucker 已提交
165
	ctxt->frmr = NULL;
166
	atomic_inc(&xprt->sc_ctxt_used);
167 168 169
	return ctxt;
}

170
void svc_rdma_unmap_dma(struct svc_rdma_op_ctxt *ctxt)
171 172 173 174
{
	struct svcxprt_rdma *xprt = ctxt->xprt;
	int i;
	for (i = 0; i < ctxt->count && ctxt->sge[i].length; i++) {
T
Tom Tucker 已提交
175 176 177 178 179 180 181 182
		/*
		 * Unmap the DMA addr in the SGE if the lkey matches
		 * the sc_dma_lkey, otherwise, ignore it since it is
		 * an FRMR lkey and will be unmapped later when the
		 * last WR that uses it completes.
		 */
		if (ctxt->sge[i].lkey == xprt->sc_dma_lkey) {
			atomic_dec(&xprt->sc_dma_used);
183
			ib_dma_unmap_page(xprt->sc_cm_id->device,
T
Tom Tucker 已提交
184 185 186 187
					    ctxt->sge[i].addr,
					    ctxt->sge[i].length,
					    ctxt->direction);
		}
188 189 190
	}
}

191 192 193 194 195 196 197 198 199 200
void svc_rdma_put_context(struct svc_rdma_op_ctxt *ctxt, int free_pages)
{
	struct svcxprt_rdma *xprt;
	int i;

	xprt = ctxt->xprt;
	if (free_pages)
		for (i = 0; i < ctxt->count; i++)
			put_page(ctxt->pages[i]);

201
	kmem_cache_free(svc_rdma_ctxt_cachep, ctxt);
202
	atomic_dec(&xprt->sc_ctxt_used);
203 204
}

205 206 207 208 209 210 211 212
/*
 * Temporary NFS req mappings are shared across all transport
 * instances. These are short lived and should be bounded by the number
 * of concurrent server threads * depth of the SQ.
 */
struct svc_rdma_req_map *svc_rdma_get_req_map(void)
{
	struct svc_rdma_req_map *map;
213 214
	map = kmem_cache_alloc(svc_rdma_map_cachep,
			       GFP_KERNEL | __GFP_NOFAIL);
215 216 217 218 219 220 221 222 223
	map->count = 0;
	return map;
}

void svc_rdma_put_req_map(struct svc_rdma_req_map *map)
{
	kmem_cache_free(svc_rdma_map_cachep, map);
}

224 225 226 227
/* ib_cq event handler */
static void cq_event_handler(struct ib_event *event, void *context)
{
	struct svc_xprt *xprt = context;
228 229
	dprintk("svcrdma: received CQ event %s (%d), context=%p\n",
		ib_event_msg(event->event), event->event, context);
230 231 232 233 234 235 236 237 238 239 240 241 242 243
	set_bit(XPT_CLOSE, &xprt->xpt_flags);
}

/* QP event handler */
static void qp_event_handler(struct ib_event *event, void *context)
{
	struct svc_xprt *xprt = context;

	switch (event->event) {
	/* These are considered benign events */
	case IB_EVENT_PATH_MIG:
	case IB_EVENT_COMM_EST:
	case IB_EVENT_SQ_DRAINED:
	case IB_EVENT_QP_LAST_WQE_REACHED:
244 245 246
		dprintk("svcrdma: QP event %s (%d) received for QP=%p\n",
			ib_event_msg(event->event), event->event,
			event->element.qp);
247 248 249 250 251 252 253 254
		break;
	/* These are considered fatal events */
	case IB_EVENT_PATH_MIG_ERR:
	case IB_EVENT_QP_FATAL:
	case IB_EVENT_QP_REQ_ERR:
	case IB_EVENT_QP_ACCESS_ERR:
	case IB_EVENT_DEVICE_FATAL:
	default:
255
		dprintk("svcrdma: QP ERROR event %s (%d) received for QP=%p, "
256
			"closing transport\n",
257 258
			ib_event_msg(event->event), event->event,
			event->element.qp);
259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284
		set_bit(XPT_CLOSE, &xprt->xpt_flags);
		break;
	}
}

/*
 * Data Transfer Operation Tasklet
 *
 * Walks a list of transports with I/O pending, removing entries as
 * they are added to the server's I/O pending list. Two bits indicate
 * if SQ, RQ, or both have I/O pending. The dto_lock is an irqsave
 * spinlock that serializes access to the transport list with the RQ
 * and SQ interrupt handlers.
 */
static void dto_tasklet_func(unsigned long data)
{
	struct svcxprt_rdma *xprt;
	unsigned long flags;

	spin_lock_irqsave(&dto_lock, flags);
	while (!list_empty(&dto_xprt_q)) {
		xprt = list_entry(dto_xprt_q.next,
				  struct svcxprt_rdma, sc_dto_q);
		list_del_init(&xprt->sc_dto_q);
		spin_unlock_irqrestore(&dto_lock, flags);

285 286
		rq_cq_reap(xprt);
		sq_cq_reap(xprt);
287

288
		svc_xprt_put(&xprt->sc_xprt);
289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304
		spin_lock_irqsave(&dto_lock, flags);
	}
	spin_unlock_irqrestore(&dto_lock, flags);
}

/*
 * Receive Queue Completion Handler
 *
 * Since an RQ completion handler is called on interrupt context, we
 * need to defer the handling of the I/O to a tasklet
 */
static void rq_comp_handler(struct ib_cq *cq, void *cq_context)
{
	struct svcxprt_rdma *xprt = cq_context;
	unsigned long flags;

305 306 307 308
	/* Guard against unconditional flush call for destroyed QP */
	if (atomic_read(&xprt->sc_xprt.xpt_ref.refcount)==0)
		return;

309 310 311 312
	/*
	 * Set the bit regardless of whether or not it's on the list
	 * because it may be on the list already due to an SQ
	 * completion.
313
	 */
314 315 316 317 318 319 320
	set_bit(RDMAXPRT_RQ_PENDING, &xprt->sc_flags);

	/*
	 * If this transport is not already on the DTO transport queue,
	 * add it
	 */
	spin_lock_irqsave(&dto_lock, flags);
321 322
	if (list_empty(&xprt->sc_dto_q)) {
		svc_xprt_get(&xprt->sc_xprt);
323
		list_add_tail(&xprt->sc_dto_q, &dto_xprt_q);
324
	}
325 326 327 328 329 330 331 332 333 334 335
	spin_unlock_irqrestore(&dto_lock, flags);

	/* Tasklet does all the work to avoid irqsave locks. */
	tasklet_schedule(&dto_tasklet);
}

/*
 * rq_cq_reap - Process the RQ CQ.
 *
 * Take all completing WC off the CQE and enqueue the associated DTO
 * context on the dto_q for the transport.
336 337
 *
 * Note that caller must hold a transport reference.
338 339 340 341 342 343 344
 */
static void rq_cq_reap(struct svcxprt_rdma *xprt)
{
	int ret;
	struct ib_wc wc;
	struct svc_rdma_op_ctxt *ctxt = NULL;

345 346 347 348
	if (!test_and_clear_bit(RDMAXPRT_RQ_PENDING, &xprt->sc_flags))
		return;

	ib_req_notify_cq(xprt->sc_rq_cq, IB_CQ_NEXT_COMP);
349 350 351 352 353 354
	atomic_inc(&rdma_stat_rq_poll);

	while ((ret = ib_poll_cq(xprt->sc_rq_cq, 1, &wc)) > 0) {
		ctxt = (struct svc_rdma_op_ctxt *)(unsigned long)wc.wr_id;
		ctxt->wc_status = wc.status;
		ctxt->byte_len = wc.byte_len;
355
		svc_rdma_unmap_dma(ctxt);
356 357
		if (wc.status != IB_WC_SUCCESS) {
			/* Close the transport */
358
			dprintk("svcrdma: transport closing putting ctxt %p\n", ctxt);
359 360
			set_bit(XPT_CLOSE, &xprt->sc_xprt.xpt_flags);
			svc_rdma_put_context(ctxt, 1);
361
			svc_xprt_put(&xprt->sc_xprt);
362 363
			continue;
		}
364
		spin_lock_bh(&xprt->sc_rq_dto_lock);
365
		list_add_tail(&ctxt->dto_q, &xprt->sc_rq_dto_q);
366
		spin_unlock_bh(&xprt->sc_rq_dto_lock);
367
		svc_xprt_put(&xprt->sc_xprt);
368 369 370 371
	}

	if (ctxt)
		atomic_inc(&rdma_stat_rq_prod);
372 373 374 375 376 377 378 379 380

	set_bit(XPT_DATA, &xprt->sc_xprt.xpt_flags);
	/*
	 * If data arrived before established event,
	 * don't enqueue. This defers RPC I/O until the
	 * RDMA connection is complete.
	 */
	if (!test_bit(RDMAXPRT_CONN_PENDING, &xprt->sc_flags))
		svc_xprt_enqueue(&xprt->sc_xprt);
381 382
}

383
/*
384
 * Process a completion context
385 386 387 388 389 390 391 392
 */
static void process_context(struct svcxprt_rdma *xprt,
			    struct svc_rdma_op_ctxt *ctxt)
{
	svc_rdma_unmap_dma(ctxt);

	switch (ctxt->wr_op) {
	case IB_WR_SEND:
393 394
		if (ctxt->frmr)
			pr_err("svcrdma: SEND: ctxt->frmr != NULL\n");
395 396 397 398
		svc_rdma_put_context(ctxt, 1);
		break;

	case IB_WR_RDMA_WRITE:
399 400
		if (ctxt->frmr)
			pr_err("svcrdma: WRITE: ctxt->frmr != NULL\n");
401 402 403 404
		svc_rdma_put_context(ctxt, 0);
		break;

	case IB_WR_RDMA_READ:
405
	case IB_WR_RDMA_READ_WITH_INV:
S
Steve Wise 已提交
406
		svc_rdma_put_frmr(xprt, ctxt->frmr);
407 408
		if (test_bit(RDMACTXT_F_LAST_CTXT, &ctxt->flags)) {
			struct svc_rdma_op_ctxt *read_hdr = ctxt->read_hdr;
409 410 411 412 413 414 415 416 417
			if (read_hdr) {
				spin_lock_bh(&xprt->sc_rq_dto_lock);
				set_bit(XPT_DATA, &xprt->sc_xprt.xpt_flags);
				list_add_tail(&read_hdr->dto_q,
					      &xprt->sc_read_complete_q);
				spin_unlock_bh(&xprt->sc_rq_dto_lock);
			} else {
				pr_err("svcrdma: ctxt->read_hdr == NULL\n");
			}
418 419 420 421 422 423 424 425 426 427 428 429 430
			svc_xprt_enqueue(&xprt->sc_xprt);
		}
		svc_rdma_put_context(ctxt, 0);
		break;

	default:
		printk(KERN_ERR "svcrdma: unexpected completion type, "
		       "opcode=%d\n",
		       ctxt->wr_op);
		break;
	}
}

431 432
/*
 * Send Queue Completion Handler - potentially called on interrupt context.
433 434
 *
 * Note that caller must hold a transport reference.
435 436 437 438
 */
static void sq_cq_reap(struct svcxprt_rdma *xprt)
{
	struct svc_rdma_op_ctxt *ctxt = NULL;
S
Steve Wise 已提交
439 440
	struct ib_wc wc_a[6];
	struct ib_wc *wc;
441 442 443
	struct ib_cq *cq = xprt->sc_sq_cq;
	int ret;

S
Steve Wise 已提交
444 445
	memset(wc_a, 0, sizeof(wc_a));

446 447 448 449
	if (!test_and_clear_bit(RDMAXPRT_SQ_PENDING, &xprt->sc_flags))
		return;

	ib_req_notify_cq(xprt->sc_sq_cq, IB_CQ_NEXT_COMP);
450
	atomic_inc(&rdma_stat_sq_poll);
S
Steve Wise 已提交
451 452
	while ((ret = ib_poll_cq(cq, ARRAY_SIZE(wc_a), wc_a)) > 0) {
		int i;
453

S
Steve Wise 已提交
454 455 456
		for (i = 0; i < ret; i++) {
			wc = &wc_a[i];
			if (wc->status != IB_WC_SUCCESS) {
457 458
				dprintk("svcrdma: sq wc err status %s (%d)\n",
					ib_wc_status_msg(wc->status),
S
Steve Wise 已提交
459
					wc->status);
460

S
Steve Wise 已提交
461 462 463
				/* Close the transport */
				set_bit(XPT_CLOSE, &xprt->sc_xprt.xpt_flags);
			}
464

S
Steve Wise 已提交
465 466 467 468 469 470 471 472 473 474 475
			/* Decrement used SQ WR count */
			atomic_dec(&xprt->sc_sq_count);
			wake_up(&xprt->sc_send_wait);

			ctxt = (struct svc_rdma_op_ctxt *)
				(unsigned long)wc->wr_id;
			if (ctxt)
				process_context(xprt, ctxt);

			svc_xprt_put(&xprt->sc_xprt);
		}
476 477 478 479 480 481 482 483 484 485 486
	}

	if (ctxt)
		atomic_inc(&rdma_stat_sq_prod);
}

static void sq_comp_handler(struct ib_cq *cq, void *cq_context)
{
	struct svcxprt_rdma *xprt = cq_context;
	unsigned long flags;

487 488 489 490
	/* Guard against unconditional flush call for destroyed QP */
	if (atomic_read(&xprt->sc_xprt.xpt_ref.refcount)==0)
		return;

491 492 493 494
	/*
	 * Set the bit regardless of whether or not it's on the list
	 * because it may be on the list already due to an RQ
	 * completion.
495
	 */
496 497 498 499 500 501 502
	set_bit(RDMAXPRT_SQ_PENDING, &xprt->sc_flags);

	/*
	 * If this transport is not already on the DTO transport queue,
	 * add it
	 */
	spin_lock_irqsave(&dto_lock, flags);
503 504
	if (list_empty(&xprt->sc_dto_q)) {
		svc_xprt_get(&xprt->sc_xprt);
505
		list_add_tail(&xprt->sc_dto_q, &dto_xprt_q);
506
	}
507 508 509 510 511 512 513 514 515 516 517 518 519
	spin_unlock_irqrestore(&dto_lock, flags);

	/* Tasklet does all the work to avoid irqsave locks. */
	tasklet_schedule(&dto_tasklet);
}

static struct svcxprt_rdma *rdma_create_xprt(struct svc_serv *serv,
					     int listener)
{
	struct svcxprt_rdma *cma_xprt = kzalloc(sizeof *cma_xprt, GFP_KERNEL);

	if (!cma_xprt)
		return NULL;
520
	svc_xprt_init(&init_net, &svc_rdma_class, &cma_xprt->sc_xprt, serv);
521 522 523 524
	INIT_LIST_HEAD(&cma_xprt->sc_accept_q);
	INIT_LIST_HEAD(&cma_xprt->sc_dto_q);
	INIT_LIST_HEAD(&cma_xprt->sc_rq_dto_q);
	INIT_LIST_HEAD(&cma_xprt->sc_read_complete_q);
T
Tom Tucker 已提交
525
	INIT_LIST_HEAD(&cma_xprt->sc_frmr_q);
526 527 528 529
	init_waitqueue_head(&cma_xprt->sc_send_wait);

	spin_lock_init(&cma_xprt->sc_lock);
	spin_lock_init(&cma_xprt->sc_rq_dto_lock);
T
Tom Tucker 已提交
530
	spin_lock_init(&cma_xprt->sc_frmr_q_lock);
531 532 533 534 535 536 537

	cma_xprt->sc_ord = svcrdma_ord;

	cma_xprt->sc_max_req_size = svcrdma_max_req_size;
	cma_xprt->sc_max_requests = svcrdma_max_requests;
	cma_xprt->sc_sq_depth = svcrdma_max_requests * RPCRDMA_SQ_DEPTH_MULT;
	atomic_set(&cma_xprt->sc_sq_count, 0);
538
	atomic_set(&cma_xprt->sc_ctxt_used, 0);
539

540
	if (listener)
541 542 543 544 545 546 547 548 549 550
		set_bit(XPT_LISTENER, &cma_xprt->sc_xprt.xpt_flags);

	return cma_xprt;
}

int svc_rdma_post_recv(struct svcxprt_rdma *xprt)
{
	struct ib_recv_wr recv_wr, *bad_recv_wr;
	struct svc_rdma_op_ctxt *ctxt;
	struct page *page;
551
	dma_addr_t pa;
552 553 554 555 556 557 558 559
	int sge_no;
	int buflen;
	int ret;

	ctxt = svc_rdma_get_context(xprt);
	buflen = 0;
	ctxt->direction = DMA_FROM_DEVICE;
	for (sge_no = 0; buflen < xprt->sc_max_req_size; sge_no++) {
560 561 562 563
		if (sge_no >= xprt->sc_max_sge) {
			pr_err("svcrdma: Too many sges (%d)\n", sge_no);
			goto err_put_ctxt;
		}
564
		page = alloc_page(GFP_KERNEL | __GFP_NOFAIL);
565
		ctxt->pages[sge_no] = page;
566 567
		pa = ib_dma_map_page(xprt->sc_cm_id->device,
				     page, 0, PAGE_SIZE,
568
				     DMA_FROM_DEVICE);
569 570 571
		if (ib_dma_mapping_error(xprt->sc_cm_id->device, pa))
			goto err_put_ctxt;
		atomic_inc(&xprt->sc_dma_used);
572 573
		ctxt->sge[sge_no].addr = pa;
		ctxt->sge[sge_no].length = PAGE_SIZE;
574
		ctxt->sge[sge_no].lkey = xprt->sc_dma_lkey;
575
		ctxt->count = sge_no + 1;
576 577 578 579 580 581 582
		buflen += PAGE_SIZE;
	}
	recv_wr.next = NULL;
	recv_wr.sg_list = &ctxt->sge[0];
	recv_wr.num_sge = ctxt->count;
	recv_wr.wr_id = (u64)(unsigned long)ctxt;

583
	svc_xprt_get(&xprt->sc_xprt);
584
	ret = ib_post_recv(xprt->sc_qp, &recv_wr, &bad_recv_wr);
585
	if (ret) {
S
Steve Wise 已提交
586
		svc_rdma_unmap_dma(ctxt);
587
		svc_rdma_put_context(ctxt, 1);
S
Steve Wise 已提交
588
		svc_xprt_put(&xprt->sc_xprt);
589
	}
590
	return ret;
591 592

 err_put_ctxt:
593
	svc_rdma_unmap_dma(ctxt);
594 595
	svc_rdma_put_context(ctxt, 1);
	return -ENOMEM;
596 597 598 599 600 601 602 603 604 605 606 607 608
}

/*
 * This function handles the CONNECT_REQUEST event on a listening
 * endpoint. It is passed the cma_id for the _new_ connection. The context in
 * this cma_id is inherited from the listening cma_id and is the svc_xprt
 * structure for the listening endpoint.
 *
 * This function creates a new xprt for the new connection and enqueues it on
 * the accept queue for the listent xprt. When the listen thread is kicked, it
 * will call the recvfrom method on the listen xprt which will accept the new
 * connection.
 */
609
static void handle_connect_req(struct rdma_cm_id *new_cma_id, size_t client_ird)
610 611 612
{
	struct svcxprt_rdma *listen_xprt = new_cma_id->context;
	struct svcxprt_rdma *newxprt;
613
	struct sockaddr *sa;
614 615 616 617 618 619 620 621 622 623 624 625

	/* Create a new transport */
	newxprt = rdma_create_xprt(listen_xprt->sc_xprt.xpt_server, 0);
	if (!newxprt) {
		dprintk("svcrdma: failed to create new transport\n");
		return;
	}
	newxprt->sc_cm_id = new_cma_id;
	new_cma_id->context = newxprt;
	dprintk("svcrdma: Creating newxprt=%p, cm_id=%p, listenxprt=%p\n",
		newxprt, newxprt->sc_cm_id, listen_xprt);

626 627 628
	/* Save client advertised inbound read limit for use later in accept. */
	newxprt->sc_ord = client_ird;

629 630 631 632 633 634
	/* Set the local and remote addresses in the transport */
	sa = (struct sockaddr *)&newxprt->sc_cm_id->route.addr.dst_addr;
	svc_xprt_set_remote(&newxprt->sc_xprt, sa, svc_addr_len(sa));
	sa = (struct sockaddr *)&newxprt->sc_cm_id->route.addr.src_addr;
	svc_xprt_set_local(&newxprt->sc_xprt, sa, svc_addr_len(sa));

635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659
	/*
	 * Enqueue the new transport on the accept queue of the listening
	 * transport
	 */
	spin_lock_bh(&listen_xprt->sc_lock);
	list_add_tail(&newxprt->sc_accept_q, &listen_xprt->sc_accept_q);
	spin_unlock_bh(&listen_xprt->sc_lock);

	set_bit(XPT_CONN, &listen_xprt->sc_xprt.xpt_flags);
	svc_xprt_enqueue(&listen_xprt->sc_xprt);
}

/*
 * Handles events generated on the listening endpoint. These events will be
 * either be incoming connect requests or adapter removal  events.
 */
static int rdma_listen_handler(struct rdma_cm_id *cma_id,
			       struct rdma_cm_event *event)
{
	struct svcxprt_rdma *xprt = cma_id->context;
	int ret = 0;

	switch (event->event) {
	case RDMA_CM_EVENT_CONNECT_REQUEST:
		dprintk("svcrdma: Connect request on cma_id=%p, xprt = %p, "
660 661
			"event = %s (%d)\n", cma_id, cma_id->context,
			rdma_event_msg(event->event), event->event);
662
		handle_connect_req(cma_id,
T
Tom Tucker 已提交
663
				   event->param.conn.initiator_depth);
664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680
		break;

	case RDMA_CM_EVENT_ESTABLISHED:
		/* Accept complete */
		dprintk("svcrdma: Connection completed on LISTEN xprt=%p, "
			"cm_id=%p\n", xprt, cma_id);
		break;

	case RDMA_CM_EVENT_DEVICE_REMOVAL:
		dprintk("svcrdma: Device removal xprt=%p, cm_id=%p\n",
			xprt, cma_id);
		if (xprt)
			set_bit(XPT_CLOSE, &xprt->sc_xprt.xpt_flags);
		break;

	default:
		dprintk("svcrdma: Unexpected event on listening endpoint %p, "
681 682
			"event = %s (%d)\n", cma_id,
			rdma_event_msg(event->event), event->event);
683 684 685 686 687 688 689 690 691 692 693 694 695 696 697
		break;
	}

	return ret;
}

static int rdma_cma_handler(struct rdma_cm_id *cma_id,
			    struct rdma_cm_event *event)
{
	struct svc_xprt *xprt = cma_id->context;
	struct svcxprt_rdma *rdma =
		container_of(xprt, struct svcxprt_rdma, sc_xprt);
	switch (event->event) {
	case RDMA_CM_EVENT_ESTABLISHED:
		/* Accept complete */
698
		svc_xprt_get(xprt);
699 700 701 702 703 704 705 706 707 708 709
		dprintk("svcrdma: Connection completed on DTO xprt=%p, "
			"cm_id=%p\n", xprt, cma_id);
		clear_bit(RDMAXPRT_CONN_PENDING, &rdma->sc_flags);
		svc_xprt_enqueue(xprt);
		break;
	case RDMA_CM_EVENT_DISCONNECTED:
		dprintk("svcrdma: Disconnect on DTO xprt=%p, cm_id=%p\n",
			xprt, cma_id);
		if (xprt) {
			set_bit(XPT_CLOSE, &xprt->xpt_flags);
			svc_xprt_enqueue(xprt);
710
			svc_xprt_put(xprt);
711 712 713 714
		}
		break;
	case RDMA_CM_EVENT_DEVICE_REMOVAL:
		dprintk("svcrdma: Device removal cma_id=%p, xprt = %p, "
715 716
			"event = %s (%d)\n", cma_id, xprt,
			rdma_event_msg(event->event), event->event);
717 718 719
		if (xprt) {
			set_bit(XPT_CLOSE, &xprt->xpt_flags);
			svc_xprt_enqueue(xprt);
720
			svc_xprt_put(xprt);
721 722 723 724
		}
		break;
	default:
		dprintk("svcrdma: Unexpected event on DTO endpoint %p, "
725 726
			"event = %s (%d)\n", cma_id,
			rdma_event_msg(event->event), event->event);
727 728 729 730 731 732 733 734 735
		break;
	}
	return 0;
}

/*
 * Create a listening RDMA service endpoint.
 */
static struct svc_xprt *svc_rdma_create(struct svc_serv *serv,
736
					struct net *net,
737 738 739 740 741 742 743 744
					struct sockaddr *sa, int salen,
					int flags)
{
	struct rdma_cm_id *listen_id;
	struct svcxprt_rdma *cma_xprt;
	int ret;

	dprintk("svcrdma: Creating RDMA socket\n");
745 746 747 748
	if (sa->sa_family != AF_INET) {
		dprintk("svcrdma: Address family %d is not supported.\n", sa->sa_family);
		return ERR_PTR(-EAFNOSUPPORT);
	}
749 750
	cma_xprt = rdma_create_xprt(serv, 1);
	if (!cma_xprt)
751
		return ERR_PTR(-ENOMEM);
752

753 754
	listen_id = rdma_create_id(&init_net, rdma_listen_handler, cma_xprt,
				   RDMA_PS_TCP, IB_QPT_RC);
755
	if (IS_ERR(listen_id)) {
756 757 758
		ret = PTR_ERR(listen_id);
		dprintk("svcrdma: rdma_create_id failed = %d\n", ret);
		goto err0;
759
	}
760

761 762 763
	ret = rdma_bind_addr(listen_id, sa);
	if (ret) {
		dprintk("svcrdma: rdma_bind_addr failed = %d\n", ret);
764
		goto err1;
765 766 767 768 769 770
	}
	cma_xprt->sc_cm_id = listen_id;

	ret = rdma_listen(listen_id, RPCRDMA_LISTEN_BACKLOG);
	if (ret) {
		dprintk("svcrdma: rdma_listen failed = %d\n", ret);
771
		goto err1;
772 773 774 775 776 777 778 779 780 781
	}

	/*
	 * We need to use the address from the cm_id in case the
	 * caller specified 0 for the port number.
	 */
	sa = (struct sockaddr *)&cma_xprt->sc_cm_id->route.addr.src_addr;
	svc_xprt_set_local(&cma_xprt->sc_xprt, sa, salen);

	return &cma_xprt->sc_xprt;
782 783 784 785 786 787

 err1:
	rdma_destroy_id(listen_id);
 err0:
	kfree(cma_xprt);
	return ERR_PTR(ret);
788 789
}

T
Tom Tucker 已提交
790 791 792
static struct svc_rdma_fastreg_mr *rdma_alloc_frmr(struct svcxprt_rdma *xprt)
{
	struct ib_mr *mr;
793
	struct scatterlist *sg;
T
Tom Tucker 已提交
794
	struct svc_rdma_fastreg_mr *frmr;
795
	u32 num_sg;
T
Tom Tucker 已提交
796 797 798 799 800

	frmr = kmalloc(sizeof(*frmr), GFP_KERNEL);
	if (!frmr)
		goto err;

801 802
	num_sg = min_t(u32, RPCSVC_MAXPAGES, xprt->sc_frmr_pg_list_len);
	mr = ib_alloc_mr(xprt->sc_pd, IB_MR_TYPE_MEM_REG, num_sg);
803
	if (IS_ERR(mr))
T
Tom Tucker 已提交
804 805
		goto err_free_frmr;

806 807
	sg = kcalloc(RPCSVC_MAXPAGES, sizeof(*sg), GFP_KERNEL);
	if (!sg)
T
Tom Tucker 已提交
808 809
		goto err_free_mr;

810 811
	sg_init_table(sg, RPCSVC_MAXPAGES);

T
Tom Tucker 已提交
812
	frmr->mr = mr;
813
	frmr->sg = sg;
T
Tom Tucker 已提交
814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832
	INIT_LIST_HEAD(&frmr->frmr_list);
	return frmr;

 err_free_mr:
	ib_dereg_mr(mr);
 err_free_frmr:
	kfree(frmr);
 err:
	return ERR_PTR(-ENOMEM);
}

static void rdma_dealloc_frmr_q(struct svcxprt_rdma *xprt)
{
	struct svc_rdma_fastreg_mr *frmr;

	while (!list_empty(&xprt->sc_frmr_q)) {
		frmr = list_entry(xprt->sc_frmr_q.next,
				  struct svc_rdma_fastreg_mr, frmr_list);
		list_del_init(&frmr->frmr_list);
833
		kfree(frmr->sg);
T
Tom Tucker 已提交
834 835 836 837 838 839 840 841 842 843 844 845 846 847
		ib_dereg_mr(frmr->mr);
		kfree(frmr);
	}
}

struct svc_rdma_fastreg_mr *svc_rdma_get_frmr(struct svcxprt_rdma *rdma)
{
	struct svc_rdma_fastreg_mr *frmr = NULL;

	spin_lock_bh(&rdma->sc_frmr_q_lock);
	if (!list_empty(&rdma->sc_frmr_q)) {
		frmr = list_entry(rdma->sc_frmr_q.next,
				  struct svc_rdma_fastreg_mr, frmr_list);
		list_del_init(&frmr->frmr_list);
848
		frmr->sg_nents = 0;
T
Tom Tucker 已提交
849 850 851 852 853 854 855 856 857 858 859 860
	}
	spin_unlock_bh(&rdma->sc_frmr_q_lock);
	if (frmr)
		return frmr;

	return rdma_alloc_frmr(rdma);
}

void svc_rdma_put_frmr(struct svcxprt_rdma *rdma,
		       struct svc_rdma_fastreg_mr *frmr)
{
	if (frmr) {
861 862 863
		ib_dma_unmap_sg(rdma->sc_cm_id->device,
				frmr->sg, frmr->sg_nents, frmr->direction);
		atomic_dec(&rdma->sc_dma_used);
T
Tom Tucker 已提交
864
		spin_lock_bh(&rdma->sc_frmr_q_lock);
865
		WARN_ON_ONCE(!list_empty(&frmr->frmr_list));
T
Tom Tucker 已提交
866 867 868 869 870
		list_add(&frmr->frmr_list, &rdma->sc_frmr_q);
		spin_unlock_bh(&rdma->sc_frmr_q_lock);
	}
}

871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886
/*
 * This is the xpo_recvfrom function for listening endpoints. Its
 * purpose is to accept incoming connections. The CMA callback handler
 * has already created a new transport and attached it to the new CMA
 * ID.
 *
 * There is a queue of pending connections hung on the listening
 * transport. This queue contains the new svc_xprt structure. This
 * function takes svc_xprt structures off the accept_q and completes
 * the connection.
 */
static struct svc_xprt *svc_rdma_accept(struct svc_xprt *xprt)
{
	struct svcxprt_rdma *listen_rdma;
	struct svcxprt_rdma *newxprt = NULL;
	struct rdma_conn_param conn_param;
887
	struct ib_cq_init_attr cq_attr = {};
888
	struct ib_qp_init_attr qp_attr;
889
	struct ib_device *dev;
890
	int uninitialized_var(dma_mr_acc);
M
Michael Wang 已提交
891
	int need_dma_mr = 0;
892
	int ret = 0;
893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912
	int i;

	listen_rdma = container_of(xprt, struct svcxprt_rdma, sc_xprt);
	clear_bit(XPT_CONN, &xprt->xpt_flags);
	/* Get the next entry off the accept list */
	spin_lock_bh(&listen_rdma->sc_lock);
	if (!list_empty(&listen_rdma->sc_accept_q)) {
		newxprt = list_entry(listen_rdma->sc_accept_q.next,
				     struct svcxprt_rdma, sc_accept_q);
		list_del_init(&newxprt->sc_accept_q);
	}
	if (!list_empty(&listen_rdma->sc_accept_q))
		set_bit(XPT_CONN, &listen_rdma->sc_xprt.xpt_flags);
	spin_unlock_bh(&listen_rdma->sc_lock);
	if (!newxprt)
		return NULL;

	dprintk("svcrdma: newxprt from accept queue = %p, cm_id=%p\n",
		newxprt, newxprt->sc_cm_id);

913
	dev = newxprt->sc_cm_id->device;
914 915 916

	/* Qualify the transport resource defaults with the
	 * capabilities of this particular device */
917
	newxprt->sc_max_sge = min((size_t)dev->attrs.max_sge,
918
				  (size_t)RPCSVC_MAXPAGES);
919
	newxprt->sc_max_sge_rd = min_t(size_t, dev->attrs.max_sge_rd,
920
				       RPCSVC_MAXPAGES);
921
	newxprt->sc_max_requests = min((size_t)dev->attrs.max_qp_wr,
922 923 924
				   (size_t)svcrdma_max_requests);
	newxprt->sc_sq_depth = RPCRDMA_SQ_DEPTH_MULT * newxprt->sc_max_requests;

925 926 927 928
	/*
	 * Limit ORD based on client limit, local device limit, and
	 * configured svcrdma limit.
	 */
929
	newxprt->sc_ord = min_t(size_t, dev->attrs.max_qp_rd_atom, newxprt->sc_ord);
930
	newxprt->sc_ord = min_t(size_t,	svcrdma_ord, newxprt->sc_ord);
931

932
	newxprt->sc_pd = ib_alloc_pd(dev);
933 934 935 936
	if (IS_ERR(newxprt->sc_pd)) {
		dprintk("svcrdma: error creating PD for connect request\n");
		goto errout;
	}
937
	cq_attr.cqe = newxprt->sc_sq_depth;
938
	newxprt->sc_sq_cq = ib_create_cq(dev,
939 940 941
					 sq_comp_handler,
					 cq_event_handler,
					 newxprt,
942
					 &cq_attr);
943 944 945 946
	if (IS_ERR(newxprt->sc_sq_cq)) {
		dprintk("svcrdma: error creating SQ CQ for connect request\n");
		goto errout;
	}
947
	cq_attr.cqe = newxprt->sc_max_requests;
948
	newxprt->sc_rq_cq = ib_create_cq(dev,
949 950 951
					 rq_comp_handler,
					 cq_event_handler,
					 newxprt,
952
					 &cq_attr);
953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975
	if (IS_ERR(newxprt->sc_rq_cq)) {
		dprintk("svcrdma: error creating RQ CQ for connect request\n");
		goto errout;
	}

	memset(&qp_attr, 0, sizeof qp_attr);
	qp_attr.event_handler = qp_event_handler;
	qp_attr.qp_context = &newxprt->sc_xprt;
	qp_attr.cap.max_send_wr = newxprt->sc_sq_depth;
	qp_attr.cap.max_recv_wr = newxprt->sc_max_requests;
	qp_attr.cap.max_send_sge = newxprt->sc_max_sge;
	qp_attr.cap.max_recv_sge = newxprt->sc_max_sge;
	qp_attr.sq_sig_type = IB_SIGNAL_REQ_WR;
	qp_attr.qp_type = IB_QPT_RC;
	qp_attr.send_cq = newxprt->sc_sq_cq;
	qp_attr.recv_cq = newxprt->sc_rq_cq;
	dprintk("svcrdma: newxprt->sc_cm_id=%p, newxprt->sc_pd=%p\n"
		"    cm_id->device=%p, sc_pd->device=%p\n"
		"    cap.max_send_wr = %d\n"
		"    cap.max_recv_wr = %d\n"
		"    cap.max_send_sge = %d\n"
		"    cap.max_recv_sge = %d\n",
		newxprt->sc_cm_id, newxprt->sc_pd,
976
		dev, newxprt->sc_pd->device,
977 978 979 980 981 982 983
		qp_attr.cap.max_send_wr,
		qp_attr.cap.max_recv_wr,
		qp_attr.cap.max_send_sge,
		qp_attr.cap.max_recv_sge);

	ret = rdma_create_qp(newxprt->sc_cm_id, newxprt->sc_pd, &qp_attr);
	if (ret) {
984 985
		dprintk("svcrdma: failed to create QP, ret=%d\n", ret);
		goto errout;
986 987 988
	}
	newxprt->sc_qp = newxprt->sc_cm_id->qp;

989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010
	/*
	 * Use the most secure set of MR resources based on the
	 * transport type and available memory management features in
	 * the device. Here's the table implemented below:
	 *
	 *		Fast	Global	DMA	Remote WR
	 *		Reg	LKEY	MR	Access
	 *		Sup'd	Sup'd	Needed	Needed
	 *
	 * IWARP	N	N	Y	Y
	 *		N	Y	Y	Y
	 *		Y	N	Y	N
	 *		Y	Y	N	-
	 *
	 * IB		N	N	Y	N
	 *		N	Y	N	-
	 *		Y	N	Y	N
	 *		Y	Y	N	-
	 *
	 * NB:	iWARP requires remote write access for the data sink
	 *	of an RDMA_READ. IB does not.
	 */
1011
	newxprt->sc_reader = rdma_read_chunk_lcl;
1012
	if (dev->attrs.device_cap_flags & IB_DEVICE_MEM_MGT_EXTENSIONS) {
1013
		newxprt->sc_frmr_pg_list_len =
1014
			dev->attrs.max_fast_reg_page_list_len;
1015
		newxprt->sc_dev_caps |= SVCRDMA_DEVCAP_FAST_REG;
1016
		newxprt->sc_reader = rdma_read_chunk_frmr;
1017 1018 1019 1020 1021
	}

	/*
	 * Determine if a DMA MR is required and if so, what privs are required
	 */
1022 1023
	if (!rdma_protocol_iwarp(dev, newxprt->sc_cm_id->port_num) &&
	    !rdma_ib_or_roce(dev, newxprt->sc_cm_id->port_num))
1024
		goto errout;
M
Michael Wang 已提交
1025 1026

	if (!(newxprt->sc_dev_caps & SVCRDMA_DEVCAP_FAST_REG) ||
1027
	    !(dev->attrs.device_cap_flags & IB_DEVICE_LOCAL_DMA_LKEY)) {
M
Michael Wang 已提交
1028 1029
		need_dma_mr = 1;
		dma_mr_acc = IB_ACCESS_LOCAL_WRITE;
1030
		if (rdma_protocol_iwarp(dev, newxprt->sc_cm_id->port_num) &&
M
Michael Wang 已提交
1031 1032
		    !(newxprt->sc_dev_caps & SVCRDMA_DEVCAP_FAST_REG))
			dma_mr_acc |= IB_ACCESS_REMOTE_WRITE;
1033 1034
	}

1035
	if (rdma_protocol_iwarp(dev, newxprt->sc_cm_id->port_num))
M
Michael Wang 已提交
1036 1037
		newxprt->sc_dev_caps |= SVCRDMA_DEVCAP_READ_W_INV;

1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049
	/* Create the DMA MR if needed, otherwise, use the DMA LKEY */
	if (need_dma_mr) {
		/* Register all of physical memory */
		newxprt->sc_phys_mr =
			ib_get_dma_mr(newxprt->sc_pd, dma_mr_acc);
		if (IS_ERR(newxprt->sc_phys_mr)) {
			dprintk("svcrdma: Failed to create DMA MR ret=%d\n",
				ret);
			goto errout;
		}
		newxprt->sc_dma_lkey = newxprt->sc_phys_mr->lkey;
	} else
1050
		newxprt->sc_dma_lkey = dev->local_dma_lkey;
1051

1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063
	/* Post receive buffers */
	for (i = 0; i < newxprt->sc_max_requests; i++) {
		ret = svc_rdma_post_recv(newxprt);
		if (ret) {
			dprintk("svcrdma: failure posting receive buffers\n");
			goto errout;
		}
	}

	/* Swap out the handler */
	newxprt->sc_cm_id->event_handler = rdma_cma_handler;

1064 1065 1066 1067 1068 1069 1070
	/*
	 * Arm the CQs for the SQ and RQ before accepting so we can't
	 * miss the first message
	 */
	ib_req_notify_cq(newxprt->sc_sq_cq, IB_CQ_NEXT_COMP);
	ib_req_notify_cq(newxprt->sc_rq_cq, IB_CQ_NEXT_COMP);

1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084
	/* Accept Connection */
	set_bit(RDMAXPRT_CONN_PENDING, &newxprt->sc_flags);
	memset(&conn_param, 0, sizeof conn_param);
	conn_param.responder_resources = 0;
	conn_param.initiator_depth = newxprt->sc_ord;
	ret = rdma_accept(newxprt->sc_cm_id, &conn_param);
	if (ret) {
		dprintk("svcrdma: failed to accept new connection, ret=%d\n",
		       ret);
		goto errout;
	}

	dprintk("svcrdma: new connection %p accepted with the following "
		"attributes:\n"
H
Harvey Harrison 已提交
1085
		"    local_ip        : %pI4\n"
1086
		"    local_port	     : %d\n"
H
Harvey Harrison 已提交
1087
		"    remote_ip       : %pI4\n"
1088 1089
		"    remote_port     : %d\n"
		"    max_sge         : %d\n"
1090
		"    max_sge_rd      : %d\n"
1091 1092 1093 1094
		"    sq_depth        : %d\n"
		"    max_requests    : %d\n"
		"    ord             : %d\n",
		newxprt,
H
Harvey Harrison 已提交
1095 1096
		&((struct sockaddr_in *)&newxprt->sc_cm_id->
			 route.addr.src_addr)->sin_addr.s_addr,
1097 1098
		ntohs(((struct sockaddr_in *)&newxprt->sc_cm_id->
		       route.addr.src_addr)->sin_port),
H
Harvey Harrison 已提交
1099 1100
		&((struct sockaddr_in *)&newxprt->sc_cm_id->
			 route.addr.dst_addr)->sin_addr.s_addr,
1101 1102 1103
		ntohs(((struct sockaddr_in *)&newxprt->sc_cm_id->
		       route.addr.dst_addr)->sin_port),
		newxprt->sc_max_sge,
1104
		newxprt->sc_max_sge_rd,
1105 1106 1107 1108 1109 1110 1111 1112
		newxprt->sc_sq_depth,
		newxprt->sc_max_requests,
		newxprt->sc_ord);

	return &newxprt->sc_xprt;

 errout:
	dprintk("svcrdma: failure accepting new connection rc=%d.\n", ret);
1113 1114
	/* Take a reference in case the DTO handler runs */
	svc_xprt_get(&newxprt->sc_xprt);
1115
	if (newxprt->sc_qp && !IS_ERR(newxprt->sc_qp))
1116
		ib_destroy_qp(newxprt->sc_qp);
1117
	rdma_destroy_id(newxprt->sc_cm_id);
1118 1119
	/* This call to put will destroy the transport */
	svc_xprt_put(&newxprt->sc_xprt);
1120 1121 1122 1123 1124 1125 1126
	return NULL;
}

static void svc_rdma_release_rqst(struct svc_rqst *rqstp)
{
}

1127
/*
1128
 * When connected, an svc_xprt has at least two references:
1129 1130 1131 1132 1133 1134 1135 1136
 *
 * - A reference held by the cm_id between the ESTABLISHED and
 *   DISCONNECTED events. If the remote peer disconnected first, this
 *   reference could be gone.
 *
 * - A reference held by the svc_recv code that called this function
 *   as part of close processing.
 *
1137
 * At a minimum one references should still be held.
1138
 */
1139 1140 1141 1142 1143
static void svc_rdma_detach(struct svc_xprt *xprt)
{
	struct svcxprt_rdma *rdma =
		container_of(xprt, struct svcxprt_rdma, sc_xprt);
	dprintk("svc: svc_rdma_detach(%p)\n", xprt);
1144 1145

	/* Disconnect and flush posted WQE */
1146 1147 1148
	rdma_disconnect(rdma->sc_cm_id);
}

1149
static void __svc_rdma_free(struct work_struct *work)
1150
{
1151 1152
	struct svcxprt_rdma *rdma =
		container_of(work, struct svcxprt_rdma, sc_work);
1153
	dprintk("svcrdma: svc_rdma_free(%p)\n", rdma);
1154

1155
	/* We should only be called from kref_put */
1156 1157 1158
	if (atomic_read(&rdma->sc_xprt.xpt_ref.refcount) != 0)
		pr_err("svcrdma: sc_xprt still in use? (%d)\n",
		       atomic_read(&rdma->sc_xprt.xpt_ref.refcount));
1159

1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185
	/*
	 * Destroy queued, but not processed read completions. Note
	 * that this cleanup has to be done before destroying the
	 * cm_id because the device ptr is needed to unmap the dma in
	 * svc_rdma_put_context.
	 */
	while (!list_empty(&rdma->sc_read_complete_q)) {
		struct svc_rdma_op_ctxt *ctxt;
		ctxt = list_entry(rdma->sc_read_complete_q.next,
				  struct svc_rdma_op_ctxt,
				  dto_q);
		list_del_init(&ctxt->dto_q);
		svc_rdma_put_context(ctxt, 1);
	}

	/* Destroy queued, but not processed recv completions */
	while (!list_empty(&rdma->sc_rq_dto_q)) {
		struct svc_rdma_op_ctxt *ctxt;
		ctxt = list_entry(rdma->sc_rq_dto_q.next,
				  struct svc_rdma_op_ctxt,
				  dto_q);
		list_del_init(&ctxt->dto_q);
		svc_rdma_put_context(ctxt, 1);
	}

	/* Warn if we leaked a resource or under-referenced */
1186 1187 1188 1189 1190 1191
	if (atomic_read(&rdma->sc_ctxt_used) != 0)
		pr_err("svcrdma: ctxt still in use? (%d)\n",
		       atomic_read(&rdma->sc_ctxt_used));
	if (atomic_read(&rdma->sc_dma_used) != 0)
		pr_err("svcrdma: dma still in use? (%d)\n",
		       atomic_read(&rdma->sc_dma_used));
1192

T
Tom Tucker 已提交
1193 1194 1195
	/* De-allocate fastreg mr */
	rdma_dealloc_frmr_q(rdma);

1196 1197 1198 1199
	/* Destroy the QP if present (not a listener) */
	if (rdma->sc_qp && !IS_ERR(rdma->sc_qp))
		ib_destroy_qp(rdma->sc_qp);

1200 1201
	if (rdma->sc_sq_cq && !IS_ERR(rdma->sc_sq_cq))
		ib_destroy_cq(rdma->sc_sq_cq);
1202

1203 1204
	if (rdma->sc_rq_cq && !IS_ERR(rdma->sc_rq_cq))
		ib_destroy_cq(rdma->sc_rq_cq);
1205

1206 1207
	if (rdma->sc_phys_mr && !IS_ERR(rdma->sc_phys_mr))
		ib_dereg_mr(rdma->sc_phys_mr);
1208

1209 1210
	if (rdma->sc_pd && !IS_ERR(rdma->sc_pd))
		ib_dealloc_pd(rdma->sc_pd);
1211

1212 1213 1214
	/* Destroy the CM ID */
	rdma_destroy_id(rdma->sc_cm_id);

1215
	kfree(rdma);
1216 1217
}

1218 1219 1220 1221 1222
static void svc_rdma_free(struct svc_xprt *xprt)
{
	struct svcxprt_rdma *rdma =
		container_of(xprt, struct svcxprt_rdma, sc_xprt);
	INIT_WORK(&rdma->sc_work, __svc_rdma_free);
1223
	queue_work(svc_rdma_wq, &rdma->sc_work);
1224 1225
}

1226 1227 1228 1229 1230 1231
static int svc_rdma_has_wspace(struct svc_xprt *xprt)
{
	struct svcxprt_rdma *rdma =
		container_of(xprt, struct svcxprt_rdma, sc_xprt);

	/*
S
Steve Wise 已提交
1232
	 * If there are already waiters on the SQ,
1233 1234 1235 1236 1237 1238 1239 1240 1241
	 * return false.
	 */
	if (waitqueue_active(&rdma->sc_send_wait))
		return 0;

	/* Otherwise return true. */
	return 1;
}

1242 1243 1244 1245 1246
static int svc_rdma_secure_port(struct svc_rqst *rqstp)
{
	return 1;
}

1247 1248
int svc_rdma_send(struct svcxprt_rdma *xprt, struct ib_send_wr *wr)
{
1249 1250 1251
	struct ib_send_wr *bad_wr, *n_wr;
	int wr_count;
	int i;
1252 1253 1254
	int ret;

	if (test_bit(XPT_CLOSE, &xprt->sc_xprt.xpt_flags))
1255
		return -ENOTCONN;
1256

1257 1258 1259 1260
	wr_count = 1;
	for (n_wr = wr->next; n_wr; n_wr = n_wr->next)
		wr_count++;

1261 1262 1263
	/* If the SQ is full, wait until an SQ entry is available */
	while (1) {
		spin_lock_bh(&xprt->sc_lock);
1264
		if (xprt->sc_sq_depth < atomic_read(&xprt->sc_sq_count) + wr_count) {
1265 1266
			spin_unlock_bh(&xprt->sc_lock);
			atomic_inc(&rdma_stat_sq_starve);
1267 1268

			/* See if we can opportunistically reap SQ WR to make room */
1269 1270 1271 1272 1273 1274
			sq_cq_reap(xprt);

			/* Wait until SQ WR available if SQ still full */
			wait_event(xprt->sc_send_wait,
				   atomic_read(&xprt->sc_sq_count) <
				   xprt->sc_sq_depth);
1275
			if (test_bit(XPT_CLOSE, &xprt->sc_xprt.xpt_flags))
1276
				return -ENOTCONN;
1277 1278
			continue;
		}
1279 1280 1281 1282 1283 1284
		/* Take a transport ref for each WR posted */
		for (i = 0; i < wr_count; i++)
			svc_xprt_get(&xprt->sc_xprt);

		/* Bump used SQ WR count and post */
		atomic_add(wr_count, &xprt->sc_sq_count);
1285
		ret = ib_post_send(xprt->sc_qp, wr, &bad_wr);
1286 1287 1288 1289 1290
		if (ret) {
			set_bit(XPT_CLOSE, &xprt->sc_xprt.xpt_flags);
			atomic_sub(wr_count, &xprt->sc_sq_count);
			for (i = 0; i < wr_count; i ++)
				svc_xprt_put(&xprt->sc_xprt);
1291 1292 1293 1294
			dprintk("svcrdma: failed to post SQ WR rc=%d, "
			       "sc_sq_count=%d, sc_sq_depth=%d\n",
			       ret, atomic_read(&xprt->sc_sq_count),
			       xprt->sc_sq_depth);
1295
		}
1296
		spin_unlock_bh(&xprt->sc_lock);
1297 1298
		if (ret)
			wake_up(&xprt->sc_send_wait);
1299 1300 1301 1302 1303
		break;
	}
	return ret;
}

1304 1305
void svc_rdma_send_error(struct svcxprt_rdma *xprt, struct rpcrdma_msg *rmsgp,
			 enum rpcrdma_errcode err)
1306 1307 1308 1309
{
	struct ib_send_wr err_wr;
	struct page *p;
	struct svc_rdma_op_ctxt *ctxt;
1310
	__be32 *va;
1311 1312 1313
	int length;
	int ret;

1314
	p = alloc_page(GFP_KERNEL | __GFP_NOFAIL);
1315 1316 1317 1318 1319
	va = page_address(p);

	/* XDR encode error */
	length = svc_rdma_xdr_encode_error(xprt, rmsgp, err, va);

1320 1321 1322 1323 1324
	ctxt = svc_rdma_get_context(xprt);
	ctxt->direction = DMA_FROM_DEVICE;
	ctxt->count = 1;
	ctxt->pages[0] = p;

1325
	/* Prepare SGE for local address */
1326 1327 1328
	ctxt->sge[0].addr = ib_dma_map_page(xprt->sc_cm_id->device,
					    p, 0, length, DMA_FROM_DEVICE);
	if (ib_dma_mapping_error(xprt->sc_cm_id->device, ctxt->sge[0].addr)) {
1329
		put_page(p);
1330
		svc_rdma_put_context(ctxt, 1);
1331 1332 1333
		return;
	}
	atomic_inc(&xprt->sc_dma_used);
1334 1335
	ctxt->sge[0].lkey = xprt->sc_dma_lkey;
	ctxt->sge[0].length = length;
1336 1337 1338 1339 1340

	/* Prepare SEND WR */
	memset(&err_wr, 0, sizeof err_wr);
	ctxt->wr_op = IB_WR_SEND;
	err_wr.wr_id = (unsigned long)ctxt;
1341
	err_wr.sg_list = ctxt->sge;
1342 1343 1344 1345 1346 1347 1348
	err_wr.num_sge = 1;
	err_wr.opcode = IB_WR_SEND;
	err_wr.send_flags = IB_SEND_SIGNALED;

	/* Post It */
	ret = svc_rdma_send(xprt, &err_wr);
	if (ret) {
1349 1350
		dprintk("svcrdma: Error %d posting send for protocol error\n",
			ret);
1351
		svc_rdma_unmap_dma(ctxt);
1352 1353 1354
		svc_rdma_put_context(ctxt, 1);
	}
}