mlx4_core: Scale size of MTT table with system RAM
authorRoland Dreier <roland@purestorage.com>
Mon, 5 Mar 2012 18:05:28 +0000 (10:05 -0800)
committerRoland Dreier <roland@purestorage.com>
Mon, 12 Mar 2012 23:24:59 +0000 (16:24 -0700)
The current driver defaults to 1M MTT segments, where each segment holds
8 MTT entries.  This limits the total memory registered to 8M * PAGE_SIZE
which is 32GB with 4K pages.  Since systems that have much more memory
are pretty common now (at least among systems with InfiniBand hardware),
this limit ends up getting hit in practice quite a bit.

Handle this by having the driver allocate at least enough MTT entries to
cover 2 * totalram pages.

Signed-off-by: Roland Dreier <roland@purestorage.com>
drivers/net/ethernet/mellanox/mlx4/mlx4.h
drivers/net/ethernet/mellanox/mlx4/profile.c

index 1aa362181a09341f35fa04bfe4fcad4e397dc77c..cb17af4d9abd8ccca2cee177d823221bd9e80d25 100644 (file)
@@ -403,7 +403,7 @@ struct mlx4_profile {
        int                     num_cq;
        int                     num_mcg;
        int                     num_mpt;
-       int                     num_mtt;
+       unsigned                num_mtt;
 };
 
 struct mlx4_fw {
index 1129677daa62608e1ab18bfcd5da8dc20abf8101..06e5adeb76f71840d7a34f2221c607dfcefcb723 100644 (file)
@@ -83,12 +83,31 @@ u64 mlx4_make_profile(struct mlx4_dev *dev,
        u64 total_size = 0;
        struct mlx4_resource *profile;
        struct mlx4_resource tmp;
+       struct sysinfo si;
        int i, j;
 
        profile = kcalloc(MLX4_RES_NUM, sizeof(*profile), GFP_KERNEL);
        if (!profile)
                return -ENOMEM;
 
+       /*
+        * We want to scale the number of MTTs with the size of the
+        * system memory, since it makes sense to register a lot of
+        * memory on a system with a lot of memory.  As a heuristic,
+        * make sure we have enough MTTs to cover twice the system
+        * memory (with PAGE_SIZE entries).
+        *
+        * This number has to be a power of two and fit into 32 bits
+        * due to device limitations, so cap this at 2^31 as well.
+        * That limits us to 8TB of memory registration per HCA with
+        * 4KB pages, which is probably OK for the next few months.
+        */
+       si_meminfo(&si);
+       request->num_mtt =
+               roundup_pow_of_two(max_t(unsigned, request->num_mtt,
+                                        min(1UL << 31,
+                                            si.totalram >> (log_mtts_per_seg - 1))));
+
        profile[MLX4_RES_QP].size     = dev_cap->qpc_entry_sz;
        profile[MLX4_RES_RDMARC].size = dev_cap->rdmarc_entry_sz;
        profile[MLX4_RES_ALTC].size   = dev_cap->altc_entry_sz;