[Qemu-devel] [PATCH V3 for 2.1 2/2] exec: improve error handling and reporting in file_ram_alloc() and gethugepagesize()
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()
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