diff options
Diffstat (limited to 'drivers/infiniband/hw/mlx5/devx.c')
| -rw-r--r-- | drivers/infiniband/hw/mlx5/devx.c | 33 | 
1 files changed, 26 insertions, 7 deletions
diff --git a/drivers/infiniband/hw/mlx5/devx.c b/drivers/infiniband/hw/mlx5/devx.c index 2211a0be16f3..db5fb196c728 100644 --- a/drivers/infiniband/hw/mlx5/devx.c +++ b/drivers/infiniband/hw/mlx5/devx.c @@ -666,7 +666,21 @@ static bool devx_is_valid_obj_id(struct uverbs_attr_bundle *attrs,  				      obj_id;  	case MLX5_IB_OBJECT_DEVX_OBJ: -		return ((struct devx_obj *)uobj->object)->obj_id == obj_id; +	{ +		u16 opcode = MLX5_GET(general_obj_in_cmd_hdr, in, opcode); +		struct devx_obj *devx_uobj = uobj->object; + +		if (opcode == MLX5_CMD_OP_QUERY_FLOW_COUNTER && +		    devx_uobj->flow_counter_bulk_size) { +			u64 end; + +			end = devx_uobj->obj_id + +				devx_uobj->flow_counter_bulk_size; +			return devx_uobj->obj_id <= obj_id && end > obj_id; +		} + +		return devx_uobj->obj_id == obj_id; +	}  	default:  		return false; @@ -1517,10 +1531,17 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_OBJ_CREATE)(  		goto obj_free;  	if (opcode == MLX5_CMD_OP_ALLOC_FLOW_COUNTER) { -		u8 bulk = MLX5_GET(alloc_flow_counter_in, -				   cmd_in, -				   flow_counter_bulk); -		obj->flow_counter_bulk_size = 128UL * bulk; +		u32 bulk = MLX5_GET(alloc_flow_counter_in, +				    cmd_in, +				    flow_counter_bulk_log_size); + +		if (bulk) +			bulk = 1 << bulk; +		else +			bulk = 128UL * MLX5_GET(alloc_flow_counter_in, +						cmd_in, +						flow_counter_bulk); +		obj->flow_counter_bulk_size = bulk;  	}  	uobj->object = obj; @@ -1993,7 +2014,6 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_SUBSCRIBE_EVENT)(  	int redirect_fd;  	bool use_eventfd = false;  	int num_events; -	int num_alloc_xa_entries = 0;  	u16 obj_type = 0;  	u64 cookie = 0;  	u32 obj_id = 0; @@ -2075,7 +2095,6 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_SUBSCRIBE_EVENT)(  		if (err)  			goto err; -		num_alloc_xa_entries++;  		event_sub = kzalloc(sizeof(*event_sub), GFP_KERNEL);  		if (!event_sub) {  			err = -ENOMEM;  |