Commit b86a5f24 authored by Steve Wise's avatar Steve Wise Committed by Ben Hutchings

RDMA/iwcm: Use a default listen backlog if needed

commit 2f0304d2 upstream.

If the user creates a listening cm_id with backlog of 0 the IWCM ends
up not allowing any connection requests at all.  The correct behavior
is for the IWCM to pick a default value if the user backlog parameter
is zero.

Lustre from version 1.8.8 onward uses a backlog of 0, which breaks
iwarp support without this fix.
Signed-off-by: default avatarSteve Wise <swise@opengridcomputing.com>
Signed-off-by: default avatarRoland Dreier <roland@purestorage.com>
[bwh: Backported to 3.2: use register_net_sysctl_table()]
Signed-off-by: default avatarBen Hutchings <ben@decadent.org.uk>
parent 9ff66a75
...@@ -46,6 +46,7 @@ ...@@ -46,6 +46,7 @@
#include <linux/completion.h> #include <linux/completion.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/sysctl.h>
#include <rdma/iw_cm.h> #include <rdma/iw_cm.h>
#include <rdma/ib_addr.h> #include <rdma/ib_addr.h>
...@@ -65,6 +66,20 @@ struct iwcm_work { ...@@ -65,6 +66,20 @@ struct iwcm_work {
struct list_head free_list; struct list_head free_list;
}; };
static unsigned int default_backlog = 256;
static struct ctl_table_header *iwcm_ctl_table_hdr;
static struct ctl_table iwcm_ctl_table[] = {
{
.procname = "default_backlog",
.data = &default_backlog,
.maxlen = sizeof(default_backlog),
.mode = 0644,
.proc_handler = proc_dointvec,
},
{ }
};
/* /*
* The following services provide a mechanism for pre-allocating iwcm_work * The following services provide a mechanism for pre-allocating iwcm_work
* elements. The design pre-allocates them based on the cm_id type: * elements. The design pre-allocates them based on the cm_id type:
...@@ -419,6 +434,9 @@ int iw_cm_listen(struct iw_cm_id *cm_id, int backlog) ...@@ -419,6 +434,9 @@ int iw_cm_listen(struct iw_cm_id *cm_id, int backlog)
cm_id_priv = container_of(cm_id, struct iwcm_id_private, id); cm_id_priv = container_of(cm_id, struct iwcm_id_private, id);
if (!backlog)
backlog = default_backlog;
ret = alloc_work_entries(cm_id_priv, backlog); ret = alloc_work_entries(cm_id_priv, backlog);
if (ret) if (ret)
return ret; return ret;
...@@ -1014,17 +1032,33 @@ int iw_cm_init_qp_attr(struct iw_cm_id *cm_id, ...@@ -1014,17 +1032,33 @@ int iw_cm_init_qp_attr(struct iw_cm_id *cm_id,
} }
EXPORT_SYMBOL(iw_cm_init_qp_attr); EXPORT_SYMBOL(iw_cm_init_qp_attr);
static struct ctl_path iwcm_ctl_path[] = {
{ .procname = "net" },
{ .procname = "iw_cm" },
{ }
};
static int __init iw_cm_init(void) static int __init iw_cm_init(void)
{ {
iwcm_wq = create_singlethread_workqueue("iw_cm_wq"); iwcm_wq = create_singlethread_workqueue("iw_cm_wq");
if (!iwcm_wq) if (!iwcm_wq)
return -ENOMEM; return -ENOMEM;
iwcm_ctl_table_hdr = register_net_sysctl_table(&init_net,
iwcm_ctl_path,
iwcm_ctl_table);
if (!iwcm_ctl_table_hdr) {
pr_err("iw_cm: couldn't register sysctl paths\n");
destroy_workqueue(iwcm_wq);
return -ENOMEM;
}
return 0; return 0;
} }
static void __exit iw_cm_cleanup(void) static void __exit iw_cm_cleanup(void)
{ {
unregister_net_sysctl_table(iwcm_ctl_table_hdr);
destroy_workqueue(iwcm_wq); destroy_workqueue(iwcm_wq);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment