[Qemu-devel] [PATCH V3 for 2.1 2/2] exec: improve error handling and reporting in file_ram_alloc() and gethugepagesize()

2014-07-07 Thread Hu Tao
This patch fixes two problems of memory-backend-file:

1. If user adds a memory-backend-file object using object_add command,
   specifying a non-existing directory for property mem-path, qemu
   will core dump with message:

 /nonexistingdir: No such file or directory
 Bad ram offset f000
 Aborted (core dumped)

   with this patch, qemu reports error message like:

 qemu-system-x86_64: -object 
memory-backend-file,mem-path=/nonexistingdir,id=mem-file0,size=128M:
 failed to stat file /nonexistingdir: No such file or directory

2. If user adds a memory-backend-file object using object_add command,
   specifying a size that is less than huge page size, qemu
   will core dump with message:

 Bad ram offset f000
 Aborted (core dumped)

   with this patch, qemu reports error message like:

 qemu-system-x86_64: -object 
memory-backend-file,mem-path=/hugepages,id=mem-file0,size=1M: memory
 size 0x10 should be euqal or larger than huge page size 0x20

Signed-off-by: Hu Tao hu...@cn.fujitsu.com
---
 exec.c | 19 +++
 1 file changed, 11 insertions(+), 8 deletions(-)

diff --git a/exec.c b/exec.c
index ca7741b..bb97b15 100644
--- a/exec.c
+++ b/exec.c
@@ -996,7 +996,7 @@ void qemu_mutex_unlock_ramlist(void)
 
 #define HUGETLBFS_MAGIC   0x958458f6
 
-static long gethugepagesize(const char *path)
+static long gethugepagesize(const char *path, Error **errp)
 {
 struct statfs fs;
 int ret;
@@ -1006,7 +1006,7 @@ static long gethugepagesize(const char *path)
 } while (ret != 0  errno == EINTR);
 
 if (ret != 0) {
-perror(path);
+error_setg_errno(errp, errno, failed to get size of file %s, path);
 return 0;
 }
 
@@ -1024,17 +1024,20 @@ static void *file_ram_alloc(RAMBlock *block,
 char *filename;
 char *sanitized_name;
 char *c;
-void *area;
+void *area = NULL;
 int fd;
 unsigned long hpagesize;
 
-hpagesize = gethugepagesize(path);
-if (!hpagesize) {
+hpagesize = gethugepagesize(path, errp);
+if (errp  *errp) {
 goto error;
 }
 
 if (memory  hpagesize) {
-return NULL;
+error_setg(errp, memory size 0x RAM_ADDR_FMT  must be euqal to 
+   or larger than huge page size 0x% PRIx64,
+   memory, hpagesize);
+goto error;
 }
 
 if (kvm_enabled()  !kvm_has_sync_mmu()) {
@@ -1094,8 +1097,8 @@ static void *file_ram_alloc(RAMBlock *block,
 return area;
 
 error:
-if (mem_prealloc) {
-exit(1);
+if (area  area != MAP_FAILED) {
+munmap(area, memory);
 }
 return NULL;
 }
-- 
1.9.3




Re: [Qemu-devel] [PATCH V3 for 2.1 2/2] exec: improve error handling and reporting in file_ram_alloc() and gethugepagesize()

2014-07-07 Thread Michael S. Tsirkin
On Mon, Jul 07, 2014 at 06:55:28PM +0800, Hu Tao wrote:
 This patch fixes two problems of memory-backend-file:
 
 1. If user adds a memory-backend-file object using object_add command,
specifying a non-existing directory for property mem-path, qemu
will core dump with message:
 
  /nonexistingdir: No such file or directory
  Bad ram offset f000
  Aborted (core dumped)
 
with this patch, qemu reports error message like:
 
  qemu-system-x86_64: -object 
 memory-backend-file,mem-path=/nonexistingdir,id=mem-file0,size=128M:
  failed to stat file /nonexistingdir: No such file or directory
 
 2. If user adds a memory-backend-file object using object_add command,
specifying a size that is less than huge page size, qemu
will core dump with message:
 
  Bad ram offset f000
  Aborted (core dumped)
 
with this patch, qemu reports error message like:
 
  qemu-system-x86_64: -object 
 memory-backend-file,mem-path=/hugepages,id=mem-file0,size=1M: memory
  size 0x10 should be euqal or larger than huge page size 0x20
 
 Signed-off-by: Hu Tao hu...@cn.fujitsu.com

Build fails on 32 bit host
/scm/qemu/exec.c:1037:9: error: format ‘%llx’ expects argument of type
‘long long unsigned int’, but argument 5 has type ‘long unsigned int’
[-Werror=format=]


 ---
  exec.c | 19 +++
  1 file changed, 11 insertions(+), 8 deletions(-)
 
 diff --git a/exec.c b/exec.c
 index ca7741b..bb97b15 100644
 --- a/exec.c
 +++ b/exec.c
 @@ -996,7 +996,7 @@ void qemu_mutex_unlock_ramlist(void)
  
  #define HUGETLBFS_MAGIC   0x958458f6
  
 -static long gethugepagesize(const char *path)
 +static long gethugepagesize(const char *path, Error **errp)
  {
  struct statfs fs;
  int ret;
 @@ -1006,7 +1006,7 @@ static long gethugepagesize(const char *path)
  } while (ret != 0  errno == EINTR);
  
  if (ret != 0) {
 -perror(path);
 +error_setg_errno(errp, errno, failed to get size of file %s, path);
  return 0;
  }
  
 @@ -1024,17 +1024,20 @@ static void *file_ram_alloc(RAMBlock *block,
  char *filename;
  char *sanitized_name;
  char *c;
 -void *area;
 +void *area = NULL;
  int fd;
  unsigned long hpagesize;
  
 -hpagesize = gethugepagesize(path);
 -if (!hpagesize) {
 +hpagesize = gethugepagesize(path, errp);
 +if (errp  *errp) {
  goto error;
  }
  
  if (memory  hpagesize) {
 -return NULL;
 +error_setg(errp, memory size 0x RAM_ADDR_FMT  must be euqal to 
 +   or larger than huge page size 0x% PRIx64,
 +   memory, hpagesize);
 +goto error;
  }
  
  if (kvm_enabled()  !kvm_has_sync_mmu()) {
 @@ -1094,8 +1097,8 @@ static void *file_ram_alloc(RAMBlock *block,
  return area;
  
  error:
 -if (mem_prealloc) {
 -exit(1);
 +if (area  area != MAP_FAILED) {
 +munmap(area, memory);
  }
  return NULL;
  }
 -- 
 1.9.3