From: Cao jin <caoj.fnst@cn.fujitsu.com>
To: Michael Tokarev <mjt@tls.msk.ru>, <qemu-devel@nongnu.org>,
<qemu-trivial@nongnu.org>
Cc: <peter.maydell@linaro.org>, <thuth@redhat.com>,
<eblake@redhat.com>, <armbru@redhat.com>, <mst@redhat.com>
Subject: Re: [Qemu-trivial] [PATCH v3] util/mmap-alloc: check parameter before using
Date: Mon, 31 Oct 2016 11:57:21 +0800 [thread overview]
Message-ID: <5816C121.4060407@cn.fujitsu.com> (raw)
In-Reply-To: <92415a45-66a7-c080-2c3c-8f5f67204bd0@msgid.tls.msk.ru>
On 10/28/2016 10:22 PM, Michael Tokarev wrote:
> 28.10.2016 11:56, Cao jin wrote:
>> Also refactor a little bit for readability
>
> See comments below...
>
>> Signed-off-by: Cao jin <caoj.fnst@cn.fujitsu.com>
>> ---
>> util/mmap-alloc.c | 17 ++++++++---------
>> 1 file changed, 8 insertions(+), 9 deletions(-)
>>
>> diff --git a/util/mmap-alloc.c b/util/mmap-alloc.c
>> index 5a85aa3..2f55f5e 100644
>> --- a/util/mmap-alloc.c
>> +++ b/util/mmap-alloc.c
>> @@ -12,6 +12,7 @@
>>
>> #include "qemu/osdep.h"
>> #include "qemu/mmap-alloc.h"
>> +#include "qemu/host-utils.h"
>>
>> #define HUGETLBFS_MAGIC 0x958458f6
>>
>> @@ -61,18 +62,18 @@ void *qemu_ram_mmap(int fd, size_t size, size_t align, bool shared)
>> #else
>> void *ptr = mmap(0, total, PROT_NONE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
>> #endif
>> - size_t offset = QEMU_ALIGN_UP((uintptr_t)ptr, align) - (uintptr_t)ptr;
>> + size_t offset;
>> void *ptr1;
>>
>> if (ptr == MAP_FAILED) {
>> return MAP_FAILED;
>> }
>>
>> - /* Make sure align is a power of 2 */
>> - assert(!(align & (align - 1)));
>> + assert(is_power_of_2(align));
>> /* Always align to host page size */
>> assert(align >= getpagesize());
>>
>> + offset = QEMU_ALIGN_UP((uintptr_t)ptr, align) - (uintptr_t)ptr;
>> ptr1 = mmap(ptr + offset, size, PROT_READ | PROT_WRITE,
>> MAP_FIXED |
>> (fd == -1 ? MAP_ANONYMOUS : 0) |
>> @@ -83,22 +84,20 @@ void *qemu_ram_mmap(int fd, size_t size, size_t align, bool shared)
>> return MAP_FAILED;
>> }
>>
>> - ptr += offset;
>> - total -= offset;
>> -
>> if (offset > 0) {
>> - munmap(ptr - offset, offset);
>> + munmap(ptr, offset);
>> }
>>
>> /*
>> * Leave a single PROT_NONE page allocated after the RAM block, to serve as
>> * a guard page guarding against potential buffer overflows.
>> */
>> + total -= offset;
>> if (total > size + getpagesize()) {
>> - munmap(ptr + size + getpagesize(), total - size - getpagesize());
>> + munmap(ptr1 + size + getpagesize(), total - size - getpagesize());
>> }
>>
>> - return ptr;
>> + return ptr1;
>
> Why did you change ptr to ptr1 here and above?
Because, I think there always is: ptr + offset == ptr1
>
> On linux, mmap(2) manpage says that address serves as hint, and the
> system create the mapping at a nearby page boundary. Generally, this
> address is just a hint. So I'm not really sure if this code is actually
> right.. :)
>
Yes, but the 2nd mmap used MAP_FIXED, which the manpage says:
/Don't interpret addr as a hint: place the mapping at exactly that/
/address. addr must be a multiple of the page size/
/If the specified address cannot be used, mmap() will fail/
> At the very least, your commit comment is a bit misleading, as it says
> about readability, but it also MAY change semantics.
>
I don't think so, one just need dig a little deeper:)
> Maybe just move BOTH "ptr+=, total-=" parts down the line and keep
> using ptr instead of ptr1?
>
> It'd be very good, in my opinion, to document how this whole thing
> is supposed to work :)
>
the change is just some simple arithmetic operation, I think it is
little difficult for me to find a decent description.
Hope this could also got other maintainer's help, review, or ack
> Thanks,
>
> /mjt
>
>
> .
>
--
Yours Sincerely,
Cao jin
WARNING: multiple messages have this Message-ID (diff)
From: Cao jin <caoj.fnst@cn.fujitsu.com>
To: Michael Tokarev <mjt@tls.msk.ru>,
qemu-devel@nongnu.org, qemu-trivial@nongnu.org
Cc: peter.maydell@linaro.org, thuth@redhat.com, eblake@redhat.com,
armbru@redhat.com, mst@redhat.com
Subject: Re: [Qemu-devel] [PATCH v3] util/mmap-alloc: check parameter before using
Date: Mon, 31 Oct 2016 11:57:21 +0800 [thread overview]
Message-ID: <5816C121.4060407@cn.fujitsu.com> (raw)
In-Reply-To: <92415a45-66a7-c080-2c3c-8f5f67204bd0@msgid.tls.msk.ru>
On 10/28/2016 10:22 PM, Michael Tokarev wrote:
> 28.10.2016 11:56, Cao jin wrote:
>> Also refactor a little bit for readability
>
> See comments below...
>
>> Signed-off-by: Cao jin <caoj.fnst@cn.fujitsu.com>
>> ---
>> util/mmap-alloc.c | 17 ++++++++---------
>> 1 file changed, 8 insertions(+), 9 deletions(-)
>>
>> diff --git a/util/mmap-alloc.c b/util/mmap-alloc.c
>> index 5a85aa3..2f55f5e 100644
>> --- a/util/mmap-alloc.c
>> +++ b/util/mmap-alloc.c
>> @@ -12,6 +12,7 @@
>>
>> #include "qemu/osdep.h"
>> #include "qemu/mmap-alloc.h"
>> +#include "qemu/host-utils.h"
>>
>> #define HUGETLBFS_MAGIC 0x958458f6
>>
>> @@ -61,18 +62,18 @@ void *qemu_ram_mmap(int fd, size_t size, size_t align, bool shared)
>> #else
>> void *ptr = mmap(0, total, PROT_NONE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
>> #endif
>> - size_t offset = QEMU_ALIGN_UP((uintptr_t)ptr, align) - (uintptr_t)ptr;
>> + size_t offset;
>> void *ptr1;
>>
>> if (ptr == MAP_FAILED) {
>> return MAP_FAILED;
>> }
>>
>> - /* Make sure align is a power of 2 */
>> - assert(!(align & (align - 1)));
>> + assert(is_power_of_2(align));
>> /* Always align to host page size */
>> assert(align >= getpagesize());
>>
>> + offset = QEMU_ALIGN_UP((uintptr_t)ptr, align) - (uintptr_t)ptr;
>> ptr1 = mmap(ptr + offset, size, PROT_READ | PROT_WRITE,
>> MAP_FIXED |
>> (fd == -1 ? MAP_ANONYMOUS : 0) |
>> @@ -83,22 +84,20 @@ void *qemu_ram_mmap(int fd, size_t size, size_t align, bool shared)
>> return MAP_FAILED;
>> }
>>
>> - ptr += offset;
>> - total -= offset;
>> -
>> if (offset > 0) {
>> - munmap(ptr - offset, offset);
>> + munmap(ptr, offset);
>> }
>>
>> /*
>> * Leave a single PROT_NONE page allocated after the RAM block, to serve as
>> * a guard page guarding against potential buffer overflows.
>> */
>> + total -= offset;
>> if (total > size + getpagesize()) {
>> - munmap(ptr + size + getpagesize(), total - size - getpagesize());
>> + munmap(ptr1 + size + getpagesize(), total - size - getpagesize());
>> }
>>
>> - return ptr;
>> + return ptr1;
>
> Why did you change ptr to ptr1 here and above?
Because, I think there always is: ptr + offset == ptr1
>
> On linux, mmap(2) manpage says that address serves as hint, and the
> system create the mapping at a nearby page boundary. Generally, this
> address is just a hint. So I'm not really sure if this code is actually
> right.. :)
>
Yes, but the 2nd mmap used MAP_FIXED, which the manpage says:
/Don't interpret addr as a hint: place the mapping at exactly that/
/address. addr must be a multiple of the page size/
/If the specified address cannot be used, mmap() will fail/
> At the very least, your commit comment is a bit misleading, as it says
> about readability, but it also MAY change semantics.
>
I don't think so, one just need dig a little deeper:)
> Maybe just move BOTH "ptr+=, total-=" parts down the line and keep
> using ptr instead of ptr1?
>
> It'd be very good, in my opinion, to document how this whole thing
> is supposed to work :)
>
the change is just some simple arithmetic operation, I think it is
little difficult for me to find a decent description.
Hope this could also got other maintainer's help, review, or ack
> Thanks,
>
> /mjt
>
>
> .
>
--
Yours Sincerely,
Cao jin
next prev parent reply other threads:[~2016-10-31 3:55 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-10-28 8:56 [Qemu-trivial] [PATCH v3] util/mmap-alloc: check parameter before using Cao jin
2016-10-28 8:56 ` [Qemu-devel] " Cao jin
2016-10-28 14:22 ` [Qemu-trivial] " Michael Tokarev
2016-10-28 14:22 ` [Qemu-devel] " Michael Tokarev
2016-10-31 3:57 ` Cao jin [this message]
2016-10-31 3:57 ` Cao jin
2016-10-31 7:32 ` [Qemu-trivial] " Thomas Huth
2016-10-31 7:32 ` [Qemu-devel] " Thomas Huth
2016-10-31 11:17 ` [Qemu-trivial] " Cao jin
2016-10-31 11:17 ` [Qemu-devel] " Cao jin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5816C121.4060407@cn.fujitsu.com \
--to=caoj.fnst@cn.fujitsu.com \
--cc=armbru@redhat.com \
--cc=eblake@redhat.com \
--cc=mjt@tls.msk.ru \
--cc=mst@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=qemu-trivial@nongnu.org \
--cc=thuth@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.