1 /*
   2  * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
   3  */
   4 
   5 /*
   6  * This file contains code imported from the OFED rds source file ib_recv.c
   7  * Oracle elects to have and use the contents of ib_recv.c under and governed
   8  * by the OpenIB.org BSD license (see below for full license text). However,
   9  * the following notice accompanied the original version of this file:
  10  */
  11 
  12 /*
  13  * Copyright (c) 2006 Oracle.  All rights reserved.
  14  *
  15  * This software is available to you under a choice of one of two
  16  * licenses.  You may choose to be licensed under the terms of the GNU
  17  * General Public License (GPL) Version 2, available from the file
  18  * COPYING in the main directory of this source tree, or the
  19  * OpenIB.org BSD license below:
  20  *
  21  *     Redistribution and use in source and binary forms, with or
  22  *     without modification, are permitted provided that the following
  23  *     conditions are met:
  24  *
  25  *      - Redistributions of source code must retain the above
  26  *        copyright notice, this list of conditions and the following
  27  *        disclaimer.
  28  *
  29  *      - Redistributions in binary form must reproduce the above
  30  *        copyright notice, this list of conditions and the following
  31  *        disclaimer in the documentation and/or other materials
  32  *        provided with the distribution.
  33  *
  34  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  35  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  36  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  37  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
  38  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
  39  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  40  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  41  * SOFTWARE.
  42  *
  43  */
  44 #include <sys/types.h>
  45 #include <sys/kmem.h>
  46 #include <sys/cpuvar.h>
  47 #include <sys/rds.h>
  48 
  49 #include <sys/ib/clients/rdsv3/rdsv3.h>
  50 #include <sys/ib/clients/rdsv3/ib.h>
  51 #include <sys/ib/clients/rdsv3/rdsv3_debug.h>
  52 
  53 static struct kmem_cache *rdsv3_ib_incoming_slab;
  54 static atomic_t rdsv3_ib_allocation = ATOMIC_INIT(0);
  55 
  56 void
  57 rdsv3_ib_recv_init_ring(struct rdsv3_ib_connection *ic)
  58 {
  59         struct rdsv3_ib_recv_work *recv;
  60         struct rdsv3_header *hdrp;
  61         uint32_t i;
  62 
  63         RDSV3_DPRINTF4("rdsv3_ib_recv_init_ring", "ic: %p", ic);
  64 
  65         hdrp = ic->i_recv_hdrs;
  66         for (i = 0, recv = ic->i_recvs; i < ic->i_recv_ring.w_nr; i++, recv++) {
  67                 recv->r_ibinc = NULL;
  68                 recv->r_frag = NULL;
  69 
  70                 /* initialize the hdr sgl permanently */
  71                 recv->r_sge[0].ds_va = (ib_vaddr_t)(uintptr_t)hdrp++;
  72                 recv->r_sge[0].ds_len = sizeof (struct rdsv3_header);
  73                 recv->r_sge[0].ds_key = ic->i_mr->lkey;
  74         }
  75 }
  76 
  77 static void
  78 rdsv3_ib_recv_clear_one(struct rdsv3_ib_connection *ic,
  79     struct rdsv3_ib_recv_work *recv)
  80 {
  81         RDSV3_DPRINTF4("rdsv3_ib_recv_clear_one", "ic: %p, recv: %p",
  82             ic, recv);
  83 
  84         if (recv->r_ibinc) {
  85                 rdsv3_inc_put(&recv->r_ibinc->ii_inc);
  86                 recv->r_ibinc = NULL;
  87         }
  88 
  89         if (recv->r_frag) {
  90                 kmem_cache_free(ic->rds_ibdev->ib_frag_slab, recv->r_frag);
  91                 recv->r_frag = NULL;
  92         }
  93 
  94         RDSV3_DPRINTF4("rdsv3_ib_recv_clear_one", "Return: ic: %p, recv: %p",
  95             ic, recv);
  96 }
  97 
  98 void
  99 rdsv3_ib_recv_clear_ring(struct rdsv3_ib_connection *ic)
 100 {
 101         uint32_t i;
 102 
 103         RDSV3_DPRINTF4("rdsv3_ib_recv_clear_ring", "ic: %p", ic);
 104 
 105         for (i = 0; i < ic->i_recv_ring.w_nr; i++)
 106                 rdsv3_ib_recv_clear_one(ic, &ic->i_recvs[i]);
 107 }
 108 
 109 extern int atomic_add_unless(atomic_t *, uint_t, ulong_t);
 110 
 111 static int
 112 rdsv3_ib_recv_refill_one(struct rdsv3_connection *conn,
 113     struct rdsv3_ib_recv_work *recv)
 114 {
 115         struct rdsv3_ib_connection *ic = conn->c_transport_data;
 116         ibt_mi_hdl_t mi_hdl;
 117         ibt_iov_attr_t iov_attr;
 118         ibt_iov_t iov_arr[1];
 119 
 120         RDSV3_DPRINTF5("rdsv3_ib_recv_refill_one", "conn: %p, recv: %p",
 121             conn, recv);
 122 
 123         if (!recv->r_ibinc) {
 124                 if (!atomic_add_unless(&rdsv3_ib_allocation, 1,
 125                     ic->i_max_recv_alloc)) {
 126                         rdsv3_ib_stats_inc(s_ib_rx_alloc_limit);
 127                         goto out;
 128                 }
 129                 recv->r_ibinc = kmem_cache_alloc(rdsv3_ib_incoming_slab,
 130                     KM_NOSLEEP);
 131                 if (recv->r_ibinc == NULL) {
 132                         atomic_add_32(&rdsv3_ib_allocation, -1);
 133                         goto out;
 134                 }
 135                 rdsv3_inc_init(&recv->r_ibinc->ii_inc, conn, conn->c_faddr);
 136                 recv->r_ibinc->ii_ibdev = ic->rds_ibdev;
 137                 recv->r_ibinc->ii_pool = ic->rds_ibdev->inc_pool;
 138         }
 139 
 140         if (!recv->r_frag) {
 141                 recv->r_frag = kmem_cache_alloc(ic->rds_ibdev->ib_frag_slab,
 142                     KM_NOSLEEP);
 143                 if (!recv->r_frag)
 144                         goto out;
 145         }
 146 
 147         /* Data sge, structure copy */
 148         recv->r_sge[1] = recv->r_frag->f_sge;
 149 
 150         RDSV3_DPRINTF5("rdsv3_ib_recv_refill_one", "Return: conn: %p, recv: %p",
 151             conn, recv);
 152 
 153         return (0);
 154 out:
 155         if (recv->r_ibinc) {
 156                 kmem_cache_free(rdsv3_ib_incoming_slab, recv->r_ibinc);
 157                 atomic_add_32(&rdsv3_ib_allocation, -1);
 158                 recv->r_ibinc = NULL;
 159         }
 160         return (-ENOMEM);
 161 }
 162 
 163 /*
 164  * This tries to allocate and post unused work requests after making sure that
 165  * they have all the allocations they need to queue received fragments into
 166  * sockets.  The i_recv_mutex is held here so that ring_alloc and _unalloc
 167  * pairs don't go unmatched.
 168  *
 169  * -1 is returned if posting fails due to temporary resource exhaustion.
 170  */
 171 int
 172 rdsv3_ib_recv_refill(struct rdsv3_connection *conn, int prefill)
 173 {
 174         struct rdsv3_ib_connection *ic = conn->c_transport_data;
 175         struct rdsv3_ib_recv_work *recv;
 176         unsigned int posted = 0;
 177         int ret = 0, avail;
 178         uint32_t pos, i;
 179 
 180         RDSV3_DPRINTF4("rdsv3_ib_recv_refill", "conn: %p, prefill: %d",
 181             conn, prefill);
 182 
 183         if (prefill || rdsv3_conn_up(conn)) {
 184                 uint_t w_nr = ic->i_recv_ring.w_nr;
 185 
 186                 avail = rdsv3_ib_ring_alloc(&ic->i_recv_ring, w_nr, &pos);
 187                 if ((avail <= 0) || (pos >= w_nr)) {
 188                         RDSV3_DPRINTF2("rdsv3_ib_recv_refill",
 189                             "Argh - ring alloc returned pos=%u, avail: %d",
 190                             pos, avail);
 191                         return (-EINVAL);
 192                 }
 193 
 194                 /* populate the WRs */
 195                 for (i = 0; i < avail; i++) {
 196                         recv = &ic->i_recvs[pos];
 197                         ret = rdsv3_ib_recv_refill_one(conn, recv);
 198                         if (ret) {
 199                                 rdsv3_ib_ring_unalloc(&ic->i_recv_ring,
 200                                     avail - i);
 201                                 break;
 202                         }
 203                         ic->i_recv_wrs[i].wr_id = (ibt_wrid_t)pos;
 204                         ic->i_recv_wrs[i].wr_nds = RDSV3_IB_RECV_SGE;
 205                         ic->i_recv_wrs[i].wr_sgl = &recv->r_sge[0];
 206 
 207                         pos = (pos + 1) % w_nr;
 208                 }
 209 
 210                 if (i) {
 211                         /* post the WRs at one shot */
 212                         ret = ibt_post_recv(ib_get_ibt_channel_hdl(ic->i_cm_id),
 213                             &ic->i_recv_wrs[0], i, &posted);
 214                         RDSV3_DPRINTF3("rdsv3_ib_recv_refill",
 215                             "attempted: %d posted: %d WRs ret %d",
 216                             i, posted, ret);
 217                         if (ret) {
 218                                 RDSV3_DPRINTF2("rdsv3_ib_recv_refill",
 219                                     "disconnecting and reconnecting\n",
 220                                     NIPQUAD(conn->c_faddr), ret);
 221                                 rdsv3_ib_ring_unalloc(&ic->i_recv_ring,
 222                                     i - posted);
 223                                 rdsv3_conn_drop(conn);
 224                         }
 225                 }
 226         }
 227 
 228         /* We're doing flow control - update the window. */
 229         if (ic->i_flowctl && posted)
 230                 rdsv3_ib_advertise_credits(conn, posted);
 231 
 232         RDSV3_DPRINTF4("rdsv3_ib_recv_refill", "Return: conn: %p, posted: %d",
 233             conn, posted);
 234         return (ret);
 235 }
 236 
 237 /*
 238  * delayed freed incoming's
 239  */
 240 struct rdsv3_inc_pool {
 241         list_t                  f_list; /* list of freed incoming */
 242         kmutex_t                f_lock; /* lock of fmr pool */
 243         int32_t                 f_listcnt;
 244 };
 245 
 246 void
 247 rdsv3_ib_destroy_inc_pool(struct rdsv3_ib_device *rds_ibdev)
 248 {
 249         struct rdsv3_inc_pool *pool = rds_ibdev->inc_pool;
 250 
 251         if (pool) {
 252                 list_destroy(&pool->f_list);
 253                 kmem_free((void *) pool, sizeof (*pool));
 254         }
 255 }
 256 
 257 int
 258 rdsv3_ib_create_inc_pool(struct rdsv3_ib_device *rds_ibdev)
 259 {
 260         struct rdsv3_inc_pool *pool;
 261 
 262         pool = (struct rdsv3_inc_pool *)kmem_zalloc(sizeof (*pool), KM_NOSLEEP);
 263         if (pool == NULL) {
 264                 return (-ENOMEM);
 265         }
 266         list_create(&pool->f_list, sizeof (struct rdsv3_ib_incoming),
 267             offsetof(struct rdsv3_ib_incoming, ii_obj));
 268         mutex_init(&pool->f_lock, NULL, MUTEX_DRIVER, NULL);
 269         rds_ibdev->inc_pool = pool;
 270         return (0);
 271 }
 272 
 273 static void
 274 rdsv3_ib_inc_drop(struct rdsv3_ib_incoming *ibinc)
 275 {
 276         struct rdsv3_page_frag *frag;
 277         struct rdsv3_page_frag *pos;
 278 
 279         RDSV3_FOR_EACH_LIST_NODE_SAFE(frag, pos, &ibinc->ii_frags, f_item) {
 280                 list_remove_node(&frag->f_item);
 281                 kmem_cache_free(ibinc->ii_ibdev->ib_frag_slab, frag);
 282         }
 283 
 284         ASSERT(list_is_empty(&ibinc->ii_frags));
 285         kmem_cache_free(rdsv3_ib_incoming_slab, ibinc);
 286         atomic_dec_uint(&rdsv3_ib_allocation);
 287 }
 288 
 289 void
 290 rdsv3_ib_drain_inclist(void *data)
 291 {
 292         struct rdsv3_inc_pool *pool = (struct rdsv3_inc_pool *)data;
 293         struct rdsv3_ib_incoming *ibinc;
 294         list_t *listp = &pool->f_list;
 295         kmutex_t *lockp = &pool->f_lock;
 296         int i = 0;
 297 
 298         for (;;) {
 299                 mutex_enter(lockp);
 300                 ibinc = (struct rdsv3_ib_incoming *)list_remove_head(listp);
 301                 if (ibinc)
 302                         pool->f_listcnt--;
 303                 mutex_exit(lockp);
 304                 if (!ibinc)
 305                         break;
 306                 i++;
 307                 rdsv3_ib_inc_drop(ibinc);
 308         }
 309 }
 310 
 311 void
 312 rdsv3_ib_inc_free(struct rdsv3_incoming *inc)
 313 {
 314         struct rdsv3_ib_incoming *ibinc;
 315         rdsv3_af_thr_t *af_thr;
 316 
 317         RDSV3_DPRINTF4("rdsv3_ib_inc_free", "inc: %p", inc);
 318 
 319         ibinc = container_of(inc, struct rdsv3_ib_incoming, ii_inc);
 320         /* save af_thr in a local as ib_inc might be freed at mutex_exit */
 321         af_thr = ibinc->ii_ibdev->inc_soft_cq;
 322 
 323         mutex_enter(&ibinc->ii_pool->f_lock);
 324         list_insert_tail(&ibinc->ii_pool->f_list, ibinc);
 325         ibinc->ii_pool->f_listcnt++;
 326         mutex_exit(&ibinc->ii_pool->f_lock);
 327 
 328         rdsv3_af_thr_fire(af_thr);
 329 }
 330 
 331 int
 332 rdsv3_ib_inc_copy_to_user(struct rdsv3_incoming *inc, uio_t *uiop,
 333     size_t size)
 334 {
 335         struct rdsv3_ib_incoming *ibinc;
 336         struct rdsv3_page_frag *frag;
 337         unsigned long to_copy;
 338         unsigned long frag_off = 0;
 339         int copied = 0;
 340         int ret;
 341         uint32_t len;
 342 
 343         ibinc = container_of(inc, struct rdsv3_ib_incoming, ii_inc);
 344         frag = list_head(&ibinc->ii_frags);
 345         len = ntohl(inc->i_hdr.h_len);
 346 
 347         RDSV3_DPRINTF4("rdsv3_ib_inc_copy_to_user", "inc: %p, size: %d len: %d",
 348             inc, size, len);
 349 
 350         while (copied < size && copied < len) {
 351                 if (frag_off == RDSV3_FRAG_SIZE) {
 352                         frag = list_next(&ibinc->ii_frags, frag);
 353                         frag_off = 0;
 354                 }
 355 
 356                 to_copy = min(len - copied, RDSV3_FRAG_SIZE - frag_off);
 357                 to_copy = min(size - copied, to_copy);
 358 
 359                 RDSV3_DPRINTF5("rdsv3_ib_inc_copy_to_user",
 360                     "%lu bytes to user %p from frag [%p, %u] + %lu",
 361                     to_copy, uiop,
 362                     frag->f_page, frag->f_offset, frag_off);
 363 
 364                 ret = uiomove((caddr_t)(frag->f_page +
 365                     frag->f_offset + frag_off),
 366                     to_copy, UIO_READ, uiop);
 367                 if (ret) {
 368                         RDSV3_DPRINTF2("rdsv3_ib_inc_copy_to_user",
 369                             "uiomove (%d) returned: %d", to_copy, ret);
 370                         break;
 371                 }
 372 
 373                 frag_off += to_copy;
 374                 copied += to_copy;
 375         }
 376 
 377         RDSV3_DPRINTF4("rdsv3_ib_inc_copy_to_user",
 378             "Return: inc: %p, copied: %d", inc, copied);
 379 
 380         return (copied);
 381 }
 382 
 383 /* ic starts out kmem_zalloc()ed */
 384 void
 385 rdsv3_ib_recv_init_ack(struct rdsv3_ib_connection *ic)
 386 {
 387         ibt_send_wr_t *wr = &ic->i_ack_wr;
 388         ibt_wr_ds_t *sge = &ic->i_ack_sge;
 389 
 390         RDSV3_DPRINTF4("rdsv3_ib_recv_init_ack", "ic: %p", ic);
 391 
 392         sge->ds_va = ic->i_ack_dma;
 393         sge->ds_len = sizeof (struct rdsv3_header);
 394         sge->ds_key = ic->i_mr->lkey;
 395 
 396         wr->wr_sgl = sge;
 397         wr->wr_nds = 1;
 398         wr->wr_opcode = IBT_WRC_SEND;
 399         wr->wr_id = RDSV3_IB_ACK_WR_ID;
 400         wr->wr_flags = IBT_WR_SEND_SIGNAL | IBT_WR_SEND_SOLICIT;
 401 }
 402 
 403 /*
 404  * You'd think that with reliable IB connections you wouldn't need to ack
 405  * messages that have been received.  The problem is that IB hardware generates
 406  * an ack message before it has DMAed the message into memory.  This creates a
 407  * potential message loss if the HCA is disabled for any reason between when it
 408  * sends the ack and before the message is DMAed and processed.  This is only a
 409  * potential issue if another HCA is available for fail-over.
 410  *
 411  * When the remote host receives our ack they'll free the sent message from
 412  * their send queue.  To decrease the latency of this we always send an ack
 413  * immediately after we've received messages.
 414  *
 415  * For simplicity, we only have one ack in flight at a time.  This puts
 416  * pressure on senders to have deep enough send queues to absorb the latency of
 417  * a single ack frame being in flight.  This might not be good enough.
 418  *
 419  * This is implemented by have a long-lived send_wr and sge which point to a
 420  * statically allocated ack frame.  This ack wr does not fall under the ring
 421  * accounting that the tx and rx wrs do.  The QP attribute specifically makes
 422  * room for it beyond the ring size.  Send completion notices its special
 423  * wr_id and avoids working with the ring in that case.
 424  */
 425 void
 426 rdsv3_ib_set_ack(struct rdsv3_ib_connection *ic, uint64_t seq,
 427     int ack_required)
 428 {
 429         RDSV3_DPRINTF4("rdsv3_ib_set_ack", "ic: %p, seq: %lld ack: %d",
 430             ic, seq, ack_required);
 431 
 432         mutex_enter(&ic->i_ack_lock);
 433         ic->i_ack_next = seq;
 434         if (ack_required)
 435                 set_bit(IB_ACK_REQUESTED, &ic->i_ack_flags);
 436         mutex_exit(&ic->i_ack_lock);
 437 }
 438 
 439 static uint64_t
 440 rdsv3_ib_get_ack(struct rdsv3_ib_connection *ic)
 441 {
 442         uint64_t seq;
 443 
 444         RDSV3_DPRINTF4("rdsv3_ib_get_ack", "ic: %p", ic);
 445 
 446         clear_bit(IB_ACK_REQUESTED, &ic->i_ack_flags);
 447 
 448         mutex_enter(&ic->i_ack_lock);
 449         seq = ic->i_ack_next;
 450         mutex_exit(&ic->i_ack_lock);
 451 
 452         return (seq);
 453 }
 454 
 455 static void
 456 rdsv3_ib_send_ack(struct rdsv3_ib_connection *ic, unsigned int adv_credits)
 457 {
 458         struct rdsv3_header *hdr = ic->i_ack;
 459         uint64_t seq;
 460         int ret;
 461 
 462         RDSV3_DPRINTF4("rdsv3_ib_send_ack", "ic: %p adv_credits: %d",
 463             ic, adv_credits);
 464 
 465         seq = rdsv3_ib_get_ack(ic);
 466 
 467         RDSV3_DPRINTF4("rdsv3_ib_send_ack", "send_ack: ic %p ack %llu",
 468             ic, (unsigned long long) seq);
 469         rdsv3_message_populate_header(hdr, 0, 0, 0);
 470         hdr->h_ack = htonll(seq);
 471         hdr->h_credit = adv_credits;
 472         rdsv3_message_make_checksum(hdr);
 473         ic->i_ack_queued = jiffies;
 474 
 475         ret = ibt_post_send(RDSV3_QP2CHANHDL(ic->i_cm_id->qp), &ic->i_ack_wr, 1,
 476             NULL);
 477         if (ret) {
 478                 /*
 479                  * Failed to send. Release the WR, and
 480                  * force another ACK.
 481                  */
 482                 clear_bit(IB_ACK_IN_FLIGHT, &ic->i_ack_flags);
 483                 set_bit(IB_ACK_REQUESTED, &ic->i_ack_flags);
 484                 rdsv3_ib_stats_inc(s_ib_ack_send_failure);
 485                 RDSV3_DPRINTF2("rdsv3_ib_send_ack", "sending ack failed\n");
 486                 rdsv3_conn_drop(ic->conn);
 487         } else {
 488                 rdsv3_ib_stats_inc(s_ib_ack_sent);
 489         }
 490         RDSV3_DPRINTF4("rdsv3_ib_send_ack", "Return: ic: %p adv_credits: %d",
 491             ic, adv_credits);
 492 }
 493 
 494 /*
 495  * There are 3 ways of getting acknowledgements to the peer:
 496  *  1.  We call rdsv3_ib_attempt_ack from the recv completion handler
 497  *      to send an ACK-only frame.
 498  *      However, there can be only one such frame in the send queue
 499  *      at any time, so we may have to postpone it.
 500  *  2.  When another (data) packet is transmitted while there's
 501  *      an ACK in the queue, we piggyback the ACK sequence number
 502  *      on the data packet.
 503  *  3.  If the ACK WR is done sending, we get called from the
 504  *      send queue completion handler, and check whether there's
 505  *      another ACK pending (postponed because the WR was on the
 506  *      queue). If so, we transmit it.
 507  *
 508  * We maintain 2 variables:
 509  *  -   i_ack_flags, which keeps track of whether the ACK WR
 510  *      is currently in the send queue or not (IB_ACK_IN_FLIGHT)
 511  *  -   i_ack_next, which is the last sequence number we received
 512  *
 513  * Potentially, send queue and receive queue handlers can run concurrently.
 514  * It would be nice to not have to use a spinlock to synchronize things,
 515  * but the one problem that rules this out is that 64bit updates are
 516  * not atomic on all platforms. Things would be a lot simpler if
 517  * we had atomic64 or maybe cmpxchg64 everywhere.
 518  *
 519  * Reconnecting complicates this picture just slightly. When we
 520  * reconnect, we may be seeing duplicate packets. The peer
 521  * is retransmitting them, because it hasn't seen an ACK for
 522  * them. It is important that we ACK these.
 523  *
 524  * ACK mitigation adds a header flag "ACK_REQUIRED"; any packet with
 525  * this flag set *MUST* be acknowledged immediately.
 526  */
 527 
 528 /*
 529  * When we get here, we're called from the recv queue handler.
 530  * Check whether we ought to transmit an ACK.
 531  */
 532 void
 533 rdsv3_ib_attempt_ack(struct rdsv3_ib_connection *ic)
 534 {
 535         unsigned int adv_credits;
 536 
 537         RDSV3_DPRINTF4("rdsv3_ib_attempt_ack", "ic: %p", ic);
 538 
 539         if (!test_bit(IB_ACK_REQUESTED, &ic->i_ack_flags))
 540                 return;
 541 
 542         if (test_and_set_bit(IB_ACK_IN_FLIGHT, &ic->i_ack_flags)) {
 543                 rdsv3_ib_stats_inc(s_ib_ack_send_delayed);
 544                 return;
 545         }
 546 
 547         /* Can we get a send credit? */
 548         if (!rdsv3_ib_send_grab_credits(ic, 1, &adv_credits, 0)) {
 549                 rdsv3_ib_stats_inc(s_ib_tx_throttle);
 550                 clear_bit(IB_ACK_IN_FLIGHT, &ic->i_ack_flags);
 551                 return;
 552         }
 553 
 554         clear_bit(IB_ACK_REQUESTED, &ic->i_ack_flags);
 555         rdsv3_ib_send_ack(ic, adv_credits);
 556 
 557         RDSV3_DPRINTF4("rdsv3_ib_attempt_ack", "Return: ic: %p", ic);
 558 }
 559 
 560 /*
 561  * We get here from the send completion handler, when the
 562  * adapter tells us the ACK frame was sent.
 563  */
 564 void
 565 rdsv3_ib_ack_send_complete(struct rdsv3_ib_connection *ic)
 566 {
 567         RDSV3_DPRINTF4("rdsv3_ib_ack_send_complete", "ic: %p", ic);
 568         clear_bit(IB_ACK_IN_FLIGHT, &ic->i_ack_flags);
 569         rdsv3_ib_attempt_ack(ic);
 570 }
 571 
 572 /*
 573  * This is called by the regular xmit code when it wants to piggyback
 574  * an ACK on an outgoing frame.
 575  */
 576 uint64_t
 577 rdsv3_ib_piggyb_ack(struct rdsv3_ib_connection *ic)
 578 {
 579         RDSV3_DPRINTF4("rdsv3_ib_piggyb_ack", "ic: %p", ic);
 580         if (test_and_clear_bit(IB_ACK_REQUESTED, &ic->i_ack_flags)) {
 581                 rdsv3_ib_stats_inc(s_ib_ack_send_piggybacked);
 582         }
 583         return (rdsv3_ib_get_ack(ic));
 584 }
 585 
 586 /*
 587  * It's kind of lame that we're copying from the posted receive pages into
 588  * long-lived bitmaps.  We could have posted the bitmaps and rdma written into
 589  * them.  But receiving new congestion bitmaps should be a *rare* event, so
 590  * hopefully we won't need to invest that complexity in making it more
 591  * efficient.  By copying we can share a simpler core with TCP which has to
 592  * copy.
 593  */
 594 static void
 595 rdsv3_ib_cong_recv(struct rdsv3_connection *conn,
 596     struct rdsv3_ib_incoming *ibinc)
 597 {
 598         struct rdsv3_cong_map *map;
 599         unsigned int map_off;
 600         unsigned int map_page;
 601         struct rdsv3_page_frag *frag;
 602         unsigned long frag_off;
 603         unsigned long to_copy;
 604         unsigned long copied;
 605         uint64_t uncongested = 0;
 606         caddr_t addr;
 607 
 608         RDSV3_DPRINTF4("rdsv3_ib_cong_recv", "conn: %p, ibinc: %p",
 609             conn, ibinc);
 610 
 611         /* catch completely corrupt packets */
 612         if (ntohl(ibinc->ii_inc.i_hdr.h_len) != RDSV3_CONG_MAP_BYTES)
 613                 return;
 614 
 615         map = conn->c_fcong;
 616         map_page = 0;
 617         map_off = 0;
 618 
 619         frag = list_head(&ibinc->ii_frags);
 620         frag_off = 0;
 621 
 622         copied = 0;
 623 
 624         while (copied < RDSV3_CONG_MAP_BYTES) {
 625                 uint64_t *src, *dst;
 626                 unsigned int k;
 627 
 628                 to_copy = min(RDSV3_FRAG_SIZE - frag_off, PAGE_SIZE - map_off);
 629                 ASSERT(!(to_copy & 7)); /* Must be 64bit aligned. */
 630 
 631                 addr = frag->f_page + frag->f_offset;
 632 
 633                 src = (uint64_t *)(addr + frag_off);
 634                 dst = (uint64_t *)(map->m_page_addrs[map_page] + map_off);
 635                 RDSV3_DPRINTF4("rdsv3_ib_cong_recv",
 636                     "src: %p dst: %p copied: %d", src, dst, copied);
 637                 for (k = 0; k < to_copy; k += 8) {
 638                         /*
 639                          * Record ports that became uncongested, ie
 640                          * bits that changed from 0 to 1.
 641                          */
 642                         uncongested |= ~(*src) & *dst;
 643                         *dst++ = *src++;
 644                 }
 645 
 646                 copied += to_copy;
 647                 RDSV3_DPRINTF4("rdsv3_ib_cong_recv",
 648                     "src: %p dst: %p copied: %d", src, dst, copied);
 649 
 650                 map_off += to_copy;
 651                 if (map_off == PAGE_SIZE) {
 652                         map_off = 0;
 653                         map_page++;
 654                 }
 655 
 656                 frag_off += to_copy;
 657                 if (frag_off == RDSV3_FRAG_SIZE) {
 658                         frag = list_next(&ibinc->ii_frags, frag);
 659                         frag_off = 0;
 660                 }
 661         }
 662 
 663 #if 0
 664 XXX
 665         /* the congestion map is in little endian order */
 666         uncongested = le64_to_cpu(uncongested);
 667 #endif
 668 
 669         rdsv3_cong_map_updated(map, uncongested);
 670 
 671         RDSV3_DPRINTF4("rdsv3_ib_cong_recv", "Return: conn: %p, ibinc: %p",
 672             conn, ibinc);
 673 }
 674 
 675 static void
 676 rdsv3_ib_process_recv(struct rdsv3_connection *conn,
 677     struct rdsv3_ib_recv_work *recv, uint32_t data_len,
 678     struct rdsv3_ib_ack_state *state)
 679 {
 680         struct rdsv3_ib_connection *ic = conn->c_transport_data;
 681         struct rdsv3_ib_incoming *ibinc = ic->i_ibinc;
 682         struct rdsv3_header *ihdr, *hdr;
 683 
 684         /* XXX shut down the connection if port 0,0 are seen? */
 685 
 686         RDSV3_DPRINTF5("rdsv3_ib_process_recv",
 687             "ic %p ibinc %p recv %p byte len %u", ic, ibinc, recv, data_len);
 688 
 689         if (data_len < sizeof (struct rdsv3_header)) {
 690                 RDSV3_DPRINTF2("rdsv3_ib_process_recv",
 691                     "incoming message from %u.%u.%u.%u didn't include a "
 692                     "header, disconnecting and reconnecting",
 693                     NIPQUAD(conn->c_faddr));
 694                 rdsv3_conn_drop(conn);
 695                 return;
 696         }
 697         data_len -= sizeof (struct rdsv3_header);
 698 
 699         ihdr = &ic->i_recv_hdrs[recv - ic->i_recvs];
 700 
 701         /* Validate the checksum. */
 702         if (!rdsv3_message_verify_checksum(ihdr)) {
 703                 RDSV3_DPRINTF2("rdsv3_ib_process_recv", "incoming message "
 704                     "from %u.%u.%u.%u has corrupted header - "
 705                     "forcing a reconnect",
 706                     NIPQUAD(conn->c_faddr));
 707                 rdsv3_conn_drop(conn);
 708                 rdsv3_stats_inc(s_recv_drop_bad_checksum);
 709                 return;
 710         }
 711 
 712         /* Process the ACK sequence which comes with every packet */
 713         state->ack_recv = ntohll(ihdr->h_ack);
 714         state->ack_recv_valid = 1;
 715 
 716         /* Process the credits update if there was one */
 717         if (ihdr->h_credit)
 718                 rdsv3_ib_send_add_credits(conn, ihdr->h_credit);
 719 
 720         if (ihdr->h_sport == 0 && ihdr->h_dport == 0 && data_len == 0) {
 721                 /*
 722                  * This is an ACK-only packet. The fact that it gets
 723                  * special treatment here is that historically, ACKs
 724                  * were rather special beasts.
 725                  */
 726                 rdsv3_ib_stats_inc(s_ib_ack_received);
 727                 return;
 728         }
 729 
 730         /*
 731          * If we don't already have an inc on the connection then this
 732          * fragment has a header and starts a message.. copy its header
 733          * into the inc and save the inc so we can hang upcoming fragments
 734          * off its list.
 735          */
 736         if (!ibinc) {
 737                 ibinc = recv->r_ibinc;
 738                 recv->r_ibinc = NULL;
 739                 ic->i_ibinc = ibinc;
 740 
 741                 hdr = &ibinc->ii_inc.i_hdr;
 742                 (void) memcpy(hdr, ihdr, sizeof (*hdr));
 743                 ic->i_recv_data_rem = ntohl(hdr->h_len);
 744 
 745                 RDSV3_DPRINTF5("rdsv3_ib_process_recv",
 746                     "ic %p ibinc %p rem %u flag 0x%x", ic, ibinc,
 747                     ic->i_recv_data_rem, hdr->h_flags);
 748         } else {
 749                 hdr = &ibinc->ii_inc.i_hdr;
 750                 /*
 751                  * We can't just use memcmp here; fragments of a
 752                  * single message may carry different ACKs
 753                  */
 754                 if (hdr->h_sequence != ihdr->h_sequence ||
 755                     hdr->h_len != ihdr->h_len ||
 756                     hdr->h_sport != ihdr->h_sport ||
 757                     hdr->h_dport != ihdr->h_dport) {
 758                         RDSV3_DPRINTF2("rdsv3_ib_process_recv",
 759                             "fragment header mismatch; forcing reconnect");
 760                         rdsv3_conn_drop(conn);
 761                         return;
 762                 }
 763         }
 764 
 765         list_insert_tail(&ibinc->ii_frags, recv->r_frag);
 766         recv->r_frag = NULL;
 767 
 768         if (ic->i_recv_data_rem > RDSV3_FRAG_SIZE)
 769                 ic->i_recv_data_rem -= RDSV3_FRAG_SIZE;
 770         else {
 771                 ic->i_recv_data_rem = 0;
 772                 ic->i_ibinc = NULL;
 773 
 774                 if (ibinc->ii_inc.i_hdr.h_flags == RDSV3_FLAG_CONG_BITMAP)
 775                         rdsv3_ib_cong_recv(conn, ibinc);
 776                 else {
 777                         rdsv3_recv_incoming(conn, conn->c_faddr, conn->c_laddr,
 778                             &ibinc->ii_inc, KM_NOSLEEP);
 779                         state->ack_next = ntohll(hdr->h_sequence);
 780                         state->ack_next_valid = 1;
 781                 }
 782 
 783                 /*
 784                  * Evaluate the ACK_REQUIRED flag *after* we received
 785                  * the complete frame, and after bumping the next_rx
 786                  * sequence.
 787                  */
 788                 if (hdr->h_flags & RDSV3_FLAG_ACK_REQUIRED) {
 789                         rdsv3_stats_inc(s_recv_ack_required);
 790                         state->ack_required = 1;
 791                 }
 792 
 793                 rdsv3_inc_put(&ibinc->ii_inc);
 794         }
 795 
 796         RDSV3_DPRINTF4("rdsv3_ib_process_recv",
 797             "Return: conn: %p recv: %p len: %d state: %p",
 798             conn, recv, data_len, state);
 799 }
 800 
 801 void
 802 rdsv3_ib_recv_cqe_handler(struct rdsv3_ib_connection *ic, ibt_wc_t *wc,
 803     struct rdsv3_ib_ack_state *state)
 804 {
 805         struct rdsv3_connection *conn = ic->conn;
 806         struct rdsv3_ib_recv_work *recv;
 807         struct rdsv3_ib_work_ring *recv_ringp = &ic->i_recv_ring;
 808 
 809         RDSV3_DPRINTF4("rdsv3_ib_recv_cqe_handler",
 810             "rwc wc_id 0x%llx status %u byte_len %u imm_data %u\n",
 811             (unsigned long long)wc->wc_id, wc->wc_status,
 812             wc->wc_bytes_xfer, ntohl(wc->wc_immed_data));
 813 
 814         rdsv3_ib_stats_inc(s_ib_rx_cq_event);
 815 
 816         recv = &ic->i_recvs[rdsv3_ib_ring_oldest(recv_ringp)];
 817 
 818         /*
 819          * Also process recvs in connecting state because it is possible
 820          * to get a recv completion _before_ the rdmacm ESTABLISHED
 821          * event is processed.
 822          */
 823         if (rdsv3_conn_up(conn) || rdsv3_conn_connecting(conn)) {
 824                 /* We expect errors as the qp is drained during shutdown */
 825                 if (wc->wc_status == IBT_WC_SUCCESS) {
 826                         rdsv3_ib_process_recv(conn, recv,
 827                             wc->wc_bytes_xfer, state);
 828                 } else {
 829                         RDSV3_DPRINTF2("rdsv3_ib_recv_cqe_handler",
 830                             "recv completion on "
 831                             "%u.%u.%u.%u had status %u, "
 832                             "disconnecting and reconnecting\n",
 833                             NIPQUAD(conn->c_faddr),
 834                             wc->wc_status);
 835                         rdsv3_conn_drop(conn);
 836                 }
 837         }
 838 
 839         rdsv3_ib_ring_free(recv_ringp, 1);
 840 
 841         /*
 842          * If we ever end up with a really empty receive ring, we're
 843          * in deep trouble, as the sender will definitely see RNR
 844          * timeouts.
 845          */
 846         if (rdsv3_ib_ring_empty(recv_ringp))
 847                 rdsv3_ib_stats_inc(s_ib_rx_ring_empty);
 848 
 849         if (rdsv3_ib_ring_low(recv_ringp)) {
 850                 rdsv3_af_thr_fire(ic->i_refill_rq);
 851         }
 852 }
 853 
 854 int
 855 rdsv3_ib_recv(struct rdsv3_connection *conn)
 856 {
 857         struct rdsv3_ib_connection *ic = conn->c_transport_data;
 858         int ret = 0;
 859 
 860         RDSV3_DPRINTF4("rdsv3_ib_recv", "conn %p\n", conn);
 861 
 862         if (rdsv3_conn_up(conn))
 863                 rdsv3_ib_attempt_ack(ic);
 864 
 865         RDSV3_DPRINTF4("rdsv3_ib_recv", "Return: conn: %p", conn);
 866 
 867         return (ret);
 868 }
 869 
 870 extern int rdsv3_ib_inc_constructor(void *buf, void *arg, int kmflags);
 871 extern void rdsv3_ib_inc_destructor(void *buf, void *arg);
 872 
 873 int
 874 rdsv3_ib_recv_init(void)
 875 {
 876         RDSV3_DPRINTF4("rdsv3_ib_recv_init", "Enter");
 877 
 878         rdsv3_ib_incoming_slab = kmem_cache_create("rdsv3_ib_incoming",
 879             sizeof (struct rdsv3_ib_incoming), 0, rdsv3_ib_inc_constructor,
 880             rdsv3_ib_inc_destructor, NULL, NULL, NULL, 0);
 881         if (!rdsv3_ib_incoming_slab) {
 882                 RDSV3_DPRINTF2("rdsv3_ib_recv_init", "kmem_cache_create "
 883                     "failed");
 884                 return (-ENOMEM);
 885         }
 886 
 887         RDSV3_DPRINTF4("rdsv3_ib_recv_init", "Return");
 888         return (0);
 889 }
 890 
 891 void
 892 rdsv3_ib_recv_exit(void)
 893 {
 894         RDSV3_DPRINTF4("rdsv3_ib_recv_exit", "Enter");
 895         kmem_cache_destroy(rdsv3_ib_incoming_slab);
 896         RDSV3_DPRINTF4("rdsv3_ib_recv_exit", "Return");
 897 }