]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
mlx4_core: Extend num_mtt in dev caps to avoid overflow.
authorMajd Dibbiny <majd@mellanox.com>
Tue, 27 Aug 2013 11:07:36 +0000 (14:07 +0300)
committerMukesh Kacker <mukesh.kacker@oracle.com>
Tue, 7 Jul 2015 21:45:13 +0000 (14:45 -0700)
Some legitimate combinations of log_num_mtt and log_mtts_per_seg
cause overflow in the calculation of the num_mtt when initializing
the HCA which causes Kernel panic. Changed the variable to be 'u64'
instead of 'int' to avoid the overflow and made the needed changes
to support the new type.

Signed-off-by: Majd Dibbiny <majd@mellanox.com>
(Ported from Mellanox OFED 2.4)

Signed-off-by: Mukesh Kacker <mukesh.kacker@oracle.com>
drivers/net/ethernet/mellanox/mlx4/icm.c
drivers/net/ethernet/mellanox/mlx4/icm.h
drivers/net/ethernet/mellanox/mlx4/mr.c
drivers/net/ethernet/mellanox/mlx4/profile.c
include/linux/mlx4/device.h

index 2a9dd460a95f8149d884af048dc651eaaec4904f..ff147bb7f33e4e26141a916fa1a616b083b60fef 100644 (file)
@@ -384,7 +384,7 @@ void mlx4_table_put_range(struct mlx4_dev *dev, struct mlx4_icm_table *table,
 }
 
 int mlx4_init_icm_table(struct mlx4_dev *dev, struct mlx4_icm_table *table,
-                       u64 virt, int obj_size, u32 nobj, int reserved,
+                       u64 virt, int obj_size, u64 nobj, int reserved,
                        int use_lowmem, int use_coherent)
 {
        int obj_per_chunk;
index 0c73645501509d752f8316da7c72fefe8deb03f9..7871a41dfc60c76ce16dd1894e145fa60f8fe6d7 100644 (file)
@@ -79,7 +79,7 @@ int mlx4_table_get_range(struct mlx4_dev *dev, struct mlx4_icm_table *table,
 void mlx4_table_put_range(struct mlx4_dev *dev, struct mlx4_icm_table *table,
                          u32 start, u32 end);
 int mlx4_init_icm_table(struct mlx4_dev *dev, struct mlx4_icm_table *table,
-                       u64 virt, int obj_size, u32 nobj, int reserved,
+                       u64 virt, int obj_size, u64 nobj, int reserved,
                        int use_lowmem, int use_coherent);
 void mlx4_cleanup_icm_table(struct mlx4_dev *dev, struct mlx4_icm_table *table);
 void *mlx4_table_find(struct mlx4_icm_table *table, u32 obj, dma_addr_t *dma_handle);
index bc7fd3282b4fe5b1fe14d25891bf627a0e4408b0..0ceb6a22f3a8e9de96209ba824ad443ee29b01f3 100644 (file)
@@ -930,7 +930,7 @@ int mlx4_init_mr_table(struct mlx4_dev *dev)
                return err;
 
        err = mlx4_buddy_init(&mr_table->mtt_buddy,
-                             ilog2((u32)dev->caps.num_mtts /
+                             ilog2(dev->caps.num_mtts /
                              (1 << log_mtts_per_seg)));
        if (err)
                goto err_buddy;
index ff5648b88ddbfbe2b9c49d643a46678465b36556..612c56cfd77ab9f419aabbe3635ea1268da575c8 100644 (file)
@@ -76,7 +76,7 @@ u64 mlx4_make_profile(struct mlx4_dev *dev,
                u64 size;
                u64 start;
                int type;
-               u32 num;
+               u64 num;
                int log_num;
        };
 
@@ -111,7 +111,7 @@ u64 mlx4_make_profile(struct mlx4_dev *dev,
                                        min_t(unsigned, dev_cap->max_eqs, MAX_MSIX);
        profile[MLX4_RES_DMPT].num    = request->num_mpt;
        profile[MLX4_RES_CMPT].num    = MLX4_NUM_CMPTS;
-       profile[MLX4_RES_MTT].num     = request->num_mtt * (1 << log_mtts_per_seg);
+       profile[MLX4_RES_MTT].num     = ((u64)request->num_mtt) * (1 << log_mtts_per_seg);
        profile[MLX4_RES_MCG].num     = request->num_mcg;
 
        for (i = 0; i < MLX4_RES_NUM; ++i) {
index ce7efff302f9cfd231bdd0de2de6a892e5017d36..7a1428ae1f53fd6aa01c6f7d6ebb44638c375b47 100644 (file)
@@ -536,7 +536,7 @@ struct mlx4_caps {
        int                     comp_pool;
        int                     num_mpts;
        int                     max_fmr_maps;
-       int                     num_mtts;
+       u64                     num_mtts;
        int                     fmr_reserved_mtts;
        int                     reserved_mtts;
        int                     reserved_mrws;