Merge tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma
[linux-2.6-block.git] / drivers / infiniband / hw / mlx5 / main.c
index 6fedfff7862a654eec30920fee48a41c65b89bec..831539419c3016e11ae1da143d344a7ea5b1c1bf 100644 (file)
@@ -1995,11 +1995,6 @@ static void mlx5_ib_dealloc_ucontext(struct ib_ucontext *ibcontext)
        struct mlx5_ib_dev *dev = to_mdev(ibcontext->device);
        struct mlx5_bfreg_info *bfregi;
 
-       /* All umem's must be destroyed before destroying the ucontext. */
-       mutex_lock(&ibcontext->per_mm_list_lock);
-       WARN_ON(!list_empty(&ibcontext->per_mm_list));
-       mutex_unlock(&ibcontext->per_mm_list_lock);
-
        bfregi = &context->bfregi;
        mlx5_ib_dealloc_transport_domain(dev, context->tdn, context->devx_uid);
 
@@ -2276,6 +2271,7 @@ static inline int check_dm_type_support(struct mlx5_ib_dev *dev,
                        return -EOPNOTSUPP;
                break;
        case MLX5_IB_UAPI_DM_TYPE_STEERING_SW_ICM:
+       case MLX5_IB_UAPI_DM_TYPE_HEADER_MODIFY_SW_ICM:
                if (!capable(CAP_SYS_RAWIO) ||
                    !capable(CAP_NET_RAW))
                        return -EPERM;
@@ -2340,20 +2336,20 @@ static int handle_alloc_dm_sw_icm(struct ib_ucontext *ctx,
                                  struct uverbs_attr_bundle *attrs,
                                  int type)
 {
-       struct mlx5_dm *dm_db = &to_mdev(ctx->device)->dm;
+       struct mlx5_core_dev *dev = to_mdev(ctx->device)->mdev;
        u64 act_size;
        int err;
 
        /* Allocation size must a multiple of the basic block size
         * and a power of 2.
         */
-       act_size = round_up(attr->length, MLX5_SW_ICM_BLOCK_SIZE(dm_db->dev));
+       act_size = round_up(attr->length, MLX5_SW_ICM_BLOCK_SIZE(dev));
        act_size = roundup_pow_of_two(act_size);
 
        dm->size = act_size;
-       err = mlx5_cmd_alloc_sw_icm(dm_db, type, act_size,
-                                   to_mucontext(ctx)->devx_uid, &dm->dev_addr,
-                                   &dm->icm_dm.obj_id);
+       err = mlx5_dm_sw_icm_alloc(dev, type, act_size,
+                                  to_mucontext(ctx)->devx_uid, &dm->dev_addr,
+                                  &dm->icm_dm.obj_id);
        if (err)
                return err;
 
@@ -2361,9 +2357,9 @@ static int handle_alloc_dm_sw_icm(struct ib_ucontext *ctx,
                             MLX5_IB_ATTR_ALLOC_DM_RESP_START_OFFSET,
                             &dm->dev_addr, sizeof(dm->dev_addr));
        if (err)
-               mlx5_cmd_dealloc_sw_icm(dm_db, type, dm->size,
-                                       to_mucontext(ctx)->devx_uid,
-                                       dm->dev_addr, dm->icm_dm.obj_id);
+               mlx5_dm_sw_icm_dealloc(dev, type, dm->size,
+                                      to_mucontext(ctx)->devx_uid, dm->dev_addr,
+                                      dm->icm_dm.obj_id);
 
        return err;
 }
@@ -2403,8 +2399,14 @@ struct ib_dm *mlx5_ib_alloc_dm(struct ib_device *ibdev,
                                            attrs);
                break;
        case MLX5_IB_UAPI_DM_TYPE_STEERING_SW_ICM:
+               err = handle_alloc_dm_sw_icm(context, dm,
+                                            attr, attrs,
+                                            MLX5_SW_ICM_TYPE_STEERING);
+               break;
        case MLX5_IB_UAPI_DM_TYPE_HEADER_MODIFY_SW_ICM:
-               err = handle_alloc_dm_sw_icm(context, dm, attr, attrs, type);
+               err = handle_alloc_dm_sw_icm(context, dm,
+                                            attr, attrs,
+                                            MLX5_SW_ICM_TYPE_HEADER_MODIFY);
                break;
        default:
                err = -EOPNOTSUPP;
@@ -2424,6 +2426,7 @@ int mlx5_ib_dealloc_dm(struct ib_dm *ibdm, struct uverbs_attr_bundle *attrs)
 {
        struct mlx5_ib_ucontext *ctx = rdma_udata_to_drv_context(
                &attrs->driver_udata, struct mlx5_ib_ucontext, ibucontext);
+       struct mlx5_core_dev *dev = to_mdev(ibdm->device)->mdev;
        struct mlx5_dm *dm_db = &to_mdev(ibdm->device)->dm;
        struct mlx5_ib_dm *dm = to_mdm(ibdm);
        u32 page_idx;
@@ -2435,19 +2438,23 @@ int mlx5_ib_dealloc_dm(struct ib_dm *ibdm, struct uverbs_attr_bundle *attrs)
                if (ret)
                        return ret;
 
-               page_idx = (dm->dev_addr -
-                           pci_resource_start(dm_db->dev->pdev, 0) -
-                           MLX5_CAP64_DEV_MEM(dm_db->dev,
-                                              memic_bar_start_addr)) >>
-                          PAGE_SHIFT;
+               page_idx = (dm->dev_addr - pci_resource_start(dev->pdev, 0) -
+                           MLX5_CAP64_DEV_MEM(dev, memic_bar_start_addr)) >>
+                           PAGE_SHIFT;
                bitmap_clear(ctx->dm_pages, page_idx,
                             DIV_ROUND_UP(dm->size, PAGE_SIZE));
                break;
        case MLX5_IB_UAPI_DM_TYPE_STEERING_SW_ICM:
+               ret = mlx5_dm_sw_icm_dealloc(dev, MLX5_SW_ICM_TYPE_STEERING,
+                                            dm->size, ctx->devx_uid, dm->dev_addr,
+                                            dm->icm_dm.obj_id);
+               if (ret)
+                       return ret;
+               break;
        case MLX5_IB_UAPI_DM_TYPE_HEADER_MODIFY_SW_ICM:
-               ret = mlx5_cmd_dealloc_sw_icm(dm_db, dm->type, dm->size,
-                                             ctx->devx_uid, dm->dev_addr,
-                                             dm->icm_dm.obj_id);
+               ret = mlx5_dm_sw_icm_dealloc(dev, MLX5_SW_ICM_TYPE_HEADER_MODIFY,
+                                            dm->size, ctx->devx_uid, dm->dev_addr,
+                                            dm->icm_dm.obj_id);
                if (ret)
                        return ret;
                break;
@@ -2642,7 +2649,8 @@ int parse_flow_flow_action(struct mlx5_ib_flow_action *maction,
                        if (action->action & MLX5_FLOW_CONTEXT_ACTION_MOD_HDR)
                                return -EINVAL;
                        action->action |= MLX5_FLOW_CONTEXT_ACTION_MOD_HDR;
-                       action->modify_id = maction->flow_action_raw.action_id;
+                       action->modify_hdr =
+                               maction->flow_action_raw.modify_hdr;
                        return 0;
                }
                if (maction->flow_action_raw.sub_type ==
@@ -2659,8 +2667,8 @@ int parse_flow_flow_action(struct mlx5_ib_flow_action *maction,
                                return -EINVAL;
                        action->action |=
                                MLX5_FLOW_CONTEXT_ACTION_PACKET_REFORMAT;
-                       action->reformat_id =
-                               maction->flow_action_raw.action_id;
+                       action->pkt_reformat =
+                               maction->flow_action_raw.pkt_reformat;
                        return 0;
                }
                /* fall through */
@@ -6136,8 +6144,6 @@ static struct ib_counters *mlx5_ib_create_counters(struct ib_device *device,
 
 static void mlx5_ib_stage_init_cleanup(struct mlx5_ib_dev *dev)
 {
-       struct mlx5_core_dev *mdev = dev->mdev;
-
        mlx5_ib_cleanup_multiport_master(dev);
        if (IS_ENABLED(CONFIG_INFINIBAND_ON_DEMAND_PAGING)) {
                srcu_barrier(&dev->mr_srcu);
@@ -6145,29 +6151,11 @@ static void mlx5_ib_stage_init_cleanup(struct mlx5_ib_dev *dev)
        }
 
        WARN_ON(!bitmap_empty(dev->dm.memic_alloc_pages, MLX5_MAX_MEMIC_PAGES));
-
-       WARN_ON(dev->dm.steering_sw_icm_alloc_blocks &&
-               !bitmap_empty(
-                       dev->dm.steering_sw_icm_alloc_blocks,
-                       BIT(MLX5_CAP_DEV_MEM(mdev, log_steering_sw_icm_size) -
-                           MLX5_LOG_SW_ICM_BLOCK_SIZE(mdev))));
-
-       kfree(dev->dm.steering_sw_icm_alloc_blocks);
-
-       WARN_ON(dev->dm.header_modify_sw_icm_alloc_blocks &&
-               !bitmap_empty(dev->dm.header_modify_sw_icm_alloc_blocks,
-                             BIT(MLX5_CAP_DEV_MEM(
-                                         mdev, log_header_modify_sw_icm_size) -
-                                 MLX5_LOG_SW_ICM_BLOCK_SIZE(mdev))));
-
-       kfree(dev->dm.header_modify_sw_icm_alloc_blocks);
 }
 
 static int mlx5_ib_stage_init_init(struct mlx5_ib_dev *dev)
 {
        struct mlx5_core_dev *mdev = dev->mdev;
-       u64 header_modify_icm_blocks = 0;
-       u64 steering_icm_blocks = 0;
        int err;
        int i;
 
@@ -6214,51 +6202,17 @@ static int mlx5_ib_stage_init_init(struct mlx5_ib_dev *dev)
        INIT_LIST_HEAD(&dev->qp_list);
        spin_lock_init(&dev->reset_flow_resource_lock);
 
-       if (MLX5_CAP_GEN_64(mdev, general_obj_types) &
-           MLX5_GENERAL_OBJ_TYPES_CAP_SW_ICM) {
-               if (MLX5_CAP64_DEV_MEM(mdev, steering_sw_icm_start_address)) {
-                       steering_icm_blocks =
-                               BIT(MLX5_CAP_DEV_MEM(mdev,
-                                                    log_steering_sw_icm_size) -
-                                   MLX5_LOG_SW_ICM_BLOCK_SIZE(mdev));
-
-                       dev->dm.steering_sw_icm_alloc_blocks =
-                               kcalloc(BITS_TO_LONGS(steering_icm_blocks),
-                                       sizeof(unsigned long), GFP_KERNEL);
-                       if (!dev->dm.steering_sw_icm_alloc_blocks)
-                               goto err_mp;
-               }
-
-               if (MLX5_CAP64_DEV_MEM(mdev,
-                                      header_modify_sw_icm_start_address)) {
-                       header_modify_icm_blocks = BIT(
-                               MLX5_CAP_DEV_MEM(
-                                       mdev, log_header_modify_sw_icm_size) -
-                               MLX5_LOG_SW_ICM_BLOCK_SIZE(mdev));
-
-                       dev->dm.header_modify_sw_icm_alloc_blocks =
-                               kcalloc(BITS_TO_LONGS(header_modify_icm_blocks),
-                                       sizeof(unsigned long), GFP_KERNEL);
-                       if (!dev->dm.header_modify_sw_icm_alloc_blocks)
-                               goto err_dm;
-               }
-       }
-
        spin_lock_init(&dev->dm.lock);
        dev->dm.dev = mdev;
 
        if (IS_ENABLED(CONFIG_INFINIBAND_ON_DEMAND_PAGING)) {
                err = init_srcu_struct(&dev->mr_srcu);
                if (err)
-                       goto err_dm;
+                       goto err_mp;
        }
 
        return 0;
 
-err_dm:
-       kfree(dev->dm.steering_sw_icm_alloc_blocks);
-       kfree(dev->dm.header_modify_sw_icm_alloc_blocks);
-
 err_mp:
        mlx5_ib_cleanup_multiport_master(dev);