orabug:
19665303
This patch adds the following feature to ib_ipoib, rds_rdma, ib_core and
mlx4_core.
Adds a module parameter "module_unload_allowed". If the parameter is 1(the
default value), moudles can be unloaded(same behavior as before); other-
wise if it's 0, the module is not allowed to be unloaded. The paramter can't
be changed when module is loaded until the module is unloaded(if it can be).
default values:
ib_ipoib: 1 for YES
rds_rdma: 0 for NO
ib_core: 1 for YES
mlx4_core: 0 for NO
Signed-off-by: Wengang Wang <wen.gang.wang@oracle.com>
Acked-by: Joe Jin <joe.jin@oracle.com>
Acked-by: Todd Vierling <todd.vierling@oracle.com>
Acked-by: Yuval Shaia <yuval.shaia@oracle.com>
Signed-off-by: Guangyu Sun <guangyu.sun@oracle.com>
(cherry picked from commit
cf1a00039e6fea116e9ea7c82f55ee3ee5319cec)
Conflicts:
drivers/infiniband/core/device.c
drivers/infiniband/ulp/ipoib/ipoib_main.c
drivers/net/ethernet/mellanox/mlx4/main.c
MODULE_DESCRIPTION("core kernel InfiniBand API");
MODULE_LICENSE("Dual BSD/GPL");
+int unload_allowed __read_mostly = 1;
+
+module_param_named(module_unload_allowed, unload_allowed, int, 0444);
+MODULE_PARM_DESC(module_unload_allowed, "Allow this module to be unloaded or not (default 1 for YES)");
+
struct ib_client_data {
struct list_head list;
struct ib_client *client;
}
EXPORT_SYMBOL(ib_find_pkey);
+#define MODULE_NAME "ib_core"
+
static int __init ib_core_init(void)
{
int ret;
goto err_nl;
}
+ if (!unload_allowed) {
+ printk(KERN_NOTICE "Module %s locked in memory until next boot\n",
+ MODULE_NAME);
+ __module_get(THIS_MODULE);
+ }
+
return 0;
err_nl:
int ipoib_sendq_size __read_mostly = IPOIB_TX_RING_SIZE;
int ipoib_recvq_size __read_mostly = IPOIB_RX_RING_SIZE;
+int unload_allowed __read_mostly = 1;
+
+module_param_named(module_unload_allowed, unload_allowed, int, 0444);
+MODULE_PARM_DESC(module_unload_allowed, "Allow this module to be unloaded or not (default 1 for YES)");
module_param_named(send_queue_size, ipoib_sendq_size, int, 0444);
MODULE_PARM_DESC(send_queue_size, "Number of descriptors in send queue");
kfree(dev_list);
}
+#define MODULE_NAME "ib_ipoib"
+
static int __init ipoib_init_module(void)
{
int ret;
if (ret)
goto err_client;
+ if (!unload_allowed) {
+ printk(KERN_NOTICE "Module %s locked in memory until next boot\n",
+ MODULE_NAME);
+ __module_get(THIS_MODULE);
+ }
+
return 0;
err_client:
#endif /* CONFIG_MLX4_DEBUG */
+int unload_allowed __read_mostly;
+module_param_named(module_unload_allowed, unload_allowed, int, 0444);
+MODULE_PARM_DESC(module_unload_allowed, "Allow this module to be unloaded or not (default 0 for NO)");
+
#ifdef CONFIG_PCI_MSI
static int msi_x = 1;
return 0;
}
+#define MODULE_NAME "mlx4_core"
+
static int __init mlx4_init(void)
{
int ret;
return -ENOMEM;
ret = pci_register_driver(&mlx4_driver);
+ if (!ret && !unload_allowed) {
+ printk(KERN_NOTICE "Module %s locked in memory until next boot\n",
+ MODULE_NAME);
+ __module_get(THIS_MODULE);
+ }
if (ret < 0)
destroy_workqueue(mlx4_wq);
return ret < 0 ? ret : 0;
static struct rdma_cm_id *rds_iw_listen_id;
+int unload_allowed __read_mostly;
+
+module_param_named(module_unload_allowed, unload_allowed, int, 0444);
+MODULE_PARM_DESC(module_unload_allowed, "Allow this module to be unloaded or not (default 0 for NO)");
+
int rds_rdma_resolve_to_ms[] = {1000, 1000, 2000, 4000, 5000};
int rds_rdma_cm_event_handler(struct rdma_cm_id *cm_id,
}
}
+#define MODULE_NAME "rds_rdma"
+
int rds_rdma_init(void)
{
int ret;
if (ret)
goto err_ib_init;
+ if (!unload_allowed) {
+ printk(KERN_NOTICE "Module %s locked in memory until next boot\n",
+ MODULE_NAME);
+ __module_get(THIS_MODULE);
+ }
+
goto out;
err_ib_init: