diff options
Diffstat (limited to 'drivers/infiniband/hw/mlx5')
| -rw-r--r-- | drivers/infiniband/hw/mlx5/cq.c | 31 | ||||
| -rw-r--r-- | drivers/infiniband/hw/mlx5/devx.c | 11 | ||||
| -rw-r--r-- | drivers/infiniband/hw/mlx5/main.c | 36 | ||||
| -rw-r--r-- | drivers/infiniband/hw/mlx5/mlx5_ib.h | 1 | ||||
| -rw-r--r-- | drivers/infiniband/hw/mlx5/mr.c | 12 | ||||
| -rw-r--r-- | drivers/infiniband/hw/mlx5/qp.c | 4 | 
6 files changed, 47 insertions, 48 deletions
| diff --git a/drivers/infiniband/hw/mlx5/cq.c b/drivers/infiniband/hw/mlx5/cq.c index 088205d7f1a1..cca1820802b8 100644 --- a/drivers/infiniband/hw/mlx5/cq.c +++ b/drivers/infiniband/hw/mlx5/cq.c @@ -393,7 +393,7 @@ static void handle_atomics(struct mlx5_ib_qp *qp, struct mlx5_cqe64 *cqe64,  static void free_cq_buf(struct mlx5_ib_dev *dev, struct mlx5_ib_cq_buf *buf)  { -	mlx5_frag_buf_free(dev->mdev, &buf->fbc.frag_buf); +	mlx5_frag_buf_free(dev->mdev, &buf->frag_buf);  }  static void get_sig_err_item(struct mlx5_sig_err_cqe *cqe, @@ -728,16 +728,11 @@ static int alloc_cq_frag_buf(struct mlx5_ib_dev *dev,  			     int nent,  			     int cqe_size)  { -	struct mlx5_frag_buf_ctrl *c = &buf->fbc; -	struct mlx5_frag_buf *frag_buf = &c->frag_buf; -	u32 cqc_buff[MLX5_ST_SZ_DW(cqc)] = {0}; +	struct mlx5_frag_buf *frag_buf = &buf->frag_buf; +	u8 log_wq_stride = 6 + (cqe_size == 128 ? 1 : 0); +	u8 log_wq_sz     = ilog2(cqe_size);  	int err; -	MLX5_SET(cqc, cqc_buff, log_cq_size, ilog2(cqe_size)); -	MLX5_SET(cqc, cqc_buff, cqe_sz, (cqe_size == 128) ? 1 : 0); - -	mlx5_core_init_cq_frag_buf(&buf->fbc, cqc_buff); -  	err = mlx5_frag_buf_alloc_node(dev->mdev,  				       nent * cqe_size,  				       frag_buf, @@ -745,6 +740,8 @@ static int alloc_cq_frag_buf(struct mlx5_ib_dev *dev,  	if (err)  		return err; +	mlx5_init_fbc(frag_buf->frags, log_wq_stride, log_wq_sz, &buf->fbc); +  	buf->cqe_size = cqe_size;  	buf->nent = nent; @@ -934,7 +931,7 @@ static int create_cq_kernel(struct mlx5_ib_dev *dev, struct mlx5_ib_cq *cq,  	*inlen = MLX5_ST_SZ_BYTES(create_cq_in) +  		 MLX5_FLD_SZ_BYTES(create_cq_in, pas[0]) * -		 cq->buf.fbc.frag_buf.npages; +		 cq->buf.frag_buf.npages;  	*cqb = kvzalloc(*inlen, GFP_KERNEL);  	if (!*cqb) {  		err = -ENOMEM; @@ -942,11 +939,11 @@ static int create_cq_kernel(struct mlx5_ib_dev *dev, struct mlx5_ib_cq *cq,  	}  	pas = (__be64 *)MLX5_ADDR_OF(create_cq_in, *cqb, pas); -	mlx5_fill_page_frag_array(&cq->buf.fbc.frag_buf, pas); +	mlx5_fill_page_frag_array(&cq->buf.frag_buf, pas);  	cqc = MLX5_ADDR_OF(create_cq_in, *cqb, cq_context);  	MLX5_SET(cqc, cqc, log_page_size, -		 cq->buf.fbc.frag_buf.page_shift - +		 cq->buf.frag_buf.page_shift -  		 MLX5_ADAPTER_PAGE_SHIFT);  	*index = dev->mdev->priv.uar->index; @@ -1365,11 +1362,10 @@ int mlx5_ib_resize_cq(struct ib_cq *ibcq, int entries, struct ib_udata *udata)  		cqe_size = 64;  		err = resize_kernel(dev, cq, entries, cqe_size);  		if (!err) { -			struct mlx5_frag_buf_ctrl *c; +			struct mlx5_frag_buf *frag_buf = &cq->resize_buf->frag_buf; -			c = &cq->resize_buf->fbc; -			npas = c->frag_buf.npages; -			page_shift = c->frag_buf.page_shift; +			npas = frag_buf->npages; +			page_shift = frag_buf->page_shift;  		}  	} @@ -1390,8 +1386,7 @@ int mlx5_ib_resize_cq(struct ib_cq *ibcq, int entries, struct ib_udata *udata)  		mlx5_ib_populate_pas(dev, cq->resize_umem, page_shift,  				     pas, 0);  	else -		mlx5_fill_page_frag_array(&cq->resize_buf->fbc.frag_buf, -					  pas); +		mlx5_fill_page_frag_array(&cq->resize_buf->frag_buf, pas);  	MLX5_SET(modify_cq_in, in,  		 modify_field_select_resize_field_select.resize_field_select.resize_field_select, diff --git a/drivers/infiniband/hw/mlx5/devx.c b/drivers/infiniband/hw/mlx5/devx.c index ac116d63e466..66dc337e49a7 100644 --- a/drivers/infiniband/hw/mlx5/devx.c +++ b/drivers/infiniband/hw/mlx5/devx.c @@ -284,7 +284,7 @@ static bool devx_is_obj_create_cmd(const void *in)  	case MLX5_CMD_OP_CREATE_FLOW_TABLE:  	case MLX5_CMD_OP_CREATE_FLOW_GROUP:  	case MLX5_CMD_OP_ALLOC_FLOW_COUNTER: -	case MLX5_CMD_OP_ALLOC_ENCAP_HEADER: +	case MLX5_CMD_OP_ALLOC_PACKET_REFORMAT_CONTEXT:  	case MLX5_CMD_OP_ALLOC_MODIFY_HEADER_CONTEXT:  	case MLX5_CMD_OP_CREATE_SCHEDULING_ELEMENT:  	case MLX5_CMD_OP_ADD_VXLAN_UDP_DPORT: @@ -627,9 +627,9 @@ static void devx_obj_build_destroy_cmd(void *in, void *out, void *din,  		MLX5_SET(general_obj_in_cmd_hdr, din, opcode,  			 MLX5_CMD_OP_DEALLOC_FLOW_COUNTER);  		break; -	case MLX5_CMD_OP_ALLOC_ENCAP_HEADER: +	case MLX5_CMD_OP_ALLOC_PACKET_REFORMAT_CONTEXT:  		MLX5_SET(general_obj_in_cmd_hdr, din, opcode, -			 MLX5_CMD_OP_DEALLOC_ENCAP_HEADER); +			 MLX5_CMD_OP_DEALLOC_PACKET_REFORMAT_CONTEXT);  		break;  	case MLX5_CMD_OP_ALLOC_MODIFY_HEADER_CONTEXT:  		MLX5_SET(general_obj_in_cmd_hdr, din, opcode, @@ -723,6 +723,7 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_OBJ_CREATE)(  		attrs, MLX5_IB_ATTR_DEVX_OBJ_CREATE_HANDLE);  	struct mlx5_ib_ucontext *c = to_mucontext(uobj->context);  	struct mlx5_ib_dev *dev = to_mdev(c->ibucontext.device); +	u32 out[MLX5_ST_SZ_DW(general_obj_out_cmd_hdr)];  	struct devx_obj *obj;  	int err; @@ -754,10 +755,12 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_OBJ_CREATE)(  	err = uverbs_copy_to(attrs, MLX5_IB_ATTR_DEVX_OBJ_CREATE_CMD_OUT, cmd_out, cmd_out_len);  	if (err) -		goto obj_free; +		goto obj_destroy;  	return 0; +obj_destroy: +	mlx5_cmd_exec(obj->mdev, obj->dinbox, obj->dinlen, out, sizeof(out));  obj_free:  	kfree(obj);  	return err; diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c index c414f3809e5c..af32899bb72a 100644 --- a/drivers/infiniband/hw/mlx5/main.c +++ b/drivers/infiniband/hw/mlx5/main.c @@ -2793,7 +2793,7 @@ static int parse_flow_attr(struct mlx5_core_dev *mdev, u32 *match_c,  			return -EINVAL;  		action->flow_tag = ib_spec->flow_tag.tag_id; -		action->has_flow_tag = true; +		action->flags |= FLOW_ACT_HAS_TAG;  		break;  	case IB_FLOW_SPEC_ACTION_DROP:  		if (FIELDS_NOT_SUPPORTED(ib_spec->drop, @@ -2886,7 +2886,7 @@ is_valid_esp_aes_gcm(struct mlx5_core_dev *mdev,  		return egress ? VALID_SPEC_INVALID : VALID_SPEC_NA;  	return is_crypto && is_ipsec && -		(!egress || (!is_drop && !flow_act->has_flow_tag)) ? +		(!egress || (!is_drop && !(flow_act->flags & FLOW_ACT_HAS_TAG))) ?  		VALID_SPEC_VALID : VALID_SPEC_INVALID;  } @@ -3320,15 +3320,18 @@ static struct mlx5_ib_flow_handler *_create_flow_rule(struct mlx5_ib_dev *dev,  	}  	if (flow_act.action & MLX5_FLOW_CONTEXT_ACTION_COUNT) { +		struct mlx5_ib_mcounters *mcounters; +  		err = flow_counters_set_data(flow_act.counters, ucmd);  		if (err)  			goto free; +		mcounters = to_mcounters(flow_act.counters);  		handler->ibcounters = flow_act.counters;  		dest_arr[dest_num].type =  			MLX5_FLOW_DESTINATION_TYPE_COUNTER; -		dest_arr[dest_num].counter = -			to_mcounters(flow_act.counters)->hw_cntrs_hndl; +		dest_arr[dest_num].counter_id = +			mlx5_fc_id(mcounters->hw_cntrs_hndl);  		dest_num++;  	} @@ -3346,7 +3349,7 @@ static struct mlx5_ib_flow_handler *_create_flow_rule(struct mlx5_ib_dev *dev,  					MLX5_FLOW_CONTEXT_ACTION_FWD_NEXT_PRIO;  	} -	if (flow_act.has_flow_tag && +	if ((flow_act.flags & FLOW_ACT_HAS_TAG)  &&  	    (flow_attr->type == IB_FLOW_ATTR_ALL_DEFAULT ||  	     flow_attr->type == IB_FLOW_ATTR_MC_DEFAULT)) {  		mlx5_ib_warn(dev, "Flow tag %u and attribute type %x isn't allowed in leftovers\n", @@ -5163,22 +5166,14 @@ done:  	return num_counters;  } -static struct net_device* -mlx5_ib_alloc_rdma_netdev(struct ib_device *hca, -			  u8 port_num, -			  enum rdma_netdev_t type, -			  const char *name, -			  unsigned char name_assign_type, -			  void (*setup)(struct net_device *)) +static int mlx5_ib_rn_get_params(struct ib_device *device, u8 port_num, +				 enum rdma_netdev_t type, +				 struct rdma_netdev_alloc_params *params)  { -	struct net_device *netdev; -  	if (type != RDMA_NETDEV_IPOIB) -		return ERR_PTR(-EOPNOTSUPP); +		return -EOPNOTSUPP; -	netdev = mlx5_rdma_netdev_alloc(to_mdev(hca)->mdev, hca, -					name, setup); -	return netdev; +	return mlx5_rdma_rn_get_params(to_mdev(device)->mdev, device, params);  }  static void delay_drop_debugfs_cleanup(struct mlx5_ib_dev *dev) @@ -5824,8 +5819,9 @@ int mlx5_ib_stage_caps_init(struct mlx5_ib_dev *dev)  	dev->ib_dev.check_mr_status	= mlx5_ib_check_mr_status;  	dev->ib_dev.get_dev_fw_str      = get_dev_fw_str;  	dev->ib_dev.get_vector_affinity	= mlx5_ib_get_vector_affinity; -	if (MLX5_CAP_GEN(mdev, ipoib_enhanced_offloads)) -		dev->ib_dev.alloc_rdma_netdev	= mlx5_ib_alloc_rdma_netdev; +	if (MLX5_CAP_GEN(mdev, ipoib_enhanced_offloads) && +	    IS_ENABLED(CONFIG_MLX5_CORE_IPOIB)) +		dev->ib_dev.rdma_netdev_get_params = mlx5_ib_rn_get_params;  	if (mlx5_core_is_pf(mdev)) {  		dev->ib_dev.get_vf_config	= mlx5_ib_get_vf_config; diff --git a/drivers/infiniband/hw/mlx5/mlx5_ib.h b/drivers/infiniband/hw/mlx5/mlx5_ib.h index 320d4dfe8c2f..289c18db2611 100644 --- a/drivers/infiniband/hw/mlx5/mlx5_ib.h +++ b/drivers/infiniband/hw/mlx5/mlx5_ib.h @@ -435,6 +435,7 @@ struct mlx5_ib_qp {  struct mlx5_ib_cq_buf {  	struct mlx5_frag_buf_ctrl fbc; +	struct mlx5_frag_buf    frag_buf;  	struct ib_umem		*umem;  	int			cqe_size;  	int			nent; diff --git a/drivers/infiniband/hw/mlx5/mr.c b/drivers/infiniband/hw/mlx5/mr.c index 9fb1d9cb9401..e22314837645 100644 --- a/drivers/infiniband/hw/mlx5/mr.c +++ b/drivers/infiniband/hw/mlx5/mr.c @@ -544,6 +544,9 @@ void mlx5_mr_cache_free(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr)  	int shrink = 0;  	int c; +	if (!mr->allocated_from_cache) +		return; +  	c = order2idx(dev, mr->order);  	if (c < 0 || c >= MAX_MR_CACHE_ENTRIES) {  		mlx5_ib_warn(dev, "order %d, cache index %d\n", mr->order, c); @@ -1647,18 +1650,19 @@ static void dereg_mr(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr)  		umem = NULL;  	}  #endif -  	clean_mr(dev, mr); +	/* +	 * We should unregister the DMA address from the HCA before +	 * remove the DMA mapping. +	 */ +	mlx5_mr_cache_free(dev, mr);  	if (umem) {  		ib_umem_release(umem);  		atomic_sub(npages, &dev->mdev->priv.reg_pages);  	} -  	if (!mr->allocated_from_cache)  		kfree(mr); -	else -		mlx5_mr_cache_free(dev, mr);  }  int mlx5_ib_dereg_mr(struct ib_mr *ibmr) diff --git a/drivers/infiniband/hw/mlx5/qp.c b/drivers/infiniband/hw/mlx5/qp.c index 6cba2a02d11b..daf1eb84cd31 100644 --- a/drivers/infiniband/hw/mlx5/qp.c +++ b/drivers/infiniband/hw/mlx5/qp.c @@ -1279,7 +1279,7 @@ static int create_raw_packet_qp_tir(struct mlx5_ib_dev *dev,  	if (dev->rep)  		MLX5_SET(tirc, tirc, self_lb_block, -			 MLX5_TIRC_SELF_LB_BLOCK_BLOCK_UNICAST_); +			 MLX5_TIRC_SELF_LB_BLOCK_BLOCK_UNICAST);  	err = mlx5_core_create_tir(dev->mdev, in, inlen, &rq->tirn); @@ -1582,7 +1582,7 @@ static int create_rss_raw_qp_tir(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp,  create_tir:  	if (dev->rep)  		MLX5_SET(tirc, tirc, self_lb_block, -			 MLX5_TIRC_SELF_LB_BLOCK_BLOCK_UNICAST_); +			 MLX5_TIRC_SELF_LB_BLOCK_BLOCK_UNICAST);  	err = mlx5_core_create_tir(dev->mdev, in, inlen, &qp->rss_qp.tirn); |