1662 lines · c
1/*2 * Copyright (c) 2006 Mellanox Technologies. All rights reserved3 *4 * This software is available to you under a choice of one of two5 * licenses. You may choose to be licensed under the terms of the GNU6 * General Public License (GPL) Version 2, available from the file7 * COPYING in the main directory of this source tree, or the8 * OpenIB.org BSD license below:9 *10 * Redistribution and use in source and binary forms, with or11 * without modification, are permitted provided that the following12 * conditions are met:13 *14 * - Redistributions of source code must retain the above15 * copyright notice, this list of conditions and the following16 * disclaimer.17 *18 * - Redistributions in binary form must reproduce the above19 * copyright notice, this list of conditions and the following20 * disclaimer in the documentation and/or other materials21 * provided with the distribution.22 *23 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,24 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF25 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND26 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS27 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN28 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN29 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE30 * SOFTWARE.31 */32 33#include <rdma/ib_cm.h>34#include <net/dst.h>35#include <net/icmp.h>36#include <linux/icmpv6.h>37#include <linux/delay.h>38#include <linux/slab.h>39#include <linux/vmalloc.h>40#include <linux/moduleparam.h>41#include <linux/sched/signal.h>42#include <linux/sched/mm.h>43 44#include "ipoib.h"45 46int ipoib_max_conn_qp = 128;47 48module_param_named(max_nonsrq_conn_qp, ipoib_max_conn_qp, int, 0444);49MODULE_PARM_DESC(max_nonsrq_conn_qp,50 "Max number of connected-mode QPs per interface "51 "(applied only if shared receive queue is not available)");52 53#ifdef CONFIG_INFINIBAND_IPOIB_DEBUG_DATA54static int data_debug_level;55 56module_param_named(cm_data_debug_level, data_debug_level, int, 0644);57MODULE_PARM_DESC(cm_data_debug_level,58 "Enable data path debug tracing for connected mode if > 0");59#endif60 61#define IPOIB_CM_IETF_ID 0x1000000000000000ULL62 63#define IPOIB_CM_RX_UPDATE_TIME (256 * HZ)64#define IPOIB_CM_RX_TIMEOUT (2 * 256 * HZ)65#define IPOIB_CM_RX_DELAY (3 * 256 * HZ)66#define IPOIB_CM_RX_UPDATE_MASK (0x3)67 68#define IPOIB_CM_RX_RESERVE (ALIGN(IPOIB_HARD_LEN, 16) - IPOIB_ENCAP_LEN)69 70static struct ib_qp_attr ipoib_cm_err_attr = {71 .qp_state = IB_QPS_ERR72};73 74#define IPOIB_CM_RX_DRAIN_WRID 0xffffffff75 76static struct ib_send_wr ipoib_cm_rx_drain_wr = {77 .opcode = IB_WR_SEND,78};79 80static int ipoib_cm_tx_handler(struct ib_cm_id *cm_id,81 const struct ib_cm_event *event);82 83static void ipoib_cm_dma_unmap_rx(struct ipoib_dev_priv *priv, int frags,84 u64 mapping[IPOIB_CM_RX_SG])85{86 int i;87 88 ib_dma_unmap_single(priv->ca, mapping[0], IPOIB_CM_HEAD_SIZE, DMA_FROM_DEVICE);89 90 for (i = 0; i < frags; ++i)91 ib_dma_unmap_page(priv->ca, mapping[i + 1], PAGE_SIZE, DMA_FROM_DEVICE);92}93 94static int ipoib_cm_post_receive_srq(struct net_device *dev, int id)95{96 struct ipoib_dev_priv *priv = ipoib_priv(dev);97 int i, ret;98 99 priv->cm.rx_wr.wr_id = id | IPOIB_OP_CM | IPOIB_OP_RECV;100 101 for (i = 0; i < priv->cm.num_frags; ++i)102 priv->cm.rx_sge[i].addr = priv->cm.srq_ring[id].mapping[i];103 104 ret = ib_post_srq_recv(priv->cm.srq, &priv->cm.rx_wr, NULL);105 if (unlikely(ret)) {106 ipoib_warn(priv, "post srq failed for buf %d (%d)\n", id, ret);107 ipoib_cm_dma_unmap_rx(priv, priv->cm.num_frags - 1,108 priv->cm.srq_ring[id].mapping);109 dev_kfree_skb_any(priv->cm.srq_ring[id].skb);110 priv->cm.srq_ring[id].skb = NULL;111 }112 113 return ret;114}115 116static int ipoib_cm_post_receive_nonsrq(struct net_device *dev,117 struct ipoib_cm_rx *rx,118 struct ib_recv_wr *wr,119 struct ib_sge *sge, int id)120{121 struct ipoib_dev_priv *priv = ipoib_priv(dev);122 int i, ret;123 124 wr->wr_id = id | IPOIB_OP_CM | IPOIB_OP_RECV;125 126 for (i = 0; i < IPOIB_CM_RX_SG; ++i)127 sge[i].addr = rx->rx_ring[id].mapping[i];128 129 ret = ib_post_recv(rx->qp, wr, NULL);130 if (unlikely(ret)) {131 ipoib_warn(priv, "post recv failed for buf %d (%d)\n", id, ret);132 ipoib_cm_dma_unmap_rx(priv, IPOIB_CM_RX_SG - 1,133 rx->rx_ring[id].mapping);134 dev_kfree_skb_any(rx->rx_ring[id].skb);135 rx->rx_ring[id].skb = NULL;136 }137 138 return ret;139}140 141static struct sk_buff *ipoib_cm_alloc_rx_skb(struct net_device *dev,142 struct ipoib_cm_rx_buf *rx_ring,143 int id, int frags,144 u64 mapping[IPOIB_CM_RX_SG],145 gfp_t gfp)146{147 struct ipoib_dev_priv *priv = ipoib_priv(dev);148 struct sk_buff *skb;149 int i;150 151 skb = dev_alloc_skb(ALIGN(IPOIB_CM_HEAD_SIZE + IPOIB_PSEUDO_LEN, 16));152 if (unlikely(!skb))153 return NULL;154 155 /*156 * IPoIB adds a IPOIB_ENCAP_LEN byte header, this will align the157 * IP header to a multiple of 16.158 */159 skb_reserve(skb, IPOIB_CM_RX_RESERVE);160 161 mapping[0] = ib_dma_map_single(priv->ca, skb->data, IPOIB_CM_HEAD_SIZE,162 DMA_FROM_DEVICE);163 if (unlikely(ib_dma_mapping_error(priv->ca, mapping[0]))) {164 dev_kfree_skb_any(skb);165 return NULL;166 }167 168 for (i = 0; i < frags; i++) {169 struct page *page = alloc_page(gfp);170 171 if (!page)172 goto partial_error;173 skb_fill_page_desc(skb, i, page, 0, PAGE_SIZE);174 175 mapping[i + 1] = ib_dma_map_page(priv->ca, page,176 0, PAGE_SIZE, DMA_FROM_DEVICE);177 if (unlikely(ib_dma_mapping_error(priv->ca, mapping[i + 1])))178 goto partial_error;179 }180 181 rx_ring[id].skb = skb;182 return skb;183 184partial_error:185 186 ib_dma_unmap_single(priv->ca, mapping[0], IPOIB_CM_HEAD_SIZE, DMA_FROM_DEVICE);187 188 for (; i > 0; --i)189 ib_dma_unmap_page(priv->ca, mapping[i], PAGE_SIZE, DMA_FROM_DEVICE);190 191 dev_kfree_skb_any(skb);192 return NULL;193}194 195static void ipoib_cm_free_rx_ring(struct net_device *dev,196 struct ipoib_cm_rx_buf *rx_ring)197{198 struct ipoib_dev_priv *priv = ipoib_priv(dev);199 int i;200 201 for (i = 0; i < ipoib_recvq_size; ++i)202 if (rx_ring[i].skb) {203 ipoib_cm_dma_unmap_rx(priv, IPOIB_CM_RX_SG - 1,204 rx_ring[i].mapping);205 dev_kfree_skb_any(rx_ring[i].skb);206 }207 208 vfree(rx_ring);209}210 211static void ipoib_cm_start_rx_drain(struct ipoib_dev_priv *priv)212{213 struct ipoib_cm_rx *p;214 215 /* We only reserved 1 extra slot in CQ for drain WRs, so216 * make sure we have at most 1 outstanding WR. */217 if (list_empty(&priv->cm.rx_flush_list) ||218 !list_empty(&priv->cm.rx_drain_list))219 return;220 221 /*222 * QPs on flush list are error state. This way, a "flush223 * error" WC will be immediately generated for each WR we post.224 */225 p = list_entry(priv->cm.rx_flush_list.next, typeof(*p), list);226 ipoib_cm_rx_drain_wr.wr_id = IPOIB_CM_RX_DRAIN_WRID;227 if (ib_post_send(p->qp, &ipoib_cm_rx_drain_wr, NULL))228 ipoib_warn(priv, "failed to post drain wr\n");229 230 list_splice_init(&priv->cm.rx_flush_list, &priv->cm.rx_drain_list);231}232 233static void ipoib_cm_rx_event_handler(struct ib_event *event, void *ctx)234{235 struct ipoib_cm_rx *p = ctx;236 struct ipoib_dev_priv *priv = ipoib_priv(p->dev);237 unsigned long flags;238 239 if (event->event != IB_EVENT_QP_LAST_WQE_REACHED)240 return;241 242 spin_lock_irqsave(&priv->lock, flags);243 list_move(&p->list, &priv->cm.rx_flush_list);244 p->state = IPOIB_CM_RX_FLUSH;245 ipoib_cm_start_rx_drain(priv);246 spin_unlock_irqrestore(&priv->lock, flags);247}248 249static struct ib_qp *ipoib_cm_create_rx_qp(struct net_device *dev,250 struct ipoib_cm_rx *p)251{252 struct ipoib_dev_priv *priv = ipoib_priv(dev);253 struct ib_qp_init_attr attr = {254 .event_handler = ipoib_cm_rx_event_handler,255 .send_cq = priv->recv_cq, /* For drain WR */256 .recv_cq = priv->recv_cq,257 .srq = priv->cm.srq,258 .cap.max_send_wr = 1, /* For drain WR */259 .cap.max_send_sge = 1, /* FIXME: 0 Seems not to work */260 .sq_sig_type = IB_SIGNAL_ALL_WR,261 .qp_type = IB_QPT_RC,262 .qp_context = p,263 };264 265 if (!ipoib_cm_has_srq(dev)) {266 attr.cap.max_recv_wr = ipoib_recvq_size;267 attr.cap.max_recv_sge = IPOIB_CM_RX_SG;268 }269 270 return ib_create_qp(priv->pd, &attr);271}272 273static int ipoib_cm_modify_rx_qp(struct net_device *dev,274 struct ib_cm_id *cm_id, struct ib_qp *qp,275 unsigned int psn)276{277 struct ipoib_dev_priv *priv = ipoib_priv(dev);278 struct ib_qp_attr qp_attr;279 int qp_attr_mask, ret;280 281 qp_attr.qp_state = IB_QPS_INIT;282 ret = ib_cm_init_qp_attr(cm_id, &qp_attr, &qp_attr_mask);283 if (ret) {284 ipoib_warn(priv, "failed to init QP attr for INIT: %d\n", ret);285 return ret;286 }287 ret = ib_modify_qp(qp, &qp_attr, qp_attr_mask);288 if (ret) {289 ipoib_warn(priv, "failed to modify QP to INIT: %d\n", ret);290 return ret;291 }292 qp_attr.qp_state = IB_QPS_RTR;293 ret = ib_cm_init_qp_attr(cm_id, &qp_attr, &qp_attr_mask);294 if (ret) {295 ipoib_warn(priv, "failed to init QP attr for RTR: %d\n", ret);296 return ret;297 }298 qp_attr.rq_psn = psn;299 ret = ib_modify_qp(qp, &qp_attr, qp_attr_mask);300 if (ret) {301 ipoib_warn(priv, "failed to modify QP to RTR: %d\n", ret);302 return ret;303 }304 305 /*306 * Current Mellanox HCA firmware won't generate completions307 * with error for drain WRs unless the QP has been moved to308 * RTS first. This work-around leaves a window where a QP has309 * moved to error asynchronously, but this will eventually get310 * fixed in firmware, so let's not error out if modify QP311 * fails.312 */313 qp_attr.qp_state = IB_QPS_RTS;314 ret = ib_cm_init_qp_attr(cm_id, &qp_attr, &qp_attr_mask);315 if (ret) {316 ipoib_warn(priv, "failed to init QP attr for RTS: %d\n", ret);317 return 0;318 }319 ret = ib_modify_qp(qp, &qp_attr, qp_attr_mask);320 if (ret) {321 ipoib_warn(priv, "failed to modify QP to RTS: %d\n", ret);322 return 0;323 }324 325 return 0;326}327 328static void ipoib_cm_init_rx_wr(struct net_device *dev,329 struct ib_recv_wr *wr,330 struct ib_sge *sge)331{332 struct ipoib_dev_priv *priv = ipoib_priv(dev);333 int i;334 335 for (i = 0; i < priv->cm.num_frags; ++i)336 sge[i].lkey = priv->pd->local_dma_lkey;337 338 sge[0].length = IPOIB_CM_HEAD_SIZE;339 for (i = 1; i < priv->cm.num_frags; ++i)340 sge[i].length = PAGE_SIZE;341 342 wr->next = NULL;343 wr->sg_list = sge;344 wr->num_sge = priv->cm.num_frags;345}346 347static int ipoib_cm_nonsrq_init_rx(struct net_device *dev, struct ib_cm_id *cm_id,348 struct ipoib_cm_rx *rx)349{350 struct ipoib_dev_priv *priv = ipoib_priv(dev);351 struct {352 struct ib_recv_wr wr;353 struct ib_sge sge[IPOIB_CM_RX_SG];354 } *t;355 int ret;356 int i;357 358 rx->rx_ring = vzalloc(array_size(ipoib_recvq_size,359 sizeof(*rx->rx_ring)));360 if (!rx->rx_ring)361 return -ENOMEM;362 363 t = kmalloc(sizeof(*t), GFP_KERNEL);364 if (!t) {365 ret = -ENOMEM;366 goto err_free_1;367 }368 369 ipoib_cm_init_rx_wr(dev, &t->wr, t->sge);370 371 spin_lock_irq(&priv->lock);372 373 if (priv->cm.nonsrq_conn_qp >= ipoib_max_conn_qp) {374 spin_unlock_irq(&priv->lock);375 ib_send_cm_rej(cm_id, IB_CM_REJ_NO_QP, NULL, 0, NULL, 0);376 ret = -EINVAL;377 goto err_free;378 } else379 ++priv->cm.nonsrq_conn_qp;380 381 spin_unlock_irq(&priv->lock);382 383 for (i = 0; i < ipoib_recvq_size; ++i) {384 if (!ipoib_cm_alloc_rx_skb(dev, rx->rx_ring, i, IPOIB_CM_RX_SG - 1,385 rx->rx_ring[i].mapping,386 GFP_KERNEL)) {387 ipoib_warn(priv, "failed to allocate receive buffer %d\n", i);388 ret = -ENOMEM;389 goto err_count;390 }391 ret = ipoib_cm_post_receive_nonsrq(dev, rx, &t->wr, t->sge, i);392 if (ret) {393 ipoib_warn(priv, "ipoib_cm_post_receive_nonsrq "394 "failed for buf %d\n", i);395 ret = -EIO;396 goto err_count;397 }398 }399 400 rx->recv_count = ipoib_recvq_size;401 402 kfree(t);403 404 return 0;405 406err_count:407 spin_lock_irq(&priv->lock);408 --priv->cm.nonsrq_conn_qp;409 spin_unlock_irq(&priv->lock);410 411err_free:412 kfree(t);413 414err_free_1:415 ipoib_cm_free_rx_ring(dev, rx->rx_ring);416 417 return ret;418}419 420static int ipoib_cm_send_rep(struct net_device *dev, struct ib_cm_id *cm_id,421 struct ib_qp *qp,422 const struct ib_cm_req_event_param *req,423 unsigned int psn)424{425 struct ipoib_dev_priv *priv = ipoib_priv(dev);426 struct ipoib_cm_data data = {};427 struct ib_cm_rep_param rep = {};428 429 data.qpn = cpu_to_be32(priv->qp->qp_num);430 data.mtu = cpu_to_be32(IPOIB_CM_BUF_SIZE);431 432 rep.private_data = &data;433 rep.private_data_len = sizeof(data);434 rep.flow_control = 0;435 rep.rnr_retry_count = req->rnr_retry_count;436 rep.srq = ipoib_cm_has_srq(dev);437 rep.qp_num = qp->qp_num;438 rep.starting_psn = psn;439 return ib_send_cm_rep(cm_id, &rep);440}441 442static int ipoib_cm_req_handler(struct ib_cm_id *cm_id,443 const struct ib_cm_event *event)444{445 struct net_device *dev = cm_id->context;446 struct ipoib_dev_priv *priv = ipoib_priv(dev);447 struct ipoib_cm_rx *p;448 unsigned int psn;449 int ret;450 451 ipoib_dbg(priv, "REQ arrived\n");452 p = kzalloc(sizeof(*p), GFP_KERNEL);453 if (!p)454 return -ENOMEM;455 p->dev = dev;456 p->id = cm_id;457 cm_id->context = p;458 p->state = IPOIB_CM_RX_LIVE;459 p->jiffies = jiffies;460 INIT_LIST_HEAD(&p->list);461 462 p->qp = ipoib_cm_create_rx_qp(dev, p);463 if (IS_ERR(p->qp)) {464 ret = PTR_ERR(p->qp);465 goto err_qp;466 }467 468 psn = get_random_u32() & 0xffffff;469 ret = ipoib_cm_modify_rx_qp(dev, cm_id, p->qp, psn);470 if (ret)471 goto err_modify;472 473 if (!ipoib_cm_has_srq(dev)) {474 ret = ipoib_cm_nonsrq_init_rx(dev, cm_id, p);475 if (ret)476 goto err_modify;477 }478 479 spin_lock_irq(&priv->lock);480 queue_delayed_work(priv->wq,481 &priv->cm.stale_task, IPOIB_CM_RX_DELAY);482 /* Add this entry to passive ids list head, but do not re-add it483 * if IB_EVENT_QP_LAST_WQE_REACHED has moved it to flush list. */484 p->jiffies = jiffies;485 if (p->state == IPOIB_CM_RX_LIVE)486 list_move(&p->list, &priv->cm.passive_ids);487 spin_unlock_irq(&priv->lock);488 489 ret = ipoib_cm_send_rep(dev, cm_id, p->qp, &event->param.req_rcvd, psn);490 if (ret) {491 ipoib_warn(priv, "failed to send REP: %d\n", ret);492 if (ib_modify_qp(p->qp, &ipoib_cm_err_attr, IB_QP_STATE))493 ipoib_warn(priv, "unable to move qp to error state\n");494 }495 return 0;496 497err_modify:498 ib_destroy_qp(p->qp);499err_qp:500 kfree(p);501 return ret;502}503 504static int ipoib_cm_rx_handler(struct ib_cm_id *cm_id,505 const struct ib_cm_event *event)506{507 struct ipoib_cm_rx *p;508 struct ipoib_dev_priv *priv;509 510 switch (event->event) {511 case IB_CM_REQ_RECEIVED:512 return ipoib_cm_req_handler(cm_id, event);513 case IB_CM_DREQ_RECEIVED:514 ib_send_cm_drep(cm_id, NULL, 0);515 fallthrough;516 case IB_CM_REJ_RECEIVED:517 p = cm_id->context;518 priv = ipoib_priv(p->dev);519 if (ib_modify_qp(p->qp, &ipoib_cm_err_attr, IB_QP_STATE))520 ipoib_warn(priv, "unable to move qp to error state\n");521 fallthrough;522 default:523 return 0;524 }525}526/* Adjust length of skb with fragments to match received data */527static void skb_put_frags(struct sk_buff *skb, unsigned int hdr_space,528 unsigned int length, struct sk_buff *toskb)529{530 int i, num_frags;531 unsigned int size;532 533 /* put header into skb */534 size = min(length, hdr_space);535 skb->tail += size;536 skb->len += size;537 length -= size;538 539 num_frags = skb_shinfo(skb)->nr_frags;540 for (i = 0; i < num_frags; i++) {541 skb_frag_t *frag = &skb_shinfo(skb)->frags[i];542 543 if (length == 0) {544 /* don't need this page */545 skb_fill_page_desc(toskb, i, skb_frag_page(frag),546 0, PAGE_SIZE);547 --skb_shinfo(skb)->nr_frags;548 } else {549 size = min_t(unsigned int, length, PAGE_SIZE);550 551 skb_frag_size_set(frag, size);552 skb->data_len += size;553 skb->truesize += size;554 skb->len += size;555 length -= size;556 }557 }558}559 560void ipoib_cm_handle_rx_wc(struct net_device *dev, struct ib_wc *wc)561{562 struct ipoib_dev_priv *priv = ipoib_priv(dev);563 struct ipoib_cm_rx_buf *rx_ring;564 unsigned int wr_id = wc->wr_id & ~(IPOIB_OP_CM | IPOIB_OP_RECV);565 struct sk_buff *skb, *newskb;566 struct ipoib_cm_rx *p;567 unsigned long flags;568 u64 mapping[IPOIB_CM_RX_SG];569 int frags;570 int has_srq;571 struct sk_buff *small_skb;572 573 ipoib_dbg_data(priv, "cm recv completion: id %d, status: %d\n",574 wr_id, wc->status);575 576 if (unlikely(wr_id >= ipoib_recvq_size)) {577 if (wr_id == (IPOIB_CM_RX_DRAIN_WRID & ~(IPOIB_OP_CM | IPOIB_OP_RECV))) {578 spin_lock_irqsave(&priv->lock, flags);579 list_splice_init(&priv->cm.rx_drain_list, &priv->cm.rx_reap_list);580 ipoib_cm_start_rx_drain(priv);581 queue_work(priv->wq, &priv->cm.rx_reap_task);582 spin_unlock_irqrestore(&priv->lock, flags);583 } else584 ipoib_warn(priv, "cm recv completion event with wrid %d (> %d)\n",585 wr_id, ipoib_recvq_size);586 return;587 }588 589 p = wc->qp->qp_context;590 591 has_srq = ipoib_cm_has_srq(dev);592 rx_ring = has_srq ? priv->cm.srq_ring : p->rx_ring;593 594 skb = rx_ring[wr_id].skb;595 596 if (unlikely(wc->status != IB_WC_SUCCESS)) {597 ipoib_dbg(priv,598 "cm recv error (status=%d, wrid=%d vend_err %#x)\n",599 wc->status, wr_id, wc->vendor_err);600 ++dev->stats.rx_dropped;601 if (has_srq)602 goto repost;603 else {604 if (!--p->recv_count) {605 spin_lock_irqsave(&priv->lock, flags);606 list_move(&p->list, &priv->cm.rx_reap_list);607 spin_unlock_irqrestore(&priv->lock, flags);608 queue_work(priv->wq, &priv->cm.rx_reap_task);609 }610 return;611 }612 }613 614 if (unlikely(!(wr_id & IPOIB_CM_RX_UPDATE_MASK))) {615 if (p && time_after_eq(jiffies, p->jiffies + IPOIB_CM_RX_UPDATE_TIME)) {616 spin_lock_irqsave(&priv->lock, flags);617 p->jiffies = jiffies;618 /* Move this entry to list head, but do not re-add it619 * if it has been moved out of list. */620 if (p->state == IPOIB_CM_RX_LIVE)621 list_move(&p->list, &priv->cm.passive_ids);622 spin_unlock_irqrestore(&priv->lock, flags);623 }624 }625 626 if (wc->byte_len < IPOIB_CM_COPYBREAK) {627 int dlen = wc->byte_len;628 629 small_skb = dev_alloc_skb(dlen + IPOIB_CM_RX_RESERVE);630 if (small_skb) {631 skb_reserve(small_skb, IPOIB_CM_RX_RESERVE);632 ib_dma_sync_single_for_cpu(priv->ca, rx_ring[wr_id].mapping[0],633 dlen, DMA_FROM_DEVICE);634 skb_copy_from_linear_data(skb, small_skb->data, dlen);635 ib_dma_sync_single_for_device(priv->ca, rx_ring[wr_id].mapping[0],636 dlen, DMA_FROM_DEVICE);637 skb_put(small_skb, dlen);638 skb = small_skb;639 goto copied;640 }641 }642 643 frags = PAGE_ALIGN(wc->byte_len -644 min_t(u32, wc->byte_len, IPOIB_CM_HEAD_SIZE)) /645 PAGE_SIZE;646 647 newskb = ipoib_cm_alloc_rx_skb(dev, rx_ring, wr_id, frags,648 mapping, GFP_ATOMIC);649 if (unlikely(!newskb)) {650 /*651 * If we can't allocate a new RX buffer, dump652 * this packet and reuse the old buffer.653 */654 ipoib_dbg(priv, "failed to allocate receive buffer %d\n", wr_id);655 ++dev->stats.rx_dropped;656 goto repost;657 }658 659 ipoib_cm_dma_unmap_rx(priv, frags, rx_ring[wr_id].mapping);660 memcpy(rx_ring[wr_id].mapping, mapping, (frags + 1) * sizeof(*mapping));661 662 ipoib_dbg_data(priv, "received %d bytes, SLID 0x%04x\n",663 wc->byte_len, wc->slid);664 665 skb_put_frags(skb, IPOIB_CM_HEAD_SIZE, wc->byte_len, newskb);666 667copied:668 skb->protocol = ((struct ipoib_header *) skb->data)->proto;669 skb_add_pseudo_hdr(skb);670 671 ++dev->stats.rx_packets;672 dev->stats.rx_bytes += skb->len;673 674 skb->dev = dev;675 /* XXX get correct PACKET_ type here */676 skb->pkt_type = PACKET_HOST;677 netif_receive_skb(skb);678 679repost:680 if (has_srq) {681 if (unlikely(ipoib_cm_post_receive_srq(dev, wr_id)))682 ipoib_warn(priv, "ipoib_cm_post_receive_srq failed "683 "for buf %d\n", wr_id);684 } else {685 if (unlikely(ipoib_cm_post_receive_nonsrq(dev, p,686 &priv->cm.rx_wr,687 priv->cm.rx_sge,688 wr_id))) {689 --p->recv_count;690 ipoib_warn(priv, "ipoib_cm_post_receive_nonsrq failed "691 "for buf %d\n", wr_id);692 }693 }694}695 696static inline int post_send(struct ipoib_dev_priv *priv,697 struct ipoib_cm_tx *tx,698 unsigned int wr_id,699 struct ipoib_tx_buf *tx_req)700{701 ipoib_build_sge(priv, tx_req);702 703 priv->tx_wr.wr.wr_id = wr_id | IPOIB_OP_CM;704 705 return ib_post_send(tx->qp, &priv->tx_wr.wr, NULL);706}707 708void ipoib_cm_send(struct net_device *dev, struct sk_buff *skb, struct ipoib_cm_tx *tx)709{710 struct ipoib_dev_priv *priv = ipoib_priv(dev);711 struct ipoib_tx_buf *tx_req;712 int rc;713 unsigned int usable_sge = tx->max_send_sge - !!skb_headlen(skb);714 715 if (unlikely(skb->len > tx->mtu)) {716 ipoib_warn(priv, "packet len %d (> %d) too long to send, dropping\n",717 skb->len, tx->mtu);718 ++dev->stats.tx_dropped;719 ++dev->stats.tx_errors;720 ipoib_cm_skb_too_long(dev, skb, tx->mtu - IPOIB_ENCAP_LEN);721 return;722 }723 if (skb_shinfo(skb)->nr_frags > usable_sge) {724 if (skb_linearize(skb) < 0) {725 ipoib_warn(priv, "skb could not be linearized\n");726 ++dev->stats.tx_dropped;727 ++dev->stats.tx_errors;728 dev_kfree_skb_any(skb);729 return;730 }731 /* Does skb_linearize return ok without reducing nr_frags? */732 if (skb_shinfo(skb)->nr_frags > usable_sge) {733 ipoib_warn(priv, "too many frags after skb linearize\n");734 ++dev->stats.tx_dropped;735 ++dev->stats.tx_errors;736 dev_kfree_skb_any(skb);737 return;738 }739 }740 ipoib_dbg_data(priv, "sending packet: head 0x%x length %d connection 0x%x\n",741 tx->tx_head, skb->len, tx->qp->qp_num);742 743 /*744 * We put the skb into the tx_ring _before_ we call post_send()745 * because it's entirely possible that the completion handler will746 * run before we execute anything after the post_send(). That747 * means we have to make sure everything is properly recorded and748 * our state is consistent before we call post_send().749 */750 tx_req = &tx->tx_ring[tx->tx_head & (ipoib_sendq_size - 1)];751 tx_req->skb = skb;752 753 if (unlikely(ipoib_dma_map_tx(priv->ca, tx_req))) {754 ++dev->stats.tx_errors;755 dev_kfree_skb_any(skb);756 return;757 }758 759 if ((priv->global_tx_head - priv->global_tx_tail) ==760 ipoib_sendq_size - 1) {761 ipoib_dbg(priv, "TX ring 0x%x full, stopping kernel net queue\n",762 tx->qp->qp_num);763 netif_stop_queue(dev);764 }765 766 skb_orphan(skb);767 skb_dst_drop(skb);768 769 if (netif_queue_stopped(dev)) {770 rc = ib_req_notify_cq(priv->send_cq, IB_CQ_NEXT_COMP |771 IB_CQ_REPORT_MISSED_EVENTS);772 if (unlikely(rc < 0))773 ipoib_warn(priv, "IPoIB/CM:request notify on send CQ failed\n");774 else if (rc)775 napi_schedule(&priv->send_napi);776 }777 778 rc = post_send(priv, tx, tx->tx_head & (ipoib_sendq_size - 1), tx_req);779 if (unlikely(rc)) {780 ipoib_warn(priv, "IPoIB/CM:post_send failed, error %d\n", rc);781 ++dev->stats.tx_errors;782 ipoib_dma_unmap_tx(priv, tx_req);783 dev_kfree_skb_any(skb);784 785 if (netif_queue_stopped(dev))786 netif_wake_queue(dev);787 } else {788 netif_trans_update(dev);789 ++tx->tx_head;790 ++priv->global_tx_head;791 }792}793 794void ipoib_cm_handle_tx_wc(struct net_device *dev, struct ib_wc *wc)795{796 struct ipoib_dev_priv *priv = ipoib_priv(dev);797 struct ipoib_cm_tx *tx = wc->qp->qp_context;798 unsigned int wr_id = wc->wr_id & ~IPOIB_OP_CM;799 struct ipoib_tx_buf *tx_req;800 unsigned long flags;801 802 ipoib_dbg_data(priv, "cm send completion: id %d, status: %d\n",803 wr_id, wc->status);804 805 if (unlikely(wr_id >= ipoib_sendq_size)) {806 ipoib_warn(priv, "cm send completion event with wrid %d (> %d)\n",807 wr_id, ipoib_sendq_size);808 return;809 }810 811 tx_req = &tx->tx_ring[wr_id];812 813 ipoib_dma_unmap_tx(priv, tx_req);814 815 /* FIXME: is this right? Shouldn't we only increment on success? */816 ++dev->stats.tx_packets;817 dev->stats.tx_bytes += tx_req->skb->len;818 819 dev_kfree_skb_any(tx_req->skb);820 821 netif_tx_lock(dev);822 823 ++tx->tx_tail;824 ++priv->global_tx_tail;825 826 if (unlikely(netif_queue_stopped(dev) &&827 ((priv->global_tx_head - priv->global_tx_tail) <=828 ipoib_sendq_size >> 1) &&829 test_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags)))830 netif_wake_queue(dev);831 832 if (wc->status != IB_WC_SUCCESS &&833 wc->status != IB_WC_WR_FLUSH_ERR) {834 struct ipoib_neigh *neigh;835 836 /* IB_WC[_RNR]_RETRY_EXC_ERR error is part of the life cycle,837 * so don't make waves.838 */839 if (wc->status == IB_WC_RNR_RETRY_EXC_ERR ||840 wc->status == IB_WC_RETRY_EXC_ERR)841 ipoib_dbg(priv,842 "%s: failed cm send event (status=%d, wrid=%d vend_err %#x)\n",843 __func__, wc->status, wr_id, wc->vendor_err);844 else845 ipoib_warn(priv,846 "%s: failed cm send event (status=%d, wrid=%d vend_err %#x)\n",847 __func__, wc->status, wr_id, wc->vendor_err);848 849 spin_lock_irqsave(&priv->lock, flags);850 neigh = tx->neigh;851 852 if (neigh) {853 neigh->cm = NULL;854 ipoib_neigh_free(neigh);855 856 tx->neigh = NULL;857 }858 859 if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &tx->flags)) {860 list_move(&tx->list, &priv->cm.reap_list);861 queue_work(priv->wq, &priv->cm.reap_task);862 }863 864 clear_bit(IPOIB_FLAG_OPER_UP, &tx->flags);865 866 spin_unlock_irqrestore(&priv->lock, flags);867 }868 869 netif_tx_unlock(dev);870}871 872int ipoib_cm_dev_open(struct net_device *dev)873{874 struct ipoib_dev_priv *priv = ipoib_priv(dev);875 int ret;876 877 if (!IPOIB_CM_SUPPORTED(dev->dev_addr))878 return 0;879 880 priv->cm.id = ib_create_cm_id(priv->ca, ipoib_cm_rx_handler, dev);881 if (IS_ERR(priv->cm.id)) {882 pr_warn("%s: failed to create CM ID\n", priv->ca->name);883 ret = PTR_ERR(priv->cm.id);884 goto err_cm;885 }886 887 ret = ib_cm_listen(priv->cm.id,888 cpu_to_be64(IPOIB_CM_IETF_ID | priv->qp->qp_num));889 if (ret) {890 pr_warn("%s: failed to listen on ID 0x%llx\n", priv->ca->name,891 IPOIB_CM_IETF_ID | priv->qp->qp_num);892 goto err_listen;893 }894 895 return 0;896 897err_listen:898 ib_destroy_cm_id(priv->cm.id);899err_cm:900 priv->cm.id = NULL;901 return ret;902}903 904static void ipoib_cm_free_rx_reap_list(struct net_device *dev)905{906 struct ipoib_dev_priv *priv = ipoib_priv(dev);907 struct ipoib_cm_rx *rx, *n;908 LIST_HEAD(list);909 910 spin_lock_irq(&priv->lock);911 list_splice_init(&priv->cm.rx_reap_list, &list);912 spin_unlock_irq(&priv->lock);913 914 list_for_each_entry_safe(rx, n, &list, list) {915 ib_destroy_cm_id(rx->id);916 ib_destroy_qp(rx->qp);917 if (!ipoib_cm_has_srq(dev)) {918 ipoib_cm_free_rx_ring(priv->dev, rx->rx_ring);919 spin_lock_irq(&priv->lock);920 --priv->cm.nonsrq_conn_qp;921 spin_unlock_irq(&priv->lock);922 }923 kfree(rx);924 }925}926 927void ipoib_cm_dev_stop(struct net_device *dev)928{929 struct ipoib_dev_priv *priv = ipoib_priv(dev);930 struct ipoib_cm_rx *p;931 unsigned long begin;932 int ret;933 934 if (!IPOIB_CM_SUPPORTED(dev->dev_addr) || !priv->cm.id)935 return;936 937 ib_destroy_cm_id(priv->cm.id);938 priv->cm.id = NULL;939 940 spin_lock_irq(&priv->lock);941 while (!list_empty(&priv->cm.passive_ids)) {942 p = list_entry(priv->cm.passive_ids.next, typeof(*p), list);943 list_move(&p->list, &priv->cm.rx_error_list);944 p->state = IPOIB_CM_RX_ERROR;945 spin_unlock_irq(&priv->lock);946 ret = ib_modify_qp(p->qp, &ipoib_cm_err_attr, IB_QP_STATE);947 if (ret)948 ipoib_warn(priv, "unable to move qp to error state: %d\n", ret);949 spin_lock_irq(&priv->lock);950 }951 952 /* Wait for all RX to be drained */953 begin = jiffies;954 955 while (!list_empty(&priv->cm.rx_error_list) ||956 !list_empty(&priv->cm.rx_flush_list) ||957 !list_empty(&priv->cm.rx_drain_list)) {958 if (time_after(jiffies, begin + 5 * HZ)) {959 ipoib_warn(priv, "RX drain timing out\n");960 961 /*962 * assume the HW is wedged and just free up everything.963 */964 list_splice_init(&priv->cm.rx_flush_list,965 &priv->cm.rx_reap_list);966 list_splice_init(&priv->cm.rx_error_list,967 &priv->cm.rx_reap_list);968 list_splice_init(&priv->cm.rx_drain_list,969 &priv->cm.rx_reap_list);970 break;971 }972 spin_unlock_irq(&priv->lock);973 usleep_range(1000, 2000);974 ipoib_drain_cq(dev);975 spin_lock_irq(&priv->lock);976 }977 978 spin_unlock_irq(&priv->lock);979 980 ipoib_cm_free_rx_reap_list(dev);981 982 cancel_delayed_work(&priv->cm.stale_task);983}984 985static int ipoib_cm_rep_handler(struct ib_cm_id *cm_id,986 const struct ib_cm_event *event)987{988 struct ipoib_cm_tx *p = cm_id->context;989 struct ipoib_dev_priv *priv = ipoib_priv(p->dev);990 struct ipoib_cm_data *data = event->private_data;991 struct sk_buff_head skqueue;992 struct ib_qp_attr qp_attr;993 int qp_attr_mask, ret;994 struct sk_buff *skb;995 996 p->mtu = be32_to_cpu(data->mtu);997 998 if (p->mtu <= IPOIB_ENCAP_LEN) {999 ipoib_warn(priv, "Rejecting connection: mtu %d <= %d\n",1000 p->mtu, IPOIB_ENCAP_LEN);1001 return -EINVAL;1002 }1003 1004 qp_attr.qp_state = IB_QPS_RTR;1005 ret = ib_cm_init_qp_attr(cm_id, &qp_attr, &qp_attr_mask);1006 if (ret) {1007 ipoib_warn(priv, "failed to init QP attr for RTR: %d\n", ret);1008 return ret;1009 }1010 1011 qp_attr.rq_psn = 0 /* FIXME */;1012 ret = ib_modify_qp(p->qp, &qp_attr, qp_attr_mask);1013 if (ret) {1014 ipoib_warn(priv, "failed to modify QP to RTR: %d\n", ret);1015 return ret;1016 }1017 1018 qp_attr.qp_state = IB_QPS_RTS;1019 ret = ib_cm_init_qp_attr(cm_id, &qp_attr, &qp_attr_mask);1020 if (ret) {1021 ipoib_warn(priv, "failed to init QP attr for RTS: %d\n", ret);1022 return ret;1023 }1024 ret = ib_modify_qp(p->qp, &qp_attr, qp_attr_mask);1025 if (ret) {1026 ipoib_warn(priv, "failed to modify QP to RTS: %d\n", ret);1027 return ret;1028 }1029 1030 skb_queue_head_init(&skqueue);1031 1032 netif_tx_lock_bh(p->dev);1033 spin_lock_irq(&priv->lock);1034 set_bit(IPOIB_FLAG_OPER_UP, &p->flags);1035 if (p->neigh)1036 while ((skb = __skb_dequeue(&p->neigh->queue)))1037 __skb_queue_tail(&skqueue, skb);1038 spin_unlock_irq(&priv->lock);1039 netif_tx_unlock_bh(p->dev);1040 1041 while ((skb = __skb_dequeue(&skqueue))) {1042 skb->dev = p->dev;1043 ret = dev_queue_xmit(skb);1044 if (ret)1045 ipoib_warn(priv, "%s:dev_queue_xmit failed to re-queue packet, ret:%d\n",1046 __func__, ret);1047 }1048 1049 ret = ib_send_cm_rtu(cm_id, NULL, 0);1050 if (ret) {1051 ipoib_warn(priv, "failed to send RTU: %d\n", ret);1052 return ret;1053 }1054 return 0;1055}1056 1057static struct ib_qp *ipoib_cm_create_tx_qp(struct net_device *dev, struct ipoib_cm_tx *tx)1058{1059 struct ipoib_dev_priv *priv = ipoib_priv(dev);1060 struct ib_qp_init_attr attr = {1061 .send_cq = priv->send_cq,1062 .recv_cq = priv->recv_cq,1063 .srq = priv->cm.srq,1064 .cap.max_send_wr = ipoib_sendq_size,1065 .cap.max_send_sge = 1,1066 .sq_sig_type = IB_SIGNAL_ALL_WR,1067 .qp_type = IB_QPT_RC,1068 .qp_context = tx,1069 .create_flags = 01070 };1071 struct ib_qp *tx_qp;1072 1073 if (dev->features & NETIF_F_SG)1074 attr.cap.max_send_sge = min_t(u32, priv->ca->attrs.max_send_sge,1075 MAX_SKB_FRAGS + 1);1076 1077 tx_qp = ib_create_qp(priv->pd, &attr);1078 tx->max_send_sge = attr.cap.max_send_sge;1079 return tx_qp;1080}1081 1082static int ipoib_cm_send_req(struct net_device *dev,1083 struct ib_cm_id *id, struct ib_qp *qp,1084 u32 qpn,1085 struct sa_path_rec *pathrec)1086{1087 struct ipoib_dev_priv *priv = ipoib_priv(dev);1088 struct ipoib_cm_data data = {};1089 struct ib_cm_req_param req = {};1090 1091 data.qpn = cpu_to_be32(priv->qp->qp_num);1092 data.mtu = cpu_to_be32(IPOIB_CM_BUF_SIZE);1093 1094 req.primary_path = pathrec;1095 req.alternate_path = NULL;1096 req.service_id = cpu_to_be64(IPOIB_CM_IETF_ID | qpn);1097 req.qp_num = qp->qp_num;1098 req.qp_type = qp->qp_type;1099 req.private_data = &data;1100 req.private_data_len = sizeof(data);1101 req.flow_control = 0;1102 1103 req.starting_psn = 0; /* FIXME */1104 1105 /*1106 * Pick some arbitrary defaults here; we could make these1107 * module parameters if anyone cared about setting them.1108 */1109 req.responder_resources = 4;1110 req.remote_cm_response_timeout = 20;1111 req.local_cm_response_timeout = 20;1112 req.retry_count = 0; /* RFC draft warns against retries */1113 req.rnr_retry_count = 0; /* RFC draft warns against retries */1114 req.max_cm_retries = 15;1115 req.srq = ipoib_cm_has_srq(dev);1116 return ib_send_cm_req(id, &req);1117}1118 1119static int ipoib_cm_modify_tx_init(struct net_device *dev,1120 struct ib_cm_id *cm_id, struct ib_qp *qp)1121{1122 struct ipoib_dev_priv *priv = ipoib_priv(dev);1123 struct ib_qp_attr qp_attr;1124 int qp_attr_mask, ret;1125 1126 qp_attr.pkey_index = priv->pkey_index;1127 qp_attr.qp_state = IB_QPS_INIT;1128 qp_attr.qp_access_flags = IB_ACCESS_LOCAL_WRITE;1129 qp_attr.port_num = priv->port;1130 qp_attr_mask = IB_QP_STATE | IB_QP_ACCESS_FLAGS | IB_QP_PKEY_INDEX | IB_QP_PORT;1131 1132 ret = ib_modify_qp(qp, &qp_attr, qp_attr_mask);1133 if (ret) {1134 ipoib_warn(priv, "failed to modify tx QP to INIT: %d\n", ret);1135 return ret;1136 }1137 return 0;1138}1139 1140static int ipoib_cm_tx_init(struct ipoib_cm_tx *p, u32 qpn,1141 struct sa_path_rec *pathrec)1142{1143 struct ipoib_dev_priv *priv = ipoib_priv(p->dev);1144 unsigned int noio_flag;1145 int ret;1146 1147 noio_flag = memalloc_noio_save();1148 p->tx_ring = vzalloc(array_size(ipoib_sendq_size, sizeof(*p->tx_ring)));1149 if (!p->tx_ring) {1150 memalloc_noio_restore(noio_flag);1151 ret = -ENOMEM;1152 goto err_tx;1153 }1154 1155 p->qp = ipoib_cm_create_tx_qp(p->dev, p);1156 memalloc_noio_restore(noio_flag);1157 if (IS_ERR(p->qp)) {1158 ret = PTR_ERR(p->qp);1159 ipoib_warn(priv, "failed to create tx qp: %d\n", ret);1160 goto err_qp;1161 }1162 1163 p->id = ib_create_cm_id(priv->ca, ipoib_cm_tx_handler, p);1164 if (IS_ERR(p->id)) {1165 ret = PTR_ERR(p->id);1166 ipoib_warn(priv, "failed to create tx cm id: %d\n", ret);1167 goto err_id;1168 }1169 1170 ret = ipoib_cm_modify_tx_init(p->dev, p->id, p->qp);1171 if (ret) {1172 ipoib_warn(priv, "failed to modify tx qp to rtr: %d\n", ret);1173 goto err_modify_send;1174 }1175 1176 ret = ipoib_cm_send_req(p->dev, p->id, p->qp, qpn, pathrec);1177 if (ret) {1178 ipoib_warn(priv, "failed to send cm req: %d\n", ret);1179 goto err_modify_send;1180 }1181 1182 ipoib_dbg(priv, "Request connection 0x%x for gid %pI6 qpn 0x%x\n",1183 p->qp->qp_num, pathrec->dgid.raw, qpn);1184 1185 return 0;1186 1187err_modify_send:1188 ib_destroy_cm_id(p->id);1189err_id:1190 p->id = NULL;1191 ib_destroy_qp(p->qp);1192err_qp:1193 p->qp = NULL;1194 vfree(p->tx_ring);1195err_tx:1196 return ret;1197}1198 1199static void ipoib_cm_tx_destroy(struct ipoib_cm_tx *p)1200{1201 struct ipoib_dev_priv *priv = ipoib_priv(p->dev);1202 struct ipoib_tx_buf *tx_req;1203 unsigned long begin;1204 1205 ipoib_dbg(priv, "Destroy active connection 0x%x head 0x%x tail 0x%x\n",1206 p->qp ? p->qp->qp_num : 0, p->tx_head, p->tx_tail);1207 1208 if (p->id)1209 ib_destroy_cm_id(p->id);1210 1211 if (p->tx_ring) {1212 /* Wait for all sends to complete */1213 begin = jiffies;1214 while ((int) p->tx_tail - (int) p->tx_head < 0) {1215 if (time_after(jiffies, begin + 5 * HZ)) {1216 ipoib_warn(priv, "timing out; %d sends not completed\n",1217 p->tx_head - p->tx_tail);1218 goto timeout;1219 }1220 1221 usleep_range(1000, 2000);1222 }1223 }1224 1225timeout:1226 1227 while ((int) p->tx_tail - (int) p->tx_head < 0) {1228 tx_req = &p->tx_ring[p->tx_tail & (ipoib_sendq_size - 1)];1229 ipoib_dma_unmap_tx(priv, tx_req);1230 dev_kfree_skb_any(tx_req->skb);1231 netif_tx_lock_bh(p->dev);1232 ++p->tx_tail;1233 ++priv->global_tx_tail;1234 if (unlikely((priv->global_tx_head - priv->global_tx_tail) <=1235 ipoib_sendq_size >> 1) &&1236 netif_queue_stopped(p->dev) &&1237 test_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags))1238 netif_wake_queue(p->dev);1239 netif_tx_unlock_bh(p->dev);1240 }1241 1242 if (p->qp)1243 ib_destroy_qp(p->qp);1244 1245 vfree(p->tx_ring);1246 kfree(p);1247}1248 1249static int ipoib_cm_tx_handler(struct ib_cm_id *cm_id,1250 const struct ib_cm_event *event)1251{1252 struct ipoib_cm_tx *tx = cm_id->context;1253 struct ipoib_dev_priv *priv = ipoib_priv(tx->dev);1254 struct net_device *dev = priv->dev;1255 struct ipoib_neigh *neigh;1256 unsigned long flags;1257 int ret;1258 1259 switch (event->event) {1260 case IB_CM_DREQ_RECEIVED:1261 ipoib_dbg(priv, "DREQ received.\n");1262 ib_send_cm_drep(cm_id, NULL, 0);1263 break;1264 case IB_CM_REP_RECEIVED:1265 ipoib_dbg(priv, "REP received.\n");1266 ret = ipoib_cm_rep_handler(cm_id, event);1267 if (ret)1268 ib_send_cm_rej(cm_id, IB_CM_REJ_CONSUMER_DEFINED,1269 NULL, 0, NULL, 0);1270 break;1271 case IB_CM_REQ_ERROR:1272 case IB_CM_REJ_RECEIVED:1273 case IB_CM_TIMEWAIT_EXIT:1274 ipoib_dbg(priv, "CM error %d.\n", event->event);1275 netif_tx_lock_bh(dev);1276 spin_lock_irqsave(&priv->lock, flags);1277 neigh = tx->neigh;1278 1279 if (neigh) {1280 neigh->cm = NULL;1281 ipoib_neigh_free(neigh);1282 1283 tx->neigh = NULL;1284 }1285 1286 if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &tx->flags)) {1287 list_move(&tx->list, &priv->cm.reap_list);1288 queue_work(priv->wq, &priv->cm.reap_task);1289 }1290 1291 spin_unlock_irqrestore(&priv->lock, flags);1292 netif_tx_unlock_bh(dev);1293 break;1294 default:1295 break;1296 }1297 1298 return 0;1299}1300 1301struct ipoib_cm_tx *ipoib_cm_create_tx(struct net_device *dev, struct ipoib_path *path,1302 struct ipoib_neigh *neigh)1303{1304 struct ipoib_dev_priv *priv = ipoib_priv(dev);1305 struct ipoib_cm_tx *tx;1306 1307 tx = kzalloc(sizeof(*tx), GFP_ATOMIC);1308 if (!tx)1309 return NULL;1310 1311 neigh->cm = tx;1312 tx->neigh = neigh;1313 tx->dev = dev;1314 list_add(&tx->list, &priv->cm.start_list);1315 set_bit(IPOIB_FLAG_INITIALIZED, &tx->flags);1316 queue_work(priv->wq, &priv->cm.start_task);1317 return tx;1318}1319 1320void ipoib_cm_destroy_tx(struct ipoib_cm_tx *tx)1321{1322 struct ipoib_dev_priv *priv = ipoib_priv(tx->dev);1323 unsigned long flags;1324 if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &tx->flags)) {1325 spin_lock_irqsave(&priv->lock, flags);1326 list_move(&tx->list, &priv->cm.reap_list);1327 queue_work(priv->wq, &priv->cm.reap_task);1328 ipoib_dbg(priv, "Reap connection for gid %pI6\n",1329 tx->neigh->daddr + 4);1330 tx->neigh = NULL;1331 spin_unlock_irqrestore(&priv->lock, flags);1332 }1333}1334 1335#define QPN_AND_OPTIONS_OFFSET 41336 1337static void ipoib_cm_tx_start(struct work_struct *work)1338{1339 struct ipoib_dev_priv *priv = container_of(work, struct ipoib_dev_priv,1340 cm.start_task);1341 struct net_device *dev = priv->dev;1342 struct ipoib_neigh *neigh;1343 struct ipoib_cm_tx *p;1344 unsigned long flags;1345 struct ipoib_path *path;1346 int ret;1347 1348 struct sa_path_rec pathrec;1349 u32 qpn;1350 1351 netif_tx_lock_bh(dev);1352 spin_lock_irqsave(&priv->lock, flags);1353 1354 while (!list_empty(&priv->cm.start_list)) {1355 p = list_entry(priv->cm.start_list.next, typeof(*p), list);1356 list_del_init(&p->list);1357 neigh = p->neigh;1358 1359 qpn = IPOIB_QPN(neigh->daddr);1360 /*1361 * As long as the search is with these 2 locks,1362 * path existence indicates its validity.1363 */1364 path = __path_find(dev, neigh->daddr + QPN_AND_OPTIONS_OFFSET);1365 if (!path) {1366 pr_info("%s ignore not valid path %pI6\n",1367 __func__,1368 neigh->daddr + QPN_AND_OPTIONS_OFFSET);1369 goto free_neigh;1370 }1371 memcpy(&pathrec, &path->pathrec, sizeof(pathrec));1372 1373 spin_unlock_irqrestore(&priv->lock, flags);1374 netif_tx_unlock_bh(dev);1375 1376 ret = ipoib_cm_tx_init(p, qpn, &pathrec);1377 1378 netif_tx_lock_bh(dev);1379 spin_lock_irqsave(&priv->lock, flags);1380 1381 if (ret) {1382free_neigh:1383 neigh = p->neigh;1384 if (neigh) {1385 neigh->cm = NULL;1386 ipoib_neigh_free(neigh);1387 }1388 list_del(&p->list);1389 kfree(p);1390 }1391 }1392 1393 spin_unlock_irqrestore(&priv->lock, flags);1394 netif_tx_unlock_bh(dev);1395}1396 1397static void ipoib_cm_tx_reap(struct work_struct *work)1398{1399 struct ipoib_dev_priv *priv = container_of(work, struct ipoib_dev_priv,1400 cm.reap_task);1401 struct net_device *dev = priv->dev;1402 struct ipoib_cm_tx *p;1403 unsigned long flags;1404 1405 netif_tx_lock_bh(dev);1406 spin_lock_irqsave(&priv->lock, flags);1407 1408 while (!list_empty(&priv->cm.reap_list)) {1409 p = list_entry(priv->cm.reap_list.next, typeof(*p), list);1410 list_del_init(&p->list);1411 spin_unlock_irqrestore(&priv->lock, flags);1412 netif_tx_unlock_bh(dev);1413 ipoib_cm_tx_destroy(p);1414 netif_tx_lock_bh(dev);1415 spin_lock_irqsave(&priv->lock, flags);1416 }1417 1418 spin_unlock_irqrestore(&priv->lock, flags);1419 netif_tx_unlock_bh(dev);1420}1421 1422static void ipoib_cm_skb_reap(struct work_struct *work)1423{1424 struct ipoib_dev_priv *priv = container_of(work, struct ipoib_dev_priv,1425 cm.skb_task);1426 struct net_device *dev = priv->dev;1427 struct sk_buff *skb;1428 unsigned long flags;1429 unsigned int mtu = priv->mcast_mtu;1430 1431 netif_tx_lock_bh(dev);1432 spin_lock_irqsave(&priv->lock, flags);1433 1434 while ((skb = skb_dequeue(&priv->cm.skb_queue))) {1435 spin_unlock_irqrestore(&priv->lock, flags);1436 netif_tx_unlock_bh(dev);1437 1438 if (skb->protocol == htons(ETH_P_IP)) {1439 memset(IPCB(skb), 0, sizeof(*IPCB(skb)));1440 icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED, htonl(mtu));1441 }1442#if IS_ENABLED(CONFIG_IPV6)1443 else if (skb->protocol == htons(ETH_P_IPV6)) {1444 memset(IP6CB(skb), 0, sizeof(*IP6CB(skb)));1445 icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu);1446 }1447#endif1448 dev_kfree_skb_any(skb);1449 1450 netif_tx_lock_bh(dev);1451 spin_lock_irqsave(&priv->lock, flags);1452 }1453 1454 spin_unlock_irqrestore(&priv->lock, flags);1455 netif_tx_unlock_bh(dev);1456}1457 1458void ipoib_cm_skb_too_long(struct net_device *dev, struct sk_buff *skb,1459 unsigned int mtu)1460{1461 struct ipoib_dev_priv *priv = ipoib_priv(dev);1462 int e = skb_queue_empty(&priv->cm.skb_queue);1463 1464 skb_dst_update_pmtu(skb, mtu);1465 1466 skb_queue_tail(&priv->cm.skb_queue, skb);1467 if (e)1468 queue_work(priv->wq, &priv->cm.skb_task);1469}1470 1471static void ipoib_cm_rx_reap(struct work_struct *work)1472{1473 ipoib_cm_free_rx_reap_list(container_of(work, struct ipoib_dev_priv,1474 cm.rx_reap_task)->dev);1475}1476 1477static void ipoib_cm_stale_task(struct work_struct *work)1478{1479 struct ipoib_dev_priv *priv = container_of(work, struct ipoib_dev_priv,1480 cm.stale_task.work);1481 struct ipoib_cm_rx *p;1482 int ret;1483 1484 spin_lock_irq(&priv->lock);1485 while (!list_empty(&priv->cm.passive_ids)) {1486 /* List is sorted by LRU, start from tail,1487 * stop when we see a recently used entry */1488 p = list_entry(priv->cm.passive_ids.prev, typeof(*p), list);1489 if (time_before_eq(jiffies, p->jiffies + IPOIB_CM_RX_TIMEOUT))1490 break;1491 list_move(&p->list, &priv->cm.rx_error_list);1492 p->state = IPOIB_CM_RX_ERROR;1493 spin_unlock_irq(&priv->lock);1494 ret = ib_modify_qp(p->qp, &ipoib_cm_err_attr, IB_QP_STATE);1495 if (ret)1496 ipoib_warn(priv, "unable to move qp to error state: %d\n", ret);1497 spin_lock_irq(&priv->lock);1498 }1499 1500 if (!list_empty(&priv->cm.passive_ids))1501 queue_delayed_work(priv->wq,1502 &priv->cm.stale_task, IPOIB_CM_RX_DELAY);1503 spin_unlock_irq(&priv->lock);1504}1505 1506static ssize_t mode_show(struct device *d, struct device_attribute *attr,1507 char *buf)1508{1509 struct net_device *dev = to_net_dev(d);1510 struct ipoib_dev_priv *priv = ipoib_priv(dev);1511 1512 if (test_bit(IPOIB_FLAG_ADMIN_CM, &priv->flags))1513 return sysfs_emit(buf, "connected\n");1514 else1515 return sysfs_emit(buf, "datagram\n");1516}1517 1518static ssize_t mode_store(struct device *d, struct device_attribute *attr,1519 const char *buf, size_t count)1520{1521 struct net_device *dev = to_net_dev(d);1522 int ret;1523 1524 if (!rtnl_trylock()) {1525 return restart_syscall();1526 }1527 1528 if (dev->reg_state != NETREG_REGISTERED) {1529 rtnl_unlock();1530 return -EPERM;1531 }1532 1533 ret = ipoib_set_mode(dev, buf);1534 1535 /* The assumption is that the function ipoib_set_mode returned1536 * with the rtnl held by it, if not the value -EBUSY returned,1537 * then no need to rtnl_unlock1538 */1539 if (ret != -EBUSY)1540 rtnl_unlock();1541 1542 return (!ret || ret == -EBUSY) ? count : ret;1543}1544 1545static DEVICE_ATTR_RW(mode);1546 1547int ipoib_cm_add_mode_attr(struct net_device *dev)1548{1549 return device_create_file(&dev->dev, &dev_attr_mode);1550}1551 1552static void ipoib_cm_create_srq(struct net_device *dev, int max_sge)1553{1554 struct ipoib_dev_priv *priv = ipoib_priv(dev);1555 struct ib_srq_init_attr srq_init_attr = {1556 .srq_type = IB_SRQT_BASIC,1557 .attr = {1558 .max_wr = ipoib_recvq_size,1559 .max_sge = max_sge1560 }1561 };1562 1563 priv->cm.srq = ib_create_srq(priv->pd, &srq_init_attr);1564 if (IS_ERR(priv->cm.srq)) {1565 if (PTR_ERR(priv->cm.srq) != -EOPNOTSUPP)1566 pr_warn("%s: failed to allocate SRQ, error %ld\n",1567 priv->ca->name, PTR_ERR(priv->cm.srq));1568 priv->cm.srq = NULL;1569 return;1570 }1571 1572 priv->cm.srq_ring = vzalloc(array_size(ipoib_recvq_size,1573 sizeof(*priv->cm.srq_ring)));1574 if (!priv->cm.srq_ring) {1575 ib_destroy_srq(priv->cm.srq);1576 priv->cm.srq = NULL;1577 return;1578 }1579 1580}1581 1582int ipoib_cm_dev_init(struct net_device *dev)1583{1584 struct ipoib_dev_priv *priv = ipoib_priv(dev);1585 int max_srq_sge, i;1586 u8 addr;1587 1588 INIT_LIST_HEAD(&priv->cm.passive_ids);1589 INIT_LIST_HEAD(&priv->cm.reap_list);1590 INIT_LIST_HEAD(&priv->cm.start_list);1591 INIT_LIST_HEAD(&priv->cm.rx_error_list);1592 INIT_LIST_HEAD(&priv->cm.rx_flush_list);1593 INIT_LIST_HEAD(&priv->cm.rx_drain_list);1594 INIT_LIST_HEAD(&priv->cm.rx_reap_list);1595 INIT_WORK(&priv->cm.start_task, ipoib_cm_tx_start);1596 INIT_WORK(&priv->cm.reap_task, ipoib_cm_tx_reap);1597 INIT_WORK(&priv->cm.skb_task, ipoib_cm_skb_reap);1598 INIT_WORK(&priv->cm.rx_reap_task, ipoib_cm_rx_reap);1599 INIT_DELAYED_WORK(&priv->cm.stale_task, ipoib_cm_stale_task);1600 1601 skb_queue_head_init(&priv->cm.skb_queue);1602 1603 ipoib_dbg(priv, "max_srq_sge=%d\n", priv->ca->attrs.max_srq_sge);1604 1605 max_srq_sge = min_t(int, IPOIB_CM_RX_SG, priv->ca->attrs.max_srq_sge);1606 ipoib_cm_create_srq(dev, max_srq_sge);1607 if (ipoib_cm_has_srq(dev)) {1608 priv->cm.max_cm_mtu = max_srq_sge * PAGE_SIZE - 0x10;1609 priv->cm.num_frags = max_srq_sge;1610 ipoib_dbg(priv, "max_cm_mtu = 0x%x, num_frags=%d\n",1611 priv->cm.max_cm_mtu, priv->cm.num_frags);1612 } else {1613 priv->cm.max_cm_mtu = IPOIB_CM_MTU;1614 priv->cm.num_frags = IPOIB_CM_RX_SG;1615 }1616 1617 ipoib_cm_init_rx_wr(dev, &priv->cm.rx_wr, priv->cm.rx_sge);1618 1619 if (ipoib_cm_has_srq(dev)) {1620 for (i = 0; i < ipoib_recvq_size; ++i) {1621 if (!ipoib_cm_alloc_rx_skb(dev, priv->cm.srq_ring, i,1622 priv->cm.num_frags - 1,1623 priv->cm.srq_ring[i].mapping,1624 GFP_KERNEL)) {1625 ipoib_warn(priv, "failed to allocate "1626 "receive buffer %d\n", i);1627 ipoib_cm_dev_cleanup(dev);1628 return -ENOMEM;1629 }1630 1631 if (ipoib_cm_post_receive_srq(dev, i)) {1632 ipoib_warn(priv, "ipoib_cm_post_receive_srq "1633 "failed for buf %d\n", i);1634 ipoib_cm_dev_cleanup(dev);1635 return -EIO;1636 }1637 }1638 }1639 1640 addr = IPOIB_FLAGS_RC;1641 dev_addr_mod(dev, 0, &addr, 1);1642 return 0;1643}1644 1645void ipoib_cm_dev_cleanup(struct net_device *dev)1646{1647 struct ipoib_dev_priv *priv = ipoib_priv(dev);1648 1649 if (!priv->cm.srq)1650 return;1651 1652 ipoib_dbg(priv, "Cleanup ipoib connected mode.\n");1653 1654 ib_destroy_srq(priv->cm.srq);1655 priv->cm.srq = NULL;1656 if (!priv->cm.srq_ring)1657 return;1658 1659 ipoib_cm_free_rx_ring(dev, priv->cm.srq_ring);1660 priv->cm.srq_ring = NULL;1661}1662