qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH] block: limited request size in write zeroes unsupported path
@ 2015-01-05 11:29 Peter Lieven
  2015-01-05 11:51 ` Denis V. Lunev
                   ` (2 more replies)
  0 siblings, 3 replies; 8+ messages in thread
From: Peter Lieven @ 2015-01-05 11:29 UTC (permalink / raw)
  To: qemu-devel; +Cc: kwolf, famz, Peter Lieven, mreitz, stefanha, den

If bs->bl.max_write_zeroes is large and we end up in the unsupported
path we might allocate a lot of memory for the iovector and/or even
generate an oversized requests.

Fix this by limiting the request by the minimum of the reported
maximum transfer size or 16MB (32768 sectors).

Reported-by: Denis V. Lunev <den@openvz.org>
Signed-off-by: Peter Lieven <pl@kamp.de>
---
 block.c |    5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/block.c b/block.c
index a612594..8009478 100644
--- a/block.c
+++ b/block.c
@@ -3203,6 +3203,9 @@ static int coroutine_fn bdrv_co_do_write_zeroes(BlockDriverState *bs,
 
         if (ret == -ENOTSUP) {
             /* Fall back to bounce buffer if write zeroes is unsupported */
+            int max_xfer_len = MIN_NON_ZERO(bs->bl.max_transfer_length,
+                                            MAX_WRITE_ZEROES_DEFAULT);
+            num = MIN(num, max_xfer_len);
             iov.iov_len = num * BDRV_SECTOR_SIZE;
             if (iov.iov_base == NULL) {
                 iov.iov_base = qemu_try_blockalign(bs, num * BDRV_SECTOR_SIZE);
@@ -3219,7 +3222,7 @@ static int coroutine_fn bdrv_co_do_write_zeroes(BlockDriverState *bs,
             /* Keep bounce buffer around if it is big enough for all
              * all future requests.
              */
-            if (num < max_write_zeroes) {
+            if (num < max_xfer_len) {
                 qemu_vfree(iov.iov_base);
                 iov.iov_base = NULL;
             }
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [Qemu-devel] [PATCH] block: limited request size in write zeroes unsupported path
  2015-01-05 11:29 [Qemu-devel] [PATCH] block: limited request size in write zeroes unsupported path Peter Lieven
@ 2015-01-05 11:51 ` Denis V. Lunev
  2015-01-05 12:14   ` Peter Lieven
  2015-01-05 12:34 ` Denis V. Lunev
  2015-01-06 15:42 ` Stefan Hajnoczi
  2 siblings, 1 reply; 8+ messages in thread
From: Denis V. Lunev @ 2015-01-05 11:51 UTC (permalink / raw)
  To: Peter Lieven, qemu-devel; +Cc: kwolf, den, famz, stefanha, mreitz

On 05/01/15 14:29, Peter Lieven wrote:
> If bs->bl.max_write_zeroes is large and we end up in the unsupported
> path we might allocate a lot of memory for the iovector and/or even
> generate an oversized requests.
>
> Fix this by limiting the request by the minimum of the reported
> maximum transfer size or 16MB (32768 sectors).
>
> Reported-by: Denis V. Lunev <den@openvz.org>
> Signed-off-by: Peter Lieven <pl@kamp.de>
> ---
>   block.c |    5 ++++-
>   1 file changed, 4 insertions(+), 1 deletion(-)
>
> diff --git a/block.c b/block.c
> index a612594..8009478 100644
> --- a/block.c
> +++ b/block.c
> @@ -3203,6 +3203,9 @@ static int coroutine_fn bdrv_co_do_write_zeroes(BlockDriverState *bs,
>
>           if (ret == -ENOTSUP) {
>               /* Fall back to bounce buffer if write zeroes is unsupported */
> +            int max_xfer_len = MIN_NON_ZERO(bs->bl.max_transfer_length,
> +                                            MAX_WRITE_ZEROES_DEFAULT);
> +            num = MIN(num, max_xfer_len);
>               iov.iov_len = num * BDRV_SECTOR_SIZE;
>               if (iov.iov_base == NULL) {
>                   iov.iov_base = qemu_try_blockalign(bs, num * BDRV_SECTOR_SIZE);
> @@ -3219,7 +3222,7 @@ static int coroutine_fn bdrv_co_do_write_zeroes(BlockDriverState *bs,
>               /* Keep bounce buffer around if it is big enough for all
>                * all future requests.
>                */
> -            if (num < max_write_zeroes) {
> +            if (num < max_xfer_len) {
>                   qemu_vfree(iov.iov_base);
>                   iov.iov_base = NULL;
>               }
>
this is not going to work IMHO. num is the number in sectors.
max_xfer_len is in bytes.

I will send my updated version using your approach in a
couple of minutes. Would like to test it a bit.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Qemu-devel] [PATCH] block: limited request size in write zeroes unsupported path
  2015-01-05 11:51 ` Denis V. Lunev
@ 2015-01-05 12:14   ` Peter Lieven
  2015-01-05 12:28     ` Denis V. Lunev
  0 siblings, 1 reply; 8+ messages in thread
From: Peter Lieven @ 2015-01-05 12:14 UTC (permalink / raw)
  To: Denis V. Lunev, qemu-devel; +Cc: kwolf, den, famz, stefanha, mreitz

On 05.01.2015 12:51, Denis V. Lunev wrote:
> On 05/01/15 14:29, Peter Lieven wrote:
>> If bs->bl.max_write_zeroes is large and we end up in the unsupported
>> path we might allocate a lot of memory for the iovector and/or even
>> generate an oversized requests.
>>
>> Fix this by limiting the request by the minimum of the reported
>> maximum transfer size or 16MB (32768 sectors).
>>
>> Reported-by: Denis V. Lunev <den@openvz.org>
>> Signed-off-by: Peter Lieven <pl@kamp.de>
>> ---
>>   block.c |    5 ++++-
>>   1 file changed, 4 insertions(+), 1 deletion(-)
>>
>> diff --git a/block.c b/block.c
>> index a612594..8009478 100644
>> --- a/block.c
>> +++ b/block.c
>> @@ -3203,6 +3203,9 @@ static int coroutine_fn bdrv_co_do_write_zeroes(BlockDriverState *bs,
>>
>>           if (ret == -ENOTSUP) {
>>               /* Fall back to bounce buffer if write zeroes is unsupported */
>> +            int max_xfer_len = MIN_NON_ZERO(bs->bl.max_transfer_length,
>> + MAX_WRITE_ZEROES_DEFAULT);
>> +            num = MIN(num, max_xfer_len);
>>               iov.iov_len = num * BDRV_SECTOR_SIZE;
>>               if (iov.iov_base == NULL) {
>>                   iov.iov_base = qemu_try_blockalign(bs, num * BDRV_SECTOR_SIZE);
>> @@ -3219,7 +3222,7 @@ static int coroutine_fn bdrv_co_do_write_zeroes(BlockDriverState *bs,
>>               /* Keep bounce buffer around if it is big enough for all
>>                * all future requests.
>>                */
>> -            if (num < max_write_zeroes) {
>> +            if (num < max_xfer_len) {
>>                   qemu_vfree(iov.iov_base);
>>                   iov.iov_base = NULL;
>>               }
>>
> this is not going to work IMHO. num is the number in sectors.
> max_xfer_len is in bytes.

bs->bl.max_transfer_length is in sectors.

Peter

>
> I will send my updated version using your approach in a
> couple of minutes. Would like to test it a bit.


-- 

Mit freundlichen Grüßen

Peter Lieven

...........................................................

   KAMP Netzwerkdienste GmbH
   Vestische Str. 89-91 | 46117 Oberhausen
   Tel: +49 (0) 208.89 402-50 | Fax: +49 (0) 208.89 402-40
   pl@kamp.de | http://www.kamp.de

   Geschäftsführer: Heiner Lante | Michael Lante
   Amtsgericht Duisburg | HRB Nr. 12154
   USt-Id-Nr.: DE 120607556

...........................................................

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Qemu-devel] [PATCH] block: limited request size in write zeroes unsupported path
  2015-01-05 12:14   ` Peter Lieven
@ 2015-01-05 12:28     ` Denis V. Lunev
  0 siblings, 0 replies; 8+ messages in thread
From: Denis V. Lunev @ 2015-01-05 12:28 UTC (permalink / raw)
  To: Peter Lieven, Denis V. Lunev, qemu-devel; +Cc: kwolf, famz, stefanha, mreitz

On 05/01/15 15:14, Peter Lieven wrote:
> On 05.01.2015 12:51, Denis V. Lunev wrote:
>> On 05/01/15 14:29, Peter Lieven wrote:
>>> If bs->bl.max_write_zeroes is large and we end up in the unsupported
>>> path we might allocate a lot of memory for the iovector and/or even
>>> generate an oversized requests.
>>>
>>> Fix this by limiting the request by the minimum of the reported
>>> maximum transfer size or 16MB (32768 sectors).
>>>
>>> Reported-by: Denis V. Lunev <den@openvz.org>
>>> Signed-off-by: Peter Lieven <pl@kamp.de>
>>> ---
>>>   block.c |    5 ++++-
>>>   1 file changed, 4 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/block.c b/block.c
>>> index a612594..8009478 100644
>>> --- a/block.c
>>> +++ b/block.c
>>> @@ -3203,6 +3203,9 @@ static int coroutine_fn 
>>> bdrv_co_do_write_zeroes(BlockDriverState *bs,
>>>
>>>           if (ret == -ENOTSUP) {
>>>               /* Fall back to bounce buffer if write zeroes is 
>>> unsupported */
>>> +            int max_xfer_len = 
>>> MIN_NON_ZERO(bs->bl.max_transfer_length,
>>> + MAX_WRITE_ZEROES_DEFAULT);
>>> +            num = MIN(num, max_xfer_len);
>>>               iov.iov_len = num * BDRV_SECTOR_SIZE;
>>>               if (iov.iov_base == NULL) {
>>>                   iov.iov_base = qemu_try_blockalign(bs, num * 
>>> BDRV_SECTOR_SIZE);
>>> @@ -3219,7 +3222,7 @@ static int coroutine_fn 
>>> bdrv_co_do_write_zeroes(BlockDriverState *bs,
>>>               /* Keep bounce buffer around if it is big enough for all
>>>                * all future requests.
>>>                */
>>> -            if (num < max_write_zeroes) {
>>> +            if (num < max_xfer_len) {
>>>                   qemu_vfree(iov.iov_base);
>>>                   iov.iov_base = NULL;
>>>               }
>>>
>> this is not going to work IMHO. num is the number in sectors.
>> max_xfer_len is in bytes.
>
> bs->bl.max_transfer_length is in sectors.
>
> Peter
>

oops. you are right...

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Qemu-devel] [PATCH] block: limited request size in write zeroes unsupported path
  2015-01-05 11:29 [Qemu-devel] [PATCH] block: limited request size in write zeroes unsupported path Peter Lieven
  2015-01-05 11:51 ` Denis V. Lunev
@ 2015-01-05 12:34 ` Denis V. Lunev
  2015-01-06 15:43   ` Stefan Hajnoczi
  2015-01-06 15:42 ` Stefan Hajnoczi
  2 siblings, 1 reply; 8+ messages in thread
From: Denis V. Lunev @ 2015-01-05 12:34 UTC (permalink / raw)
  To: Peter Lieven, qemu-devel; +Cc: kwolf, den, famz, stefanha, mreitz

On 05/01/15 14:29, Peter Lieven wrote:
> If bs->bl.max_write_zeroes is large and we end up in the unsupported
> path we might allocate a lot of memory for the iovector and/or even
> generate an oversized requests.
>
> Fix this by limiting the request by the minimum of the reported
> maximum transfer size or 16MB (32768 sectors).
>
> Reported-by: Denis V. Lunev <den@openvz.org>
> Signed-off-by: Peter Lieven <pl@kamp.de>
> ---
>   block.c |    5 ++++-
>   1 file changed, 4 insertions(+), 1 deletion(-)
>
> diff --git a/block.c b/block.c
> index a612594..8009478 100644
> --- a/block.c
> +++ b/block.c
> @@ -3203,6 +3203,9 @@ static int coroutine_fn bdrv_co_do_write_zeroes(BlockDriverState *bs,
>
>           if (ret == -ENOTSUP) {
>               /* Fall back to bounce buffer if write zeroes is unsupported */
> +            int max_xfer_len = MIN_NON_ZERO(bs->bl.max_transfer_length,
> +                                            MAX_WRITE_ZEROES_DEFAULT);
> +            num = MIN(num, max_xfer_len);
>               iov.iov_len = num * BDRV_SECTOR_SIZE;
>               if (iov.iov_base == NULL) {
>                   iov.iov_base = qemu_try_blockalign(bs, num * BDRV_SECTOR_SIZE);
> @@ -3219,7 +3222,7 @@ static int coroutine_fn bdrv_co_do_write_zeroes(BlockDriverState *bs,
>               /* Keep bounce buffer around if it is big enough for all
>                * all future requests.
>                */
> -            if (num < max_write_zeroes) {
> +            if (num < max_xfer_len) {
>                   qemu_vfree(iov.iov_base);
>                   iov.iov_base = NULL;
>               }
>
Reviewed-by: Denis V. Lunev <den@openvz.org>

Though pls consider my patch v3, it avoids allocation of 16 Mb here and
uses only 1 Mb of memory.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Qemu-devel] [PATCH] block: limited request size in write zeroes unsupported path
  2015-01-05 11:29 [Qemu-devel] [PATCH] block: limited request size in write zeroes unsupported path Peter Lieven
  2015-01-05 11:51 ` Denis V. Lunev
  2015-01-05 12:34 ` Denis V. Lunev
@ 2015-01-06 15:42 ` Stefan Hajnoczi
  2 siblings, 0 replies; 8+ messages in thread
From: Stefan Hajnoczi @ 2015-01-06 15:42 UTC (permalink / raw)
  To: Peter Lieven; +Cc: kwolf, famz, qemu-devel, mreitz, stefanha, den

[-- Attachment #1: Type: text/plain, Size: 636 bytes --]

On Mon, Jan 05, 2015 at 12:29:49PM +0100, Peter Lieven wrote:
> If bs->bl.max_write_zeroes is large and we end up in the unsupported
> path we might allocate a lot of memory for the iovector and/or even
> generate an oversized requests.
> 
> Fix this by limiting the request by the minimum of the reported
> maximum transfer size or 16MB (32768 sectors).
> 
> Reported-by: Denis V. Lunev <den@openvz.org>
> Signed-off-by: Peter Lieven <pl@kamp.de>
> ---
>  block.c |    5 ++++-
>  1 file changed, 4 insertions(+), 1 deletion(-)

Thanks, applied to my block tree:
https://github.com/stefanha/qemu/commits/block

Stefan

[-- Attachment #2: Type: application/pgp-signature, Size: 473 bytes --]

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Qemu-devel] [PATCH] block: limited request size in write zeroes unsupported path
  2015-01-05 12:34 ` Denis V. Lunev
@ 2015-01-06 15:43   ` Stefan Hajnoczi
  2015-01-06 17:56     ` Denis V. Lunev
  0 siblings, 1 reply; 8+ messages in thread
From: Stefan Hajnoczi @ 2015-01-06 15:43 UTC (permalink / raw)
  To: Denis V. Lunev
  Cc: kwolf, famz, Peter Lieven, qemu-devel, mreitz, stefanha, den

[-- Attachment #1: Type: text/plain, Size: 399 bytes --]

On Mon, Jan 05, 2015 at 03:34:07PM +0300, Denis V. Lunev wrote:
> Though pls consider my patch v3, it avoids allocation of 16 Mb here and
> uses only 1 Mb of memory.

Once your patch has Reviewed-by: it will show up on my radar for merge.

If you and Peter need a 2nd opinion in your discussions about the
fallocate series, I can look at the series in more detail myself.  Just
let me know.

Stefan

[-- Attachment #2: Type: application/pgp-signature, Size: 473 bytes --]

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Qemu-devel] [PATCH] block: limited request size in write zeroes unsupported path
  2015-01-06 15:43   ` Stefan Hajnoczi
@ 2015-01-06 17:56     ` Denis V. Lunev
  0 siblings, 0 replies; 8+ messages in thread
From: Denis V. Lunev @ 2015-01-06 17:56 UTC (permalink / raw)
  To: Stefan Hajnoczi
  Cc: kwolf, famz, Peter Lieven, qemu-devel, mreitz, stefanha, den

On 06/01/15 18:43, Stefan Hajnoczi wrote:
> On Mon, Jan 05, 2015 at 03:34:07PM +0300, Denis V. Lunev wrote:
>> Though pls consider my patch v3, it avoids allocation of 16 Mb here and
>> uses only 1 Mb of memory.
>
> Once your patch has Reviewed-by: it will show up on my radar for merge.
>
> If you and Peter need a 2nd opinion in your discussions about the
> fallocate series, I can look at the series in more detail myself.  Just
> let me know.
>
> Stefan
>


Fallocate stuff has been reviewed by Fam and I have enough
feedback at the moment to start rework. He wants some
simplifications at the moment. This is not a big deal.

This patch is technically correct and solves the problem
I have spotted. Thus it could be merged. I'll drop patch 1
in my series for the sake of this one to avoid unnecessary
discussion with it.

On the other hand I believe that my patch is a little bit
better, it allocates only 1 MB instead of 16 here. Though
I could rebase it and send it separately on top of this
to discuss it independently.

By the way, Stefan, do you see Acked-by: tag in your radar
or it should be avoided? We are using it as review signature
thanks to my prior Linux kernel experience.

Regards,
	Den

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2015-01-06 17:57 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-01-05 11:29 [Qemu-devel] [PATCH] block: limited request size in write zeroes unsupported path Peter Lieven
2015-01-05 11:51 ` Denis V. Lunev
2015-01-05 12:14   ` Peter Lieven
2015-01-05 12:28     ` Denis V. Lunev
2015-01-05 12:34 ` Denis V. Lunev
2015-01-06 15:43   ` Stefan Hajnoczi
2015-01-06 17:56     ` Denis V. Lunev
2015-01-06 15:42 ` Stefan Hajnoczi

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).