diff options
Diffstat (limited to 'drivers/net/ethernet/mellanox/mlx4/resource_tracker.c')
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/resource_tracker.c | 60 |
1 files changed, 15 insertions, 45 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c index ed20751a057d..bfdb7af19e49 100644 --- a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c +++ b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c | |||
| @@ -73,6 +73,7 @@ struct res_gid { | |||
| 73 | struct list_head list; | 73 | struct list_head list; |
| 74 | u8 gid[16]; | 74 | u8 gid[16]; |
| 75 | enum mlx4_protocol prot; | 75 | enum mlx4_protocol prot; |
| 76 | enum mlx4_steer_type steer; | ||
| 76 | }; | 77 | }; |
| 77 | 78 | ||
| 78 | enum res_qp_states { | 79 | enum res_qp_states { |
| @@ -374,6 +375,7 @@ static struct res_common *alloc_qp_tr(int id) | |||
| 374 | 375 | ||
| 375 | ret->com.res_id = id; | 376 | ret->com.res_id = id; |
| 376 | ret->com.state = RES_QP_RESERVED; | 377 | ret->com.state = RES_QP_RESERVED; |
| 378 | ret->local_qpn = id; | ||
| 377 | INIT_LIST_HEAD(&ret->mcg_list); | 379 | INIT_LIST_HEAD(&ret->mcg_list); |
| 378 | spin_lock_init(&ret->mcg_spl); | 380 | spin_lock_init(&ret->mcg_spl); |
| 379 | 381 | ||
| @@ -1561,11 +1563,6 @@ static int mr_get_mtt_size(struct mlx4_mpt_entry *mpt) | |||
| 1561 | return be32_to_cpu(mpt->mtt_sz); | 1563 | return be32_to_cpu(mpt->mtt_sz); |
| 1562 | } | 1564 | } |
| 1563 | 1565 | ||
| 1564 | static int mr_get_pdn(struct mlx4_mpt_entry *mpt) | ||
| 1565 | { | ||
| 1566 | return be32_to_cpu(mpt->pd_flags) & 0xffffff; | ||
| 1567 | } | ||
| 1568 | |||
| 1569 | static int qp_get_mtt_addr(struct mlx4_qp_context *qpc) | 1566 | static int qp_get_mtt_addr(struct mlx4_qp_context *qpc) |
| 1570 | { | 1567 | { |
| 1571 | return be32_to_cpu(qpc->mtt_base_addr_l) & 0xfffffff8; | 1568 | return be32_to_cpu(qpc->mtt_base_addr_l) & 0xfffffff8; |
| @@ -1602,16 +1599,6 @@ static int qp_get_mtt_size(struct mlx4_qp_context *qpc) | |||
| 1602 | return total_pages; | 1599 | return total_pages; |
| 1603 | } | 1600 | } |
| 1604 | 1601 | ||
| 1605 | static int qp_get_pdn(struct mlx4_qp_context *qpc) | ||
| 1606 | { | ||
| 1607 | return be32_to_cpu(qpc->pd) & 0xffffff; | ||
| 1608 | } | ||
| 1609 | |||
| 1610 | static int pdn2slave(int pdn) | ||
| 1611 | { | ||
| 1612 | return (pdn >> NOT_MASKED_PD_BITS) - 1; | ||
| 1613 | } | ||
| 1614 | |||
| 1615 | static int check_mtt_range(struct mlx4_dev *dev, int slave, int start, | 1602 | static int check_mtt_range(struct mlx4_dev *dev, int slave, int start, |
| 1616 | int size, struct res_mtt *mtt) | 1603 | int size, struct res_mtt *mtt) |
| 1617 | { | 1604 | { |
| @@ -1656,11 +1643,6 @@ int mlx4_SW2HW_MPT_wrapper(struct mlx4_dev *dev, int slave, | |||
| 1656 | mpt->mtt = mtt; | 1643 | mpt->mtt = mtt; |
| 1657 | } | 1644 | } |
| 1658 | 1645 | ||
| 1659 | if (pdn2slave(mr_get_pdn(inbox->buf)) != slave) { | ||
| 1660 | err = -EPERM; | ||
| 1661 | goto ex_put; | ||
| 1662 | } | ||
| 1663 | |||
| 1664 | err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd); | 1646 | err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd); |
| 1665 | if (err) | 1647 | if (err) |
| 1666 | goto ex_put; | 1648 | goto ex_put; |
| @@ -1792,11 +1774,6 @@ int mlx4_RST2INIT_QP_wrapper(struct mlx4_dev *dev, int slave, | |||
| 1792 | if (err) | 1774 | if (err) |
| 1793 | goto ex_put_mtt; | 1775 | goto ex_put_mtt; |
| 1794 | 1776 | ||
| 1795 | if (pdn2slave(qp_get_pdn(qpc)) != slave) { | ||
| 1796 | err = -EPERM; | ||
| 1797 | goto ex_put_mtt; | ||
| 1798 | } | ||
| 1799 | |||
| 1800 | err = get_res(dev, slave, rcqn, RES_CQ, &rcq); | 1777 | err = get_res(dev, slave, rcqn, RES_CQ, &rcq); |
| 1801 | if (err) | 1778 | if (err) |
| 1802 | goto ex_put_mtt; | 1779 | goto ex_put_mtt; |
| @@ -2048,10 +2025,10 @@ int mlx4_GEN_EQE(struct mlx4_dev *dev, int slave, struct mlx4_eqe *eqe) | |||
| 2048 | if (!priv->mfunc.master.slave_state) | 2025 | if (!priv->mfunc.master.slave_state) |
| 2049 | return -EINVAL; | 2026 | return -EINVAL; |
| 2050 | 2027 | ||
| 2051 | event_eq = &priv->mfunc.master.slave_state[slave].event_eq; | 2028 | event_eq = &priv->mfunc.master.slave_state[slave].event_eq[eqe->type]; |
| 2052 | 2029 | ||
| 2053 | /* Create the event only if the slave is registered */ | 2030 | /* Create the event only if the slave is registered */ |
| 2054 | if ((event_eq->event_type & (1 << eqe->type)) == 0) | 2031 | if (event_eq->eqn < 0) |
| 2055 | return 0; | 2032 | return 0; |
| 2056 | 2033 | ||
| 2057 | mutex_lock(&priv->mfunc.master.gen_eqe_mutex[slave]); | 2034 | mutex_lock(&priv->mfunc.master.gen_eqe_mutex[slave]); |
| @@ -2289,11 +2266,6 @@ ex_put: | |||
| 2289 | return err; | 2266 | return err; |
| 2290 | } | 2267 | } |
| 2291 | 2268 | ||
| 2292 | static int srq_get_pdn(struct mlx4_srq_context *srqc) | ||
| 2293 | { | ||
| 2294 | return be32_to_cpu(srqc->pd) & 0xffffff; | ||
| 2295 | } | ||
| 2296 | |||
| 2297 | static int srq_get_mtt_size(struct mlx4_srq_context *srqc) | 2269 | static int srq_get_mtt_size(struct mlx4_srq_context *srqc) |
| 2298 | { | 2270 | { |
| 2299 | int log_srq_size = (be32_to_cpu(srqc->state_logsize_srqn) >> 24) & 0xf; | 2271 | int log_srq_size = (be32_to_cpu(srqc->state_logsize_srqn) >> 24) & 0xf; |
| @@ -2333,11 +2305,6 @@ int mlx4_SW2HW_SRQ_wrapper(struct mlx4_dev *dev, int slave, | |||
| 2333 | if (err) | 2305 | if (err) |
| 2334 | goto ex_put_mtt; | 2306 | goto ex_put_mtt; |
| 2335 | 2307 | ||
| 2336 | if (pdn2slave(srq_get_pdn(srqc)) != slave) { | ||
| 2337 | err = -EPERM; | ||
| 2338 | goto ex_put_mtt; | ||
| 2339 | } | ||
| 2340 | |||
| 2341 | err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd); | 2308 | err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd); |
| 2342 | if (err) | 2309 | if (err) |
| 2343 | goto ex_put_mtt; | 2310 | goto ex_put_mtt; |
| @@ -2514,7 +2481,8 @@ static struct res_gid *find_gid(struct mlx4_dev *dev, int slave, | |||
| 2514 | } | 2481 | } |
| 2515 | 2482 | ||
| 2516 | static int add_mcg_res(struct mlx4_dev *dev, int slave, struct res_qp *rqp, | 2483 | static int add_mcg_res(struct mlx4_dev *dev, int slave, struct res_qp *rqp, |
| 2517 | u8 *gid, enum mlx4_protocol prot) | 2484 | u8 *gid, enum mlx4_protocol prot, |
| 2485 | enum mlx4_steer_type steer) | ||
| 2518 | { | 2486 | { |
| 2519 | struct res_gid *res; | 2487 | struct res_gid *res; |
| 2520 | int err; | 2488 | int err; |
| @@ -2530,6 +2498,7 @@ static int add_mcg_res(struct mlx4_dev *dev, int slave, struct res_qp *rqp, | |||
| 2530 | } else { | 2498 | } else { |
| 2531 | memcpy(res->gid, gid, 16); | 2499 | memcpy(res->gid, gid, 16); |
| 2532 | res->prot = prot; | 2500 | res->prot = prot; |
| 2501 | res->steer = steer; | ||
| 2533 | list_add_tail(&res->list, &rqp->mcg_list); | 2502 | list_add_tail(&res->list, &rqp->mcg_list); |
| 2534 | err = 0; | 2503 | err = 0; |
| 2535 | } | 2504 | } |
| @@ -2539,14 +2508,15 @@ static int add_mcg_res(struct mlx4_dev *dev, int slave, struct res_qp *rqp, | |||
| 2539 | } | 2508 | } |
| 2540 | 2509 | ||
| 2541 | static int rem_mcg_res(struct mlx4_dev *dev, int slave, struct res_qp *rqp, | 2510 | static int rem_mcg_res(struct mlx4_dev *dev, int slave, struct res_qp *rqp, |
| 2542 | u8 *gid, enum mlx4_protocol prot) | 2511 | u8 *gid, enum mlx4_protocol prot, |
| 2512 | enum mlx4_steer_type steer) | ||
| 2543 | { | 2513 | { |
| 2544 | struct res_gid *res; | 2514 | struct res_gid *res; |
| 2545 | int err; | 2515 | int err; |
| 2546 | 2516 | ||
| 2547 | spin_lock_irq(&rqp->mcg_spl); | 2517 | spin_lock_irq(&rqp->mcg_spl); |
| 2548 | res = find_gid(dev, slave, rqp, gid); | 2518 | res = find_gid(dev, slave, rqp, gid); |
| 2549 | if (!res || res->prot != prot) | 2519 | if (!res || res->prot != prot || res->steer != steer) |
| 2550 | err = -EINVAL; | 2520 | err = -EINVAL; |
| 2551 | else { | 2521 | else { |
| 2552 | list_del(&res->list); | 2522 | list_del(&res->list); |
| @@ -2573,7 +2543,7 @@ int mlx4_QP_ATTACH_wrapper(struct mlx4_dev *dev, int slave, | |||
| 2573 | int attach = vhcr->op_modifier; | 2543 | int attach = vhcr->op_modifier; |
| 2574 | int block_loopback = vhcr->in_modifier >> 31; | 2544 | int block_loopback = vhcr->in_modifier >> 31; |
| 2575 | u8 steer_type_mask = 2; | 2545 | u8 steer_type_mask = 2; |
| 2576 | enum mlx4_steer_type type = gid[7] & steer_type_mask; | 2546 | enum mlx4_steer_type type = (gid[7] & steer_type_mask) >> 1; |
| 2577 | 2547 | ||
| 2578 | qpn = vhcr->in_modifier & 0xffffff; | 2548 | qpn = vhcr->in_modifier & 0xffffff; |
| 2579 | err = get_res(dev, slave, qpn, RES_QP, &rqp); | 2549 | err = get_res(dev, slave, qpn, RES_QP, &rqp); |
| @@ -2582,7 +2552,7 @@ int mlx4_QP_ATTACH_wrapper(struct mlx4_dev *dev, int slave, | |||
| 2582 | 2552 | ||
| 2583 | qp.qpn = qpn; | 2553 | qp.qpn = qpn; |
| 2584 | if (attach) { | 2554 | if (attach) { |
| 2585 | err = add_mcg_res(dev, slave, rqp, gid, prot); | 2555 | err = add_mcg_res(dev, slave, rqp, gid, prot, type); |
| 2586 | if (err) | 2556 | if (err) |
| 2587 | goto ex_put; | 2557 | goto ex_put; |
| 2588 | 2558 | ||
| @@ -2591,7 +2561,7 @@ int mlx4_QP_ATTACH_wrapper(struct mlx4_dev *dev, int slave, | |||
| 2591 | if (err) | 2561 | if (err) |
| 2592 | goto ex_rem; | 2562 | goto ex_rem; |
| 2593 | } else { | 2563 | } else { |
| 2594 | err = rem_mcg_res(dev, slave, rqp, gid, prot); | 2564 | err = rem_mcg_res(dev, slave, rqp, gid, prot, type); |
| 2595 | if (err) | 2565 | if (err) |
| 2596 | goto ex_put; | 2566 | goto ex_put; |
| 2597 | err = mlx4_qp_detach_common(dev, &qp, gid, prot, type); | 2567 | err = mlx4_qp_detach_common(dev, &qp, gid, prot, type); |
| @@ -2602,7 +2572,7 @@ int mlx4_QP_ATTACH_wrapper(struct mlx4_dev *dev, int slave, | |||
| 2602 | 2572 | ||
| 2603 | ex_rem: | 2573 | ex_rem: |
| 2604 | /* ignore error return below, already in error */ | 2574 | /* ignore error return below, already in error */ |
| 2605 | err1 = rem_mcg_res(dev, slave, rqp, gid, prot); | 2575 | err1 = rem_mcg_res(dev, slave, rqp, gid, prot, type); |
| 2606 | ex_put: | 2576 | ex_put: |
| 2607 | put_res(dev, slave, qpn, RES_QP); | 2577 | put_res(dev, slave, qpn, RES_QP); |
| 2608 | 2578 | ||
| @@ -2641,7 +2611,7 @@ static void detach_qp(struct mlx4_dev *dev, int slave, struct res_qp *rqp) | |||
| 2641 | list_for_each_entry_safe(rgid, tmp, &rqp->mcg_list, list) { | 2611 | list_for_each_entry_safe(rgid, tmp, &rqp->mcg_list, list) { |
| 2642 | qp.qpn = rqp->local_qpn; | 2612 | qp.qpn = rqp->local_qpn; |
| 2643 | err = mlx4_qp_detach_common(dev, &qp, rgid->gid, rgid->prot, | 2613 | err = mlx4_qp_detach_common(dev, &qp, rgid->gid, rgid->prot, |
| 2644 | MLX4_MC_STEER); | 2614 | rgid->steer); |
| 2645 | list_del(&rgid->list); | 2615 | list_del(&rgid->list); |
| 2646 | kfree(rgid); | 2616 | kfree(rgid); |
| 2647 | } | 2617 | } |
