Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband:
IB/mlx4: Fix MTT leakage in resize CQ
IB/ehca: Fix problem with generated flush work completions
IB/ehca: Change misleading error message on memory hotplug
mlx4_core: Save/restore default port IB capability mask

+110 -34
+3 -1
drivers/infiniband/hw/ehca/ehca_classes.h
··· 163 163 /* struct for tracking if cqes have been reported to the application */ 164 164 struct ehca_qmap_entry { 165 165 u16 app_wr_id; 166 - u16 reported; 166 + u8 reported; 167 + u8 cqe_req; 167 168 }; 168 169 169 170 struct ehca_queue_map { ··· 172 171 unsigned int entries; 173 172 unsigned int tail; 174 173 unsigned int left_to_poll; 174 + unsigned int next_wqe_idx; /* Idx to first wqe to be flushed */ 175 175 }; 176 176 177 177 struct ehca_qp {
+1 -2
drivers/infiniband/hw/ehca/ehca_main.c
··· 994 994 if (printk_timed_ratelimit(&ehca_dmem_warn_time, 995 995 30 * 1000)) 996 996 ehca_gen_err("DMEM operations are not allowed" 997 - "as long as an ehca adapter is" 998 - "attached to the LPAR"); 997 + "in conjunction with eHCA"); 999 998 return NOTIFY_BAD; 1000 999 } 1001 1000 }
+20 -6
drivers/infiniband/hw/ehca/ehca_qp.c
··· 435 435 { 436 436 int i; 437 437 438 - qmap->tail = 0; 439 - for (i = 0; i < qmap->entries; i++) 438 + qmap->tail = qmap->entries - 1; 439 + qmap->left_to_poll = 0; 440 + qmap->next_wqe_idx = 0; 441 + for (i = 0; i < qmap->entries; i++) { 440 442 qmap->map[i].reported = 1; 443 + qmap->map[i].cqe_req = 0; 444 + } 441 445 } 442 446 443 447 /* ··· 1125 1121 void *wqe_v; 1126 1122 u64 q_ofs; 1127 1123 u32 wqe_idx; 1124 + unsigned int tail_idx; 1128 1125 1129 1126 /* convert real to abs address */ 1130 1127 wqe_p = wqe_p & (~(1UL << 63)); ··· 1138 1133 return -EFAULT; 1139 1134 } 1140 1135 1136 + tail_idx = (qmap->tail + 1) % qmap->entries; 1141 1137 wqe_idx = q_ofs / ipz_queue->qe_size; 1142 - if (wqe_idx < qmap->tail) 1143 - qmap->left_to_poll = (qmap->entries - qmap->tail) + wqe_idx; 1144 - else 1145 - qmap->left_to_poll = wqe_idx - qmap->tail; 1146 1138 1139 + /* check all processed wqes, whether a cqe is requested or not */ 1140 + while (tail_idx != wqe_idx) { 1141 + if (qmap->map[tail_idx].cqe_req) 1142 + qmap->left_to_poll++; 1143 + tail_idx = (tail_idx + 1) % qmap->entries; 1144 + } 1145 + /* save index in queue, where we have to start flushing */ 1146 + qmap->next_wqe_idx = wqe_idx; 1147 1147 return 0; 1148 1148 } 1149 1149 ··· 1195 1185 } else { 1196 1186 spin_lock_irqsave(&my_qp->send_cq->spinlock, flags); 1197 1187 my_qp->sq_map.left_to_poll = 0; 1188 + my_qp->sq_map.next_wqe_idx = (my_qp->sq_map.tail + 1) % 1189 + my_qp->sq_map.entries; 1198 1190 spin_unlock_irqrestore(&my_qp->send_cq->spinlock, flags); 1199 1191 1200 1192 spin_lock_irqsave(&my_qp->recv_cq->spinlock, flags); 1201 1193 my_qp->rq_map.left_to_poll = 0; 1194 + my_qp->rq_map.next_wqe_idx = (my_qp->rq_map.tail + 1) % 1195 + my_qp->rq_map.entries; 1202 1196 spin_unlock_irqrestore(&my_qp->recv_cq->spinlock, flags); 1203 1197 } 1204 1198
+33 -24
drivers/infiniband/hw/ehca/ehca_reqs.c
··· 179 179 180 180 qmap_entry->app_wr_id = get_app_wr_id(send_wr->wr_id); 181 181 qmap_entry->reported = 0; 182 + qmap_entry->cqe_req = 0; 182 183 183 184 switch (send_wr->opcode) { 184 185 case IB_WR_SEND: ··· 204 203 205 204 if ((send_wr->send_flags & IB_SEND_SIGNALED || 206 205 qp->init_attr.sq_sig_type == IB_SIGNAL_ALL_WR) 207 - && !hidden) 206 + && !hidden) { 208 207 wqe_p->wr_flag |= WQE_WRFLAG_REQ_SIGNAL_COM; 208 + qmap_entry->cqe_req = 1; 209 + } 209 210 210 211 if (send_wr->opcode == IB_WR_SEND_WITH_IMM || 211 212 send_wr->opcode == IB_WR_RDMA_WRITE_WITH_IMM) { ··· 572 569 qmap_entry = &my_qp->rq_map.map[rq_map_idx]; 573 570 qmap_entry->app_wr_id = get_app_wr_id(cur_recv_wr->wr_id); 574 571 qmap_entry->reported = 0; 572 + qmap_entry->cqe_req = 1; 575 573 576 574 wqe_cnt++; 577 575 } /* eof for cur_recv_wr */ ··· 710 706 goto repoll; 711 707 wc->qp = &my_qp->ib_qp; 712 708 713 - if (is_error) { 714 - /* 715 - * set left_to_poll to 0 because in error state, we will not 716 - * get any additional CQEs 717 - */ 718 - ehca_add_to_err_list(my_qp, 1); 719 - my_qp->sq_map.left_to_poll = 0; 720 - 721 - if (HAS_RQ(my_qp)) 722 - ehca_add_to_err_list(my_qp, 0); 723 - my_qp->rq_map.left_to_poll = 0; 724 - } 725 - 726 709 qmap_tail_idx = get_app_wr_id(cqe->work_request_id); 727 710 if (!(cqe->w_completion_flags & WC_SEND_RECEIVE_BIT)) 728 711 /* We got a send completion. */ ··· 717 726 else 718 727 /* We got a receive completion. */ 719 728 qmap = &my_qp->rq_map; 729 + 730 + /* advance the tail pointer */ 731 + qmap->tail = qmap_tail_idx; 732 + 733 + if (is_error) { 734 + /* 735 + * set left_to_poll to 0 because in error state, we will not 736 + * get any additional CQEs 737 + */ 738 + my_qp->sq_map.next_wqe_idx = (my_qp->sq_map.tail + 1) % 739 + my_qp->sq_map.entries; 740 + my_qp->sq_map.left_to_poll = 0; 741 + ehca_add_to_err_list(my_qp, 1); 742 + 743 + my_qp->rq_map.next_wqe_idx = (my_qp->rq_map.tail + 1) % 744 + my_qp->rq_map.entries; 745 + my_qp->rq_map.left_to_poll = 0; 746 + if (HAS_RQ(my_qp)) 747 + ehca_add_to_err_list(my_qp, 0); 748 + } 720 749 721 750 qmap_entry = &qmap->map[qmap_tail_idx]; 722 751 if (qmap_entry->reported) { ··· 748 737 749 738 wc->wr_id = replace_wr_id(cqe->work_request_id, qmap_entry->app_wr_id); 750 739 qmap_entry->reported = 1; 751 - 752 - /* this is a proper completion, we need to advance the tail pointer */ 753 - if (++qmap->tail == qmap->entries) 754 - qmap->tail = 0; 755 740 756 741 /* if left_to_poll is decremented to 0, add the QP to the error list */ 757 742 if (qmap->left_to_poll > 0) { ··· 812 805 else 813 806 qmap = &my_qp->rq_map; 814 807 815 - qmap_entry = &qmap->map[qmap->tail]; 808 + qmap_entry = &qmap->map[qmap->next_wqe_idx]; 816 809 817 810 while ((nr < num_entries) && (qmap_entry->reported == 0)) { 818 811 /* generate flush CQE */ 812 + 819 813 memset(wc, 0, sizeof(*wc)); 820 814 821 - offset = qmap->tail * ipz_queue->qe_size; 815 + offset = qmap->next_wqe_idx * ipz_queue->qe_size; 822 816 wqe = (struct ehca_wqe *)ipz_qeit_calc(ipz_queue, offset); 823 817 if (!wqe) { 824 818 ehca_err(cq->device, "Invalid wqe offset=%#lx on " ··· 858 850 859 851 wc->qp = &my_qp->ib_qp; 860 852 861 - /* mark as reported and advance tail pointer */ 853 + /* mark as reported and advance next_wqe pointer */ 862 854 qmap_entry->reported = 1; 863 - if (++qmap->tail == qmap->entries) 864 - qmap->tail = 0; 865 - qmap_entry = &qmap->map[qmap->tail]; 855 + qmap->next_wqe_idx++; 856 + if (qmap->next_wqe_idx == qmap->entries) 857 + qmap->next_wqe_idx = 0; 858 + qmap_entry = &qmap->map[qmap->next_wqe_idx]; 866 859 867 860 wc++; nr++; 868 861 }
+5
drivers/infiniband/hw/mlx4/cq.c
··· 343 343 { 344 344 struct mlx4_ib_dev *dev = to_mdev(ibcq->device); 345 345 struct mlx4_ib_cq *cq = to_mcq(ibcq); 346 + struct mlx4_mtt mtt; 346 347 int outst_cqe; 347 348 int err; 348 349 ··· 377 376 goto out; 378 377 } 379 378 379 + mtt = cq->buf.mtt; 380 + 380 381 err = mlx4_cq_resize(dev->dev, &cq->mcq, entries, &cq->resize_buf->buf.mtt); 381 382 if (err) 382 383 goto err_buf; 383 384 385 + mlx4_mtt_cleanup(dev->dev, &mtt); 384 386 if (ibcq->uobject) { 385 387 cq->buf = cq->resize_buf->buf; 386 388 cq->ibcq.cqe = cq->resize_buf->cqe; ··· 410 406 goto out; 411 407 412 408 err_buf: 409 + mlx4_mtt_cleanup(dev->dev, &cq->resize_buf->buf.mtt); 413 410 if (!ibcq->uobject) 414 411 mlx4_ib_free_cq_buf(dev, &cq->resize_buf->buf, 415 412 cq->resize_buf->cqe);
+8
drivers/net/mlx4/main.c
··· 753 753 struct mlx4_priv *priv = mlx4_priv(dev); 754 754 int err; 755 755 int port; 756 + __be32 ib_port_default_caps; 756 757 757 758 err = mlx4_init_uar_table(dev); 758 759 if (err) { ··· 853 852 } 854 853 855 854 for (port = 1; port <= dev->caps.num_ports; port++) { 855 + ib_port_default_caps = 0; 856 + err = mlx4_get_port_ib_caps(dev, port, &ib_port_default_caps); 857 + if (err) 858 + mlx4_warn(dev, "failed to get port %d default " 859 + "ib capabilities (%d). Continuing with " 860 + "caps = 0\n", port, err); 861 + dev->caps.ib_port_def_cap[port] = ib_port_default_caps; 856 862 err = mlx4_SET_PORT(dev, port); 857 863 if (err) { 858 864 mlx4_err(dev, "Failed to set port %d, aborting\n",
+1
drivers/net/mlx4/mlx4.h
··· 385 385 void mlx4_init_vlan_table(struct mlx4_dev *dev, struct mlx4_vlan_table *table); 386 386 387 387 int mlx4_SET_PORT(struct mlx4_dev *dev, u8 port); 388 + int mlx4_get_port_ib_caps(struct mlx4_dev *dev, u8 port, __be32 *caps); 388 389 389 390 #endif /* MLX4_H */
+38 -1
drivers/net/mlx4/port.c
··· 258 258 } 259 259 EXPORT_SYMBOL_GPL(mlx4_unregister_vlan); 260 260 261 + int mlx4_get_port_ib_caps(struct mlx4_dev *dev, u8 port, __be32 *caps) 262 + { 263 + struct mlx4_cmd_mailbox *inmailbox, *outmailbox; 264 + u8 *inbuf, *outbuf; 265 + int err; 266 + 267 + inmailbox = mlx4_alloc_cmd_mailbox(dev); 268 + if (IS_ERR(inmailbox)) 269 + return PTR_ERR(inmailbox); 270 + 271 + outmailbox = mlx4_alloc_cmd_mailbox(dev); 272 + if (IS_ERR(outmailbox)) { 273 + mlx4_free_cmd_mailbox(dev, inmailbox); 274 + return PTR_ERR(outmailbox); 275 + } 276 + 277 + inbuf = inmailbox->buf; 278 + outbuf = outmailbox->buf; 279 + memset(inbuf, 0, 256); 280 + memset(outbuf, 0, 256); 281 + inbuf[0] = 1; 282 + inbuf[1] = 1; 283 + inbuf[2] = 1; 284 + inbuf[3] = 1; 285 + *(__be16 *) (&inbuf[16]) = cpu_to_be16(0x0015); 286 + *(__be32 *) (&inbuf[20]) = cpu_to_be32(port); 287 + 288 + err = mlx4_cmd_box(dev, inmailbox->dma, outmailbox->dma, port, 3, 289 + MLX4_CMD_MAD_IFC, MLX4_CMD_TIME_CLASS_C); 290 + if (!err) 291 + *caps = *(__be32 *) (outbuf + 84); 292 + mlx4_free_cmd_mailbox(dev, inmailbox); 293 + mlx4_free_cmd_mailbox(dev, outmailbox); 294 + return err; 295 + } 296 + 261 297 int mlx4_SET_PORT(struct mlx4_dev *dev, u8 port) 262 298 { 263 299 struct mlx4_cmd_mailbox *mailbox; ··· 309 273 ((u8 *) mailbox->buf)[3] = 6; 310 274 ((__be16 *) mailbox->buf)[4] = cpu_to_be16(1 << 15); 311 275 ((__be16 *) mailbox->buf)[6] = cpu_to_be16(1 << 15); 312 - } 276 + } else 277 + ((__be32 *) mailbox->buf)[1] = dev->caps.ib_port_def_cap[port]; 313 278 err = mlx4_cmd(dev, mailbox->dma, port, is_eth, MLX4_CMD_SET_PORT, 314 279 MLX4_CMD_TIME_CLASS_B); 315 280
+1
include/linux/mlx4/device.h
··· 179 179 int num_ports; 180 180 int vl_cap[MLX4_MAX_PORTS + 1]; 181 181 int ib_mtu_cap[MLX4_MAX_PORTS + 1]; 182 + __be32 ib_port_def_cap[MLX4_MAX_PORTS + 1]; 182 183 u64 def_mac[MLX4_MAX_PORTS + 1]; 183 184 int eth_mtu_cap[MLX4_MAX_PORTS + 1]; 184 185 int gid_table_len[MLX4_MAX_PORTS + 1];