diff mbox

[PATCHv1,1/1] IB/srp: fix invalid indirect_sg_entries parameter value

Message ID 1483451474-8096-1-git-send-email-maxg@mellanox.com (mailing list archive)
State Superseded
Headers show

Commit Message

Max Gurtovoy Jan. 3, 2017, 1:51 p.m. UTC
From: Israel Rukshin <israelr@mellanox.com>

After setting indirect_sg_entries module_param to huge value (e.g 500,000),
srp_alloc_req_data() fails to allocate indirect descriptors for the request
ring (kmalloc fails). This commit enforces the maximum value of indirect_sg_entries
to be SG_MAX_SEGMENTS as signified in module param description.

Signed-off-by: Israel Rukshin <israelr@mellanox.com>
Signed-off-by: Max Gurtovoy <maxg@mellanox.com>
---
 drivers/infiniband/ulp/srp/ib_srp.c | 7 +++++++
 1 file changed, 7 insertions(+)

Comments

Bart Van Assche Jan. 3, 2017, 5:59 p.m. UTC | #1
On Tue, 2017-01-03 at 15:51 +0200, Max Gurtovoy wrote:
> From: Israel Rukshin <israelr@mellanox.com>

> 

> After setting indirect_sg_entries module_param to huge value (e.g 500,000),

> srp_alloc_req_data() fails to allocate indirect descriptors for the request

> ring (kmalloc fails). This commit enforces the maximum value of indirect_sg_entries

> to be SG_MAX_SEGMENTS as signified in module param description.

> 

> Signed-off-by: Israel Rukshin <israelr@mellanox.com>

> Signed-off-by: Max Gurtovoy <maxg@mellanox.com>

> ---

>  drivers/infiniband/ulp/srp/ib_srp.c | 7 +++++++

>  1 file changed, 7 insertions(+)

> 

> diff --git a/drivers/infiniband/ulp/srp/ib_srp.c b/drivers/infiniband/ulp/srp/ib_srp.c

> index 0f67cf9..ccdd2c2 100644

> --- a/drivers/infiniband/ulp/srp/ib_srp.c

> +++ b/drivers/infiniband/ulp/srp/ib_srp.c

> @@ -3676,6 +3676,7 @@ static struct srp_function_template ib_srp_transport_functions = {

>  static int __init srp_init_module(void)

>  {

>  	int ret;

> +	unsigned int max_indirect_sg_entries = SG_MAX_SEGMENTS;

>  

>  	if (srp_sg_tablesize) {

>  		pr_warn("srp_sg_tablesize is deprecated, please use cmd_sg_entries\n");

> @@ -3699,6 +3700,12 @@ static int __init srp_init_module(void)

>  		indirect_sg_entries = cmd_sg_entries;

>  	}

>  

> +	if (indirect_sg_entries > max_indirect_sg_entries) {

> +		pr_warn("Clamping indirect_sg_entries to %u\n",

> +			max_indirect_sg_entries);

> +		indirect_sg_entries = max_indirect_sg_entries;

> +	}

> +

>  	srp_remove_wq = create_workqueue("srp_remove");

>  	if (!srp_remove_wq) {

>  		ret = -ENOMEM;


Hello Max,

That's a good catch, but why has the max_indirect_sg_entries variable been
introduced? Can it be left out?

Thanks,

Bart.
Laurence Oberman Jan. 3, 2017, 7:05 p.m. UTC | #2
----- Original Message -----
> From: "Bart Van Assche" <Bart.VanAssche@sandisk.com>
> To: maxg@mellanox.com, linux-rdma@vger.kernel.org
> Cc: israelr@mellanox.com
> Sent: Tuesday, January 3, 2017 12:59:49 PM
> Subject: Re: [PATCHv1 1/1] IB/srp: fix invalid indirect_sg_entries parameter value
> 
> On Tue, 2017-01-03 at 15:51 +0200, Max Gurtovoy wrote:
> > From: Israel Rukshin <israelr@mellanox.com>
> > 
> > After setting indirect_sg_entries module_param to huge value (e.g 500,000),
> > srp_alloc_req_data() fails to allocate indirect descriptors for the request
> > ring (kmalloc fails). This commit enforces the maximum value of
> > indirect_sg_entries
> > to be SG_MAX_SEGMENTS as signified in module param description.
> > 
> > Signed-off-by: Israel Rukshin <israelr@mellanox.com>
> > Signed-off-by: Max Gurtovoy <maxg@mellanox.com>
> > ---
> >  drivers/infiniband/ulp/srp/ib_srp.c | 7 +++++++
> >  1 file changed, 7 insertions(+)
> > 
> > diff --git a/drivers/infiniband/ulp/srp/ib_srp.c
> > b/drivers/infiniband/ulp/srp/ib_srp.c
> > index 0f67cf9..ccdd2c2 100644
> > --- a/drivers/infiniband/ulp/srp/ib_srp.c
> > +++ b/drivers/infiniband/ulp/srp/ib_srp.c
> > @@ -3676,6 +3676,7 @@ static struct srp_function_template
> > ib_srp_transport_functions = {
> >  static int __init srp_init_module(void)
> >  {
> >  	int ret;
> > +	unsigned int max_indirect_sg_entries = SG_MAX_SEGMENTS;
> >  
> >  	if (srp_sg_tablesize) {
> >  		pr_warn("srp_sg_tablesize is deprecated, please use cmd_sg_entries\n");
> > @@ -3699,6 +3700,12 @@ static int __init srp_init_module(void)
> >  		indirect_sg_entries = cmd_sg_entries;
> >  	}
> >  
> > +	if (indirect_sg_entries > max_indirect_sg_entries) {
> > +		pr_warn("Clamping indirect_sg_entries to %u\n",
> > +			max_indirect_sg_entries);
> > +		indirect_sg_entries = max_indirect_sg_entries;
> > +	}
> > +
> >  	srp_remove_wq = create_workqueue("srp_remove");
> >  	if (!srp_remove_wq) {
> >  		ret = -ENOMEM;
> 
> Hello Max,
> 
> That's a good catch, but why has the max_indirect_sg_entries variable been
> introduced? Can it be left out?
> 
> Thanks,
> 
> Bart.N�����r��y���b�X��ǧv�^�)޺{.n�+����{��ٚ�{ay�ʇڙ�,j��f���h���z��w������j:+v���w�j�m��������zZ+��ݢj"��

I have never had to set mine that high even when I was testing against the DDN arrays.
I run my tests with the module parameters set this way.

options ib_srp cmd_sg_entries=255 indirect_sg_entries=2048 

I thought 2048 was the max.

parm:           indirect_sg_entries:Default max number of gather/scatter entries (default is 12, max is 2048) (uint)

Thanks
Laurence
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/infiniband/ulp/srp/ib_srp.c b/drivers/infiniband/ulp/srp/ib_srp.c
index 0f67cf9..ccdd2c2 100644
--- a/drivers/infiniband/ulp/srp/ib_srp.c
+++ b/drivers/infiniband/ulp/srp/ib_srp.c
@@ -3676,6 +3676,7 @@  static struct srp_function_template ib_srp_transport_functions = {
 static int __init srp_init_module(void)
 {
 	int ret;
+	unsigned int max_indirect_sg_entries = SG_MAX_SEGMENTS;
 
 	if (srp_sg_tablesize) {
 		pr_warn("srp_sg_tablesize is deprecated, please use cmd_sg_entries\n");
@@ -3699,6 +3700,12 @@  static int __init srp_init_module(void)
 		indirect_sg_entries = cmd_sg_entries;
 	}
 
+	if (indirect_sg_entries > max_indirect_sg_entries) {
+		pr_warn("Clamping indirect_sg_entries to %u\n",
+			max_indirect_sg_entries);
+		indirect_sg_entries = max_indirect_sg_entries;
+	}
+
 	srp_remove_wq = create_workqueue("srp_remove");
 	if (!srp_remove_wq) {
 		ret = -ENOMEM;