2018-07-02 08:04:49

by Matias Bjørling

[permalink] [raw]
Subject: [PATCH] lightnvm: limit get chunk meta request size

For devices that does not specify a limit on its transfer size, the
get_chk_meta command may send down a single I/O retrieving the full
chunk metadata table. Resulting in large 2-4MB I/O requests. Instead,
split up the I/Os to a maximum of 256KB and issue them separately to
reduce memory requirements.

Signed-off-by: Matias Bjørling <[email protected]>
---
drivers/nvme/host/lightnvm.c | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/drivers/nvme/host/lightnvm.c b/drivers/nvme/host/lightnvm.c
index b9989717418d..3b644b0e9713 100644
--- a/drivers/nvme/host/lightnvm.c
+++ b/drivers/nvme/host/lightnvm.c
@@ -583,7 +583,13 @@ static int nvme_nvm_get_chk_meta(struct nvm_dev *ndev,
struct ppa_addr ppa;
size_t left = nchks * sizeof(struct nvme_nvm_chk_meta);
size_t log_pos, offset, len;
- int ret, i;
+ int ret, i, max_len;
+
+ /*
+ * limit requests to maximum 256K to avoid issuing arbitrary large
+ * requests when the device does not specific a maximum transfer size.
+ */
+ max_len = min_t(unsigned int, ctrl->max_hw_sectors << 9, 256 * 1024);

/* Normalize lba address space to obtain log offset */
ppa.ppa = slba;
@@ -596,7 +602,7 @@ static int nvme_nvm_get_chk_meta(struct nvm_dev *ndev,
offset = log_pos * sizeof(struct nvme_nvm_chk_meta);

while (left) {
- len = min_t(unsigned int, left, ctrl->max_hw_sectors << 9);
+ len = min_t(unsigned int, left, max_len);

ret = nvme_get_log_ext(ctrl, ns, NVME_NVM_LOG_REPORT_CHUNK,
dev_meta, len, offset);
--
2.11.0



2018-07-03 19:11:57

by Javier Gonzalez

[permalink] [raw]
Subject: Re: [PATCH] lightnvm: limit get chunk meta request size

> On 2 Jul 2018, at 10.02, Matias Bjørling <[email protected]> wrote:
>
> For devices that does not specify a limit on its transfer size, the
> get_chk_meta command may send down a single I/O retrieving the full
> chunk metadata table. Resulting in large 2-4MB I/O requests. Instead,
> split up the I/Os to a maximum of 256KB and issue them separately to
> reduce memory requirements.
>
> Signed-off-by: Matias Bjørling <[email protected]>
> ---
> drivers/nvme/host/lightnvm.c | 10 ++++++++--
> 1 file changed, 8 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/nvme/host/lightnvm.c b/drivers/nvme/host/lightnvm.c
> index b9989717418d..3b644b0e9713 100644
> --- a/drivers/nvme/host/lightnvm.c
> +++ b/drivers/nvme/host/lightnvm.c
> @@ -583,7 +583,13 @@ static int nvme_nvm_get_chk_meta(struct nvm_dev *ndev,
> struct ppa_addr ppa;
> size_t left = nchks * sizeof(struct nvme_nvm_chk_meta);
> size_t log_pos, offset, len;
> - int ret, i;
> + int ret, i, max_len;
> +
> + /*
> + * limit requests to maximum 256K to avoid issuing arbitrary large
> + * requests when the device does not specific a maximum transfer size.
> + */
> + max_len = min_t(unsigned int, ctrl->max_hw_sectors << 9, 256 * 1024);
>
> /* Normalize lba address space to obtain log offset */
> ppa.ppa = slba;
> @@ -596,7 +602,7 @@ static int nvme_nvm_get_chk_meta(struct nvm_dev *ndev,
> offset = log_pos * sizeof(struct nvme_nvm_chk_meta);
>
> while (left) {
> - len = min_t(unsigned int, left, ctrl->max_hw_sectors << 9);
> + len = min_t(unsigned int, left, max_len);
>
> ret = nvme_get_log_ext(ctrl, ns, NVME_NVM_LOG_REPORT_CHUNK,
> dev_meta, len, offset);
> --
> 2.11.0

Is this a v2? I remember seeing this patch being posted before [1]. It
still looks good to me :)


[1] https://lkml.org/lkml/2018/6/12/466


Reviewed-by: Javier González <[email protected]>


Attachments:
signature.asc (849.00 B)
Message signed with OpenPGP

2018-07-03 19:15:51

by Matias Bjørling

[permalink] [raw]
Subject: Re: [PATCH] lightnvm: limit get chunk meta request size

On 07/03/2018 09:10 PM, Javier Gonzalez wrote:
>> On 2 Jul 2018, at 10.02, Matias Bjørling <[email protected]> wrote:
>>
>> For devices that does not specify a limit on its transfer size, the
>> get_chk_meta command may send down a single I/O retrieving the full
>> chunk metadata table. Resulting in large 2-4MB I/O requests. Instead,
>> split up the I/Os to a maximum of 256KB and issue them separately to
>> reduce memory requirements.
>>
>> Signed-off-by: Matias Bjørling <[email protected]>
>> ---
>> drivers/nvme/host/lightnvm.c | 10 ++++++++--
>> 1 file changed, 8 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/nvme/host/lightnvm.c b/drivers/nvme/host/lightnvm.c
>> index b9989717418d..3b644b0e9713 100644
>> --- a/drivers/nvme/host/lightnvm.c
>> +++ b/drivers/nvme/host/lightnvm.c
>> @@ -583,7 +583,13 @@ static int nvme_nvm_get_chk_meta(struct nvm_dev *ndev,
>> struct ppa_addr ppa;
>> size_t left = nchks * sizeof(struct nvme_nvm_chk_meta);
>> size_t log_pos, offset, len;
>> - int ret, i;
>> + int ret, i, max_len;
>> +
>> + /*
>> + * limit requests to maximum 256K to avoid issuing arbitrary large
>> + * requests when the device does not specific a maximum transfer size.
>> + */
>> + max_len = min_t(unsigned int, ctrl->max_hw_sectors << 9, 256 * 1024);
>>
>> /* Normalize lba address space to obtain log offset */
>> ppa.ppa = slba;
>> @@ -596,7 +602,7 @@ static int nvme_nvm_get_chk_meta(struct nvm_dev *ndev,
>> offset = log_pos * sizeof(struct nvme_nvm_chk_meta);
>>
>> while (left) {
>> - len = min_t(unsigned int, left, ctrl->max_hw_sectors << 9);
>> + len = min_t(unsigned int, left, max_len);
>>
>> ret = nvme_get_log_ext(ctrl, ns, NVME_NVM_LOG_REPORT_CHUNK,
>> dev_meta, len, offset);
>> --
>> 2.11.0
>
> Is this a v2? I remember seeing this patch being posted before [1]. It
> still looks good to me :)
>
>
> [1] https://lkml.org/lkml/2018/6/12/466
>
>
> Reviewed-by: Javier González <[email protected]>
>

I changed the title. Since it didn't touch pblk. Thanks.

2018-07-05 07:17:18

by Javier Gonzalez

[permalink] [raw]
Subject: Re: [PATCH] lightnvm: limit get chunk meta request size

> On 3 Jul 2018, at 21.14, Matias Bjørling <[email protected]> wrote:
>
> On 07/03/2018 09:10 PM, Javier Gonzalez wrote:
>>> On 2 Jul 2018, at 10.02, Matias Bjørling <[email protected]> wrote:
>>>
>>> For devices that does not specify a limit on its transfer size, the
>>> get_chk_meta command may send down a single I/O retrieving the full
>>> chunk metadata table. Resulting in large 2-4MB I/O requests. Instead,
>>> split up the I/Os to a maximum of 256KB and issue them separately to
>>> reduce memory requirements.
>>>
>>> Signed-off-by: Matias Bjørling <[email protected]>
>>> ---
>>> drivers/nvme/host/lightnvm.c | 10 ++++++++--
>>> 1 file changed, 8 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/drivers/nvme/host/lightnvm.c b/drivers/nvme/host/lightnvm.c
>>> index b9989717418d..3b644b0e9713 100644
>>> --- a/drivers/nvme/host/lightnvm.c
>>> +++ b/drivers/nvme/host/lightnvm.c
>>> @@ -583,7 +583,13 @@ static int nvme_nvm_get_chk_meta(struct nvm_dev *ndev,
>>> struct ppa_addr ppa;
>>> size_t left = nchks * sizeof(struct nvme_nvm_chk_meta);
>>> size_t log_pos, offset, len;
>>> - int ret, i;
>>> + int ret, i, max_len;
>>> +
>>> + /*
>>> + * limit requests to maximum 256K to avoid issuing arbitrary large
>>> + * requests when the device does not specific a maximum transfer size.
>>> + */
>>> + max_len = min_t(unsigned int, ctrl->max_hw_sectors << 9, 256 * 1024);
>>>
>>> /* Normalize lba address space to obtain log offset */
>>> ppa.ppa = slba;
>>> @@ -596,7 +602,7 @@ static int nvme_nvm_get_chk_meta(struct nvm_dev *ndev,
>>> offset = log_pos * sizeof(struct nvme_nvm_chk_meta);
>>>
>>> while (left) {
>>> - len = min_t(unsigned int, left, ctrl->max_hw_sectors << 9);
>>> + len = min_t(unsigned int, left, max_len);
>>>
>>> ret = nvme_get_log_ext(ctrl, ns, NVME_NVM_LOG_REPORT_CHUNK,
>>> dev_meta, len, offset);
>>> --
>>> 2.11.0
>> Is this a v2? I remember seeing this patch being posted before [1]. It
>> still looks good to me :)
>> [1] https://lkml.org/lkml/2018/6/12/466
>> Reviewed-by: Javier González <[email protected]>
>
> I changed the title. Since it didn't touch pblk. Thanks.

Makes sense. Thanks!


Attachments:
signature.asc (849.00 B)
Message signed with OpenPGP