[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-trivial] [PATCH v3] util/mmap-alloc: check parameter before us

From: Cao jin
Subject: Re: [Qemu-trivial] [PATCH v3] util/mmap-alloc: check parameter before using
Date: Mon, 31 Oct 2016 11:57:21 +0800
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.1.0

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 <address@hidden>
  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 
      void *ptr = mmap(0, total, PROT_NONE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
-    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 
          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 
       * 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




Yours Sincerely,

Cao jin

reply via email to

[Prev in Thread] Current Thread [Next in Thread]