diff mbox

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

Message ID 1483538377-19379-2-git-send-email-maxg@mellanox.com (mailing list archive)
State Accepted
Headers show

Commit Message

Max Gurtovoy Jan. 4, 2017, 1:59 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 | 6 ++++++
 1 file changed, 6 insertions(+)

Comments

Laurence Oberman Jan. 4, 2017, 2:33 p.m. UTC | #1
----- Original Message -----
> From: "Max Gurtovoy" <maxg@mellanox.com>
> To: "Bart VanAssche" <Bart.VanAssche@sandisk.com>, dledford@redhat.com, linux-rdma@vger.kernel.org
> Cc: "Israel Rukshin" <israelr@mellanox.com>, "Max Gurtovoy" <maxg@mellanox.com>
> Sent: Wednesday, January 4, 2017 8:59:37 AM
> Subject: [PATCHv2 1/1] IB/srp: fix invalid indirect_sg_entries parameter value
> 
> 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 | 6 ++++++
>  1 file changed, 6 insertions(+)
> 
> diff --git a/drivers/infiniband/ulp/srp/ib_srp.c
> b/drivers/infiniband/ulp/srp/ib_srp.c
> index 0f67cf9..79bf484 100644
> --- a/drivers/infiniband/ulp/srp/ib_srp.c
> +++ b/drivers/infiniband/ulp/srp/ib_srp.c
> @@ -3699,6 +3699,12 @@ static int __init srp_init_module(void)
>  		indirect_sg_entries = cmd_sg_entries;
>  	}
>  
> +	if (indirect_sg_entries > SG_MAX_SEGMENTS) {
> +		pr_warn("Clamping indirect_sg_entries to %u\n",
> +			SG_MAX_SEGMENTS);
> +		indirect_sg_entries = SG_MAX_SEGMENTS;
> +	}
> +
>  	srp_remove_wq = create_workqueue("srp_remove");
>  	if (!srp_remove_wq) {
>  		ret = -ENOMEM;
> --
> 1.8.4.3
> 
> --
> 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
> 

Hello Max 

MODULE_PARM_DESC(indirect_sg_entries,
                 "Default max number of gather/scatter entries (default is 12, max is " __stringify(SG_MAX_SEGMENTS) ")");

I am looking at the code here and SG_MAX_SEGMENTS is #define 2048 so it indeed caps the maximum size to 2048.

The patch makes sense to now me as I see that the value for indirect_sg_entries was never controlled before.
Of course if you behave and go by the modinfo you should never be setting it higher than 2048 but its good to manage the size.

Looks good to me.

Reviewed-by: Laurence Oberman <loberman@redhat.com>
--
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
Bart Van Assche Jan. 4, 2017, 3:09 p.m. UTC | #2
On Wed, 2017-01-04 at 15:59 +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 | 6 ++++++
>  1 file changed, 6 insertions(+)
> 
> diff --git a/drivers/infiniband/ulp/srp/ib_srp.c b/drivers/infiniband/ulp/srp/ib_srp.c
> index 0f67cf9..79bf484 100644
> --- a/drivers/infiniband/ulp/srp/ib_srp.c
> +++ b/drivers/infiniband/ulp/srp/ib_srp.c
> @@ -3699,6 +3699,12 @@ static int __init srp_init_module(void)
>  		indirect_sg_entries = cmd_sg_entries;
>  	}
>  
> +	if (indirect_sg_entries > SG_MAX_SEGMENTS) {
> +		pr_warn("Clamping indirect_sg_entries to %u\n",
> +			SG_MAX_SEGMENTS);
> +		indirect_sg_entries = SG_MAX_SEGMENTS;
> +	}
> +
>  	srp_remove_wq = create_workqueue("srp_remove");
>  	if (!srp_remove_wq) {
>  		ret = -ENOMEM;

Thanks!

Reviewed-by: Bart Van Assche <bart.vanassche@sandisk.com>--
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
Doug Ledford Jan. 24, 2017, 4:32 p.m. UTC | #3
On Wed, 2017-01-04 at 15:09 +0000, Bart Van Assche wrote:
> On Wed, 2017-01-04 at 15:59 +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 | 6 ++++++
> >  1 file changed, 6 insertions(+)
> > 
> > diff --git a/drivers/infiniband/ulp/srp/ib_srp.c
> > b/drivers/infiniband/ulp/srp/ib_srp.c
> > index 0f67cf9..79bf484 100644
> > --- a/drivers/infiniband/ulp/srp/ib_srp.c
> > +++ b/drivers/infiniband/ulp/srp/ib_srp.c
> > @@ -3699,6 +3699,12 @@ static int __init srp_init_module(void)
> >  		indirect_sg_entries = cmd_sg_entries;
> >  	}
> >  
> > +	if (indirect_sg_entries > SG_MAX_SEGMENTS) {
> > +		pr_warn("Clamping indirect_sg_entries to %u\n",
> > +			SG_MAX_SEGMENTS);
> > +		indirect_sg_entries = SG_MAX_SEGMENTS;
> > +	}
> > +
> >  	srp_remove_wq = create_workqueue("srp_remove");
> >  	if (!srp_remove_wq) {
> >  		ret = -ENOMEM;
> 
> Thanks!
> 
> Reviewed-by: Bart Van Assche <bart.vanassche@sandisk.com>

This patch is a fix patch and should have been tagged as such.
 However, the proper tagging is complicated by the fact that the
SG_MAX_SEGMENTS was originally named SCSI_MAX_SG_CHAIN_SEGMENTS.  The
fix applies all the way back to the first patch to enable SG segments
in the srp driver, but you will need a different patch for the kernels
prior to the rename.  For this patch, I've added the following tags and
applied the patch:

Fixes: 65e8617fba17 (scsi: rename SCSI_MAX_{SG, SG_CHAIN}_SEGMENTS)
Fixes: c07d424d6118 (IB/srp: add support for indirect tables that don't
fit in SRP_CMD)
Cc: stable@vger.kernel.org # 4.7+

Someone should write a patch for the earlier kernels and submit it
directly to stable@ with the patch flagged for application on kernels
from 2.6.39 to 4.6.  The upstream hash for the fix to mainline is:

commit 0a475ef4226e305bdcffe12b401ca1eab06c4913
Author: Israel Rukshin <israelr@mellanox.com>
Date:   Wed Jan 4 15:59:37 2017 +0200

    IB/srp: fix invalid indirect_sg_entries parameter value
Max Gurtovoy Jan. 24, 2017, 4:50 p.m. UTC | #4
On 1/24/2017 6:32 PM, Doug Ledford wrote:
> On Wed, 2017-01-04 at 15:09 +0000, Bart Van Assche wrote:
>> On Wed, 2017-01-04 at 15:59 +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 | 6 ++++++
>>>  1 file changed, 6 insertions(+)
>>>
>>> diff --git a/drivers/infiniband/ulp/srp/ib_srp.c
>>> b/drivers/infiniband/ulp/srp/ib_srp.c
>>> index 0f67cf9..79bf484 100644
>>> --- a/drivers/infiniband/ulp/srp/ib_srp.c
>>> +++ b/drivers/infiniband/ulp/srp/ib_srp.c
>>> @@ -3699,6 +3699,12 @@ static int __init srp_init_module(void)
>>>  		indirect_sg_entries = cmd_sg_entries;
>>>  	}
>>>
>>> +	if (indirect_sg_entries > SG_MAX_SEGMENTS) {
>>> +		pr_warn("Clamping indirect_sg_entries to %u\n",
>>> +			SG_MAX_SEGMENTS);
>>> +		indirect_sg_entries = SG_MAX_SEGMENTS;
>>> +	}
>>> +
>>>  	srp_remove_wq = create_workqueue("srp_remove");
>>>  	if (!srp_remove_wq) {
>>>  		ret = -ENOMEM;
>>
>> Thanks!
>>
>> Reviewed-by: Bart Van Assche <bart.vanassche@sandisk.com>
>
> This patch is a fix patch and should have been tagged as such.
>  However, the proper tagging is complicated by the fact that the
> SG_MAX_SEGMENTS was originally named SCSI_MAX_SG_CHAIN_SEGMENTS.  The
> fix applies all the way back to the first patch to enable SG segments
> in the srp driver, but you will need a different patch for the kernels
> prior to the rename.  For this patch, I've added the following tags and
> applied the patch:
>
> Fixes: 65e8617fba17 (scsi: rename SCSI_MAX_{SG, SG_CHAIN}_SEGMENTS)
> Fixes: c07d424d6118 (IB/srp: add support for indirect tables that don't
> fit in SRP_CMD)
> Cc: stable@vger.kernel.org # 4.7+
>
> Someone should write a patch for the earlier kernels and submit it
> directly to stable@ with the patch flagged for application on kernels
> from 2.6.39 to 4.6.  The upstream hash for the fix to mainline is:
>
> commit 0a475ef4226e305bdcffe12b401ca1eab06c4913
> Author: Israel Rukshin <israelr@mellanox.com>
> Date:   Wed Jan 4 15:59:37 2017 +0200
>
>     IB/srp: fix invalid indirect_sg_entries parameter value
>

Israel,
please take it for earlier kernels as well.

Max.
--
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..79bf484 100644
--- a/drivers/infiniband/ulp/srp/ib_srp.c
+++ b/drivers/infiniband/ulp/srp/ib_srp.c
@@ -3699,6 +3699,12 @@  static int __init srp_init_module(void)
 		indirect_sg_entries = cmd_sg_entries;
 	}
 
+	if (indirect_sg_entries > SG_MAX_SEGMENTS) {
+		pr_warn("Clamping indirect_sg_entries to %u\n",
+			SG_MAX_SEGMENTS);
+		indirect_sg_entries = SG_MAX_SEGMENTS;
+	}
+
 	srp_remove_wq = create_workqueue("srp_remove");
 	if (!srp_remove_wq) {
 		ret = -ENOMEM;