IB/mlx5: Check supported flow table size
authorMaor Gottlieb <maorg@mellanox.com>
Wed, 29 Mar 2017 03:09:00 +0000 (06:09 +0300)
committerDoug Ledford <dledford@redhat.com>
Fri, 21 Apr 2017 16:26:05 +0000 (12:26 -0400)
Check that the required flow table size is supported
by device. Return ENOMEM error if no space left.

In addition change the create flow table routine
to return ENOMEM instead of ENOSPC.

Fixes: 038d2ef87572 ('IB/mlx5: Add flow steering support')
Signed-off-by: Maor Gottlieb <maorg@mellanox.com>
Signed-off-by: Leon Romanovsky <leon@kernel.org>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/hw/mlx5/main.c

index 3ecb3c3f6ed2e50d064b9975c767633d01d695cd..1cca907d65b25e061523933f28b9549974a97cf5 100644 (file)
@@ -2049,11 +2049,14 @@ static struct mlx5_ib_flow_prio *get_flow_table(struct mlx5_ib_dev *dev,
        struct mlx5_flow_namespace *ns = NULL;
        struct mlx5_ib_flow_prio *prio;
        struct mlx5_flow_table *ft;
+       int max_table_size;
        int num_entries;
        int num_groups;
        int priority;
        int err = 0;
 
+       max_table_size = BIT(MLX5_CAP_FLOWTABLE_NIC_RX(dev->mdev,
+                                                      log_max_ft_size));
        if (flow_attr->type == IB_FLOW_ATTR_NORMAL) {
                if (flow_is_multicast_only(flow_attr) &&
                    !dont_trap)
@@ -2092,6 +2095,9 @@ static struct mlx5_ib_flow_prio *get_flow_table(struct mlx5_ib_dev *dev,
        if (!ns)
                return ERR_PTR(-ENOTSUPP);
 
+       if (num_entries > max_table_size)
+               return ERR_PTR(-ENOMEM);
+
        ft = prio->flow_table;
        if (!ft) {
                ft = mlx5_create_auto_grouped_flow_table(ns, priority,
@@ -2316,7 +2322,7 @@ static struct ib_flow *mlx5_ib_create_flow(struct ib_qp *qp,
        int err;
 
        if (flow_attr->priority > MLX5_IB_FLOW_LAST_PRIO)
-               return ERR_PTR(-ENOSPC);
+               return ERR_PTR(-ENOMEM);
 
        if (domain != IB_FLOW_DOMAIN_USER ||
            flow_attr->port > MLX5_CAP_GEN(dev->mdev, num_ports) ||