qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: Markus Armbruster <armbru@redhat.com>, qemu-devel@nongnu.org
Cc: claudio.fontana@huawei.com, cam@cs.ualberta.ca,
	mlureau@redhat.com, david.marchand@6wind.com
Subject: Re: [Qemu-devel] [PATCH v2 02/42] exec: Fix memory allocation when memory path isn't on hugetlbfs
Date: Tue, 8 Mar 2016 15:17:29 +0100	[thread overview]
Message-ID: <56DEDEF9.6030506@redhat.com> (raw)
In-Reply-To: <1457378754-21649-3-git-send-email-armbru@redhat.com>



On 07/03/2016 20:25, Markus Armbruster wrote:
> gethugepagesize() works reliably only when its argument is on
> hugetlbfs.  When it's not, it returns the filesystem's "optimal
> transfer block size", which may or may not be the actual page size
> you'll get when you mmap().
> 
> If the value is too small or not a power of two, we fail
> qemu_ram_mmap()'s assertions.  These were added in commit 794e8f3
> (v2.5.0).  The bug's impact before that is currently unknown.  Seems
> fairly unlikely at least when the normal page size is 4KiB.
> 
> Else, if the value is too large, we align more strictly than
> necessary.
> 
> gethugepagesize() goes back to commit c902760 (v0.13).  That commit
> clearly intended gethugepagesize() to be used on hugetlbfs only.  Not
> only was it named accordingly, it also printed a warning when used on
> anything else.  However, the commit neglected to spell out the
> restriction in user documentation of -mem-path.
> 
> Commit bfc2a1a (v2.5.0) dropped the warning as bogus "because QEMU
> functions perfectly well with the path on a regular tmpfs filesystem".
> It sure does when you're sufficiently lucky.  In my testing, I was
> lucky, too.
> 
> Fix by switching to qemu_fd_getpagesize().  Rename the variable
> holding its result from hpagesize to page_size.
> 
> Cc: Paolo Bonzini <pbonzini@redhat.com>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>  exec.c | 40 +++++++---------------------------------
>  1 file changed, 7 insertions(+), 33 deletions(-)
> 
> diff --git a/exec.c b/exec.c
> index 5275ff4..d41194e 100644
> --- a/exec.c
> +++ b/exec.c
> @@ -1207,27 +1207,6 @@ void qemu_mutex_unlock_ramlist(void)
>  }
>  
>  #ifdef __linux__
> -
> -#include <sys/vfs.h>
> -
> -#define HUGETLBFS_MAGIC       0x958458f6
> -
> -static long gethugepagesize(int fd)
> -{
> -    struct statfs fs;
> -    int ret;
> -
> -    do {
> -        ret = fstatfs(fd, &fs);
> -    } while (ret != 0 && errno == EINTR);
> -
> -    if (ret != 0) {
> -        return -1;
> -    }
> -
> -    return fs.f_bsize;
> -}
> -
>  static void *file_ram_alloc(RAMBlock *block,
>                              ram_addr_t memory,
>                              const char *path,
> @@ -1239,7 +1218,7 @@ static void *file_ram_alloc(RAMBlock *block,
>      char *c;
>      void *area;
>      int fd;
> -    int64_t hpagesize;
> +    int64_t page_size;
>  
>      if (kvm_enabled() && !kvm_has_sync_mmu()) {
>          error_setg(errp,
> @@ -1294,22 +1273,17 @@ static void *file_ram_alloc(RAMBlock *block,
>           */
>      }
>  
> -    hpagesize = gethugepagesize(fd);
> -    if (hpagesize < 0) {
> -        error_setg_errno(errp, errno, "can't get page size for %s",
> -                         path);
> -        goto error;
> -    }
> -    block->mr->align = hpagesize;
> +    page_size = qemu_fd_getpagesize(fd);
> +    block->mr->align = page_size;
>  
> -    if (memory < hpagesize) {
> +    if (memory < page_size) {
>          error_setg(errp, "memory size 0x" RAM_ADDR_FMT " must be equal to "
>                     "or larger than page size 0x%" PRIx64,
> -                   memory, hpagesize);
> +                   memory, page_size);
>          goto error;
>      }
>  
> -    memory = ROUND_UP(memory, hpagesize);
> +    memory = ROUND_UP(memory, page_size);
>  
>      /*
>       * ftruncate is not supported by hugetlbfs in older
> @@ -1321,7 +1295,7 @@ static void *file_ram_alloc(RAMBlock *block,
>          perror("ftruncate");
>      }
>  
> -    area = qemu_ram_mmap(fd, memory, hpagesize, block->flags & RAM_SHARED);
> +    area = qemu_ram_mmap(fd, memory, page_size, block->flags & RAM_SHARED);
>      if (area == MAP_FAILED) {
>          error_setg_errno(errp, errno,
>                           "unable to map backing store for guest RAM");
> 

Queued, thanks.

Paolo

  reply	other threads:[~2016-03-08 14:17 UTC|newest]

Thread overview: 74+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-03-07 19:25 [Qemu-devel] [PATCH v2 00/42] ivshmem: Fixes, cleanups, device model split Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 01/42] exec: Fix memory allocation when memory path names new file Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 02/42] exec: Fix memory allocation when memory path isn't on hugetlbfs Markus Armbruster
2016-03-08 14:17   ` Paolo Bonzini [this message]
2016-03-15 16:41     ` Markus Armbruster
2016-03-15 16:56       ` Paolo Bonzini
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 03/42] target-ppc: Document TOCTTOU in hugepage support Markus Armbruster
2016-03-09 12:44   ` Marc-André Lureau
2016-03-09 20:05     ` Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 04/42] ivshmem-server: Fix and clean up command line help Markus Armbruster
2016-03-09 12:44   ` Marc-André Lureau
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 05/42] ivshmem-server: Don't overload POSIX shmem and file name Markus Armbruster
2016-03-09 12:44   ` Marc-André Lureau
2016-03-09 20:14     ` Markus Armbruster
2016-03-10  0:44       ` Marc-André Lureau
2016-03-10  6:57         ` Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 06/42] qemu-doc: Fix ivshmem huge page example Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 07/42] event_notifier: Make event_notifier_init_fd() #ifdef CONFIG_EVENTFD Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 08/42] tests/libqos/pci-pc: Fix qpci_pc_iomap() to map BARs aligned Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 09/42] ivshmem-test: Improve test case /ivshmem/single Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 10/42] ivshmem-test: Clean up wait for devices to become operational Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 11/42] ivshmem-test: Improve test cases /ivshmem/server-* Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 12/42] ivshmem: Rewrite specification document Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 13/42] ivshmem: Add missing newlines to debug printfs Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 14/42] ivshmem: Compile debug prints unconditionally to prevent bit-rot Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 15/42] ivshmem: Clean up after commit 9940c32 Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 16/42] ivshmem: Drop ivshmem_event() stub Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 17/42] ivshmem: Don't destroy the chardev on version mismatch Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 18/42] ivshmem: Fix harmless misuse of Error Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 19/42] ivshmem: Failed realize() can leave migration blocker behind Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 20/42] ivshmem: Clean up register callbacks Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 21/42] ivshmem: Clean up MSI-X conditions Markus Armbruster
2016-03-09 12:45   ` Marc-André Lureau
2016-03-09 20:15     ` Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 22/42] ivshmem: Leave INTx alone when using MSI-X Markus Armbruster
2016-03-09 12:45   ` Marc-André Lureau
2016-03-09 20:16     ` Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 23/42] ivshmem: Assert interrupts are set up once Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 24/42] ivshmem: Simplify rejection of invalid peer ID from server Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 25/42] ivshmem: Disentangle ivshmem_read() Markus Armbruster
2016-03-09 12:45   ` Marc-André Lureau
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 26/42] ivshmem: Plug leaks on unplug, fix peer disconnect Markus Armbruster
2016-03-09 12:45   ` Marc-André Lureau
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 27/42] ivshmem: Receive shared memory synchronously in realize() Markus Armbruster
2016-03-09 12:45   ` Marc-André Lureau
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 28/42] ivshmem: Propagate errors through ivshmem_recv_setup() Markus Armbruster
2016-03-09 12:46   ` Marc-André Lureau
2016-03-09 20:25     ` Markus Armbruster
2016-03-10  0:44       ` Marc-André Lureau
2016-03-10  6:38         ` Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 29/42] ivshmem: Rely on server sending the ID right after the version Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 30/42] ivshmem: Drop the hackish test for UNIX domain chardev Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 31/42] ivshmem: Simplify how we cope with short reads from server Markus Armbruster
2016-03-09 12:46   ` Marc-André Lureau
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 32/42] ivshmem: Tighten check of property "size" Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 33/42] ivshmem: Implement shm=... with a memory backend Markus Armbruster
2016-03-09 11:31   ` Marc-André Lureau
2016-03-09 20:59     ` Markus Armbruster
2016-03-10  0:44       ` Marc-André Lureau
2016-03-10  6:48         ` Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 34/42] ivshmem: Simplify memory regions for BAR 2 (shared memory) Markus Armbruster
2016-03-09 12:46   ` Marc-André Lureau
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 35/42] ivshmem: Inline check_shm_size() into its only caller Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 36/42] qdev: New DEFINE_PROP_ON_OFF_AUTO Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 37/42] ivshmem: Replace int role_val by OnOffAuto master Markus Armbruster
2016-03-09 12:46   ` Marc-André Lureau
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 38/42] ivshmem: Split ivshmem-plain, ivshmem-doorbell off ivshmem Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 39/42] ivshmem: Clean up after the previous commit Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 40/42] ivshmem: Drop ivshmem property x-memdev Markus Armbruster
2016-03-09 12:47   ` Marc-André Lureau
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 41/42] ivshmem: Require master to have ID zero Markus Armbruster
2016-03-07 19:25 ` [Qemu-devel] [PATCH v2 42/42] contrib/ivshmem-server: Print "not for production" warning Markus Armbruster
2016-03-08 14:05 ` [Qemu-devel] [PATCH v2 00/42] ivshmem: Fixes, cleanups, device model split Paolo Bonzini
2016-03-08 14:22 ` Paolo Bonzini

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=56DEDEF9.6030506@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=armbru@redhat.com \
    --cc=cam@cs.ualberta.ca \
    --cc=claudio.fontana@huawei.com \
    --cc=david.marchand@6wind.com \
    --cc=mlureau@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /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 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).