net/mlx4_core: Use low memory profile on kdump kernel
authorAmir Vadai <amirv@mellanox.com>
Tue, 22 Jul 2014 12:44:11 +0000 (15:44 +0300)
committerDavid S. Miller <davem@davemloft.net>
Wed, 23 Jul 2014 02:53:14 +0000 (19:53 -0700)
When running in kdump kernel, reduce number of resources allocated for
the hardware. This will enable the NIC to operate in this low memory
environment at the expense of performance and some features not related
to the basic NIC functionality.

Signed-off-by: Amir Vadai <amirv@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlx4/main.c
include/linux/mlx4/device.h

index 82ab427290c30a8f6aaf478ea98c1a1207e5724d..80b8c5f30e4e709648282cc88cf29df7438c7bdd 100644 (file)
@@ -120,6 +120,16 @@ static struct mlx4_profile default_profile = {
        .num_mtt        = 1 << 20, /* It is really num mtt segements */
 };
 
+static struct mlx4_profile low_mem_profile = {
+       .num_qp         = 1 << 17,
+       .num_srq        = 1 << 6,
+       .rdmarc_per_qp  = 1 << 4,
+       .num_cq         = 1 << 8,
+       .num_mcg        = 1 << 8,
+       .num_mpt        = 1 << 9,
+       .num_mtt        = 1 << 7,
+};
+
 static int log_num_mac = 7;
 module_param_named(log_num_mac, log_num_mac, int, 0444);
 MODULE_PARM_DESC(log_num_mac, "Log2 max number of MACs per ETH port (1-7)");
@@ -129,6 +139,8 @@ module_param_named(log_num_vlan, log_num_vlan, int, 0444);
 MODULE_PARM_DESC(log_num_vlan, "Log2 max number of VLANs per ETH port (0-7)");
 /* Log2 max number of VLANs per ETH port (0-7) */
 #define MLX4_LOG_NUM_VLANS 7
+#define MLX4_MIN_LOG_NUM_VLANS 0
+#define MLX4_MIN_LOG_NUM_MAC 1
 
 static bool use_prio;
 module_param_named(use_prio, use_prio, bool, 0444);
@@ -287,8 +299,13 @@ static int mlx4_dev_cap(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
        if (mlx4_is_mfunc(dev))
                dev->caps.flags &= ~MLX4_DEV_CAP_FLAG_SENSE_SUPPORT;
 
-       dev->caps.log_num_macs  = log_num_mac;
-       dev->caps.log_num_vlans = MLX4_LOG_NUM_VLANS;
+       if (mlx4_low_memory_profile()) {
+               dev->caps.log_num_macs  = MLX4_MIN_LOG_NUM_MAC;
+               dev->caps.log_num_vlans = MLX4_MIN_LOG_NUM_VLANS;
+       } else {
+               dev->caps.log_num_macs  = log_num_mac;
+               dev->caps.log_num_vlans = MLX4_LOG_NUM_VLANS;
+       }
 
        for (i = 1; i <= dev->caps.num_ports; ++i) {
                dev->caps.port_type[i] = MLX4_PORT_TYPE_NONE;
@@ -1587,7 +1604,12 @@ static int mlx4_init_hca(struct mlx4_dev *dev)
                if (mlx4_is_master(dev))
                        mlx4_parav_master_pf_caps(dev);
 
-               profile = default_profile;
+               if (mlx4_low_memory_profile()) {
+                       mlx4_info(dev, "Running from within kdump kernel. Using low memory profile\n");
+                       profile = low_mem_profile;
+               } else {
+                       profile = default_profile;
+               }
                if (dev->caps.steering_mode ==
                    MLX4_STEERING_MODE_DEVICE_MANAGED)
                        profile.num_mcg = MLX4_FS_NUM_MCG;
index fa660aedb822f05b2ba1068ca8499b51146dd3a7..e15b1544ea836716b7e6f9588ac1ecf9d486fc55 100644 (file)
@@ -1254,4 +1254,11 @@ int mlx4_vf_smi_enabled(struct mlx4_dev *dev, int slave, int port);
 int mlx4_vf_get_enable_smi_admin(struct mlx4_dev *dev, int slave, int port);
 int mlx4_vf_set_enable_smi_admin(struct mlx4_dev *dev, int slave, int port,
                                 int enable);
+
+/* Returns true if running in low memory profile (kdump kernel) */
+static inline bool mlx4_low_memory_profile(void)
+{
+       return reset_devices;
+}
+
 #endif /* MLX4_DEVICE_H */