From: Dotan Barak Date: Wed, 16 May 2012 07:56:29 +0000 (+0300) Subject: IB/core: Control number of retries for SA to leave an MCG X-Git-Tag: v4.1.12-92~319^2^2~6^2~11 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=d72da1585a2fe9daa21d59da798ea91987e8a6a5;p=users%2Fjedix%2Flinux-maple.git IB/core: Control number of retries for SA to leave an MCG Add a multicast leave maximum retry setting in: sys/module/ib_sa/parameters/mcast_leave_retries. Add a debug print when the maximum retry count is reached. Signed-off-by: Nir Muchtar Reviewed-by: Moni Shoua Signed-off-by: Vladimir Sokolovsky Fixup by adding modifications to changed file from following commit from Mellanox OFED-2.4 to account for kernel API change so there are no compiler warnings: 19b33d488938e1667bcc16562a2405d632428db0 (core, srp, mlx4_en: Adjustments to patch set which rebased to kernel 3.7) Signed-off-by: Ajaykumar Hotchandani (Ported from Mellanox OFED 2.4) Signed-off-by: Mukesh Kacker --- diff --git a/drivers/infiniband/core/multicast.c b/drivers/infiniband/core/multicast.c index fa17b552ff78b..63fff6588d360 100644 --- a/drivers/infiniband/core/multicast.c +++ b/drivers/infiniband/core/multicast.c @@ -38,10 +38,22 @@ #include #include #include +#include #include #include "sa.h" +static int mcast_leave_retries = 3; + +static const struct kernel_param_ops retry_ops = { + .set = param_set_int, + .get = param_get_int, +}; + +module_param_cb(mcast_leave_retries, &retry_ops, &mcast_leave_retries, 0644); +MODULE_PARM_DESC(mcast_leave_retries, "Number of retries for multicast leave " + "requests before giving up (default: 3)"); + static void mcast_add_one(struct ib_device *device); static void mcast_remove_one(struct ib_device *device); @@ -555,8 +567,12 @@ static void leave_handler(int status, struct ib_sa_mcmember_rec *rec, if (status && group->retries > 0 && !send_leave(group, group->leave_state)) group->retries--; - else + else { + if (status && group->retries <= 0) + printk(KERN_WARNING "reached max retry count. " + "status=%d. Giving up\n", status); mcast_work_handler(&group->work); + } } static struct mcast_group *acquire_group(struct mcast_port *port, @@ -579,7 +595,7 @@ static struct mcast_group *acquire_group(struct mcast_port *port, if (!group) return NULL; - group->retries = 3; + group->retries = mcast_leave_retries; group->port = port; group->rec.mgid = *mgid; group->pkey_index = MCAST_INVALID_PKEY_INDEX;