All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH v3 0/2] hostmem-file: reject invalid pmem file sizes
@ 2019-02-14  3:10 Stefan Hajnoczi
  2019-02-14  3:10 ` [Qemu-devel] [PATCH v3 1/2] hostmem: simplify ifdef-s in file_backend_memory_alloc() Stefan Hajnoczi
                   ` (2 more replies)
  0 siblings, 3 replies; 14+ messages in thread
From: Stefan Hajnoczi @ 2019-02-14  3:10 UTC (permalink / raw)
  To: qemu-devel; +Cc: Eduardo Habkost, Igor Mammedov, Stefan Hajnoczi

v3:
 * Added Patch 1 by Igor [Wei]
 * Moved pmem size check after mem_path check [Wei]

Guests started with NVDIMMs larger than the underlying host file produce
confusing errors inside the guest.  This happens because the guest
accesses pages beyond the end of the file.

Check the pmem file size on startup and print a clear error message if
the size is invalid.

Igor Mammedov (1):
  hostmem: simplify ifdef-s in file_backend_memory_alloc()

Stefan Hajnoczi (1):
  hostmem-file: reject invalid pmem file sizes

 include/qemu/osdep.h    | 13 ++++++++++
 backends/hostmem-file.c | 32 +++++++++++++++++++++----
 util/oslib-posix.c      | 53 +++++++++++++++++++++++++++++++++++++++++
 util/oslib-win32.c      |  5 ++++
 4 files changed, 98 insertions(+), 5 deletions(-)

-- 
2.20.1

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [Qemu-devel] [PATCH v3 1/2] hostmem: simplify ifdef-s in file_backend_memory_alloc()
  2019-02-14  3:10 [Qemu-devel] [PATCH v3 0/2] hostmem-file: reject invalid pmem file sizes Stefan Hajnoczi
@ 2019-02-14  3:10 ` Stefan Hajnoczi
  2019-02-14  7:26   ` Wei Yang
  2019-02-14  3:10 ` [Qemu-devel] [PATCH v3 2/2] hostmem-file: reject invalid pmem file sizes Stefan Hajnoczi
  2019-02-14  8:50 ` [Qemu-devel] [PATCH v3 0/2] " Pankaj Gupta
  2 siblings, 1 reply; 14+ messages in thread
From: Stefan Hajnoczi @ 2019-02-14  3:10 UTC (permalink / raw)
  To: qemu-devel; +Cc: Eduardo Habkost, Igor Mammedov, Wei Yang, Stefan Hajnoczi

From: Igor Mammedov <imammedo@redhat.com>

cleanup file_backend_memory_alloc() by using one CONFIG_POSIX ifdef
instead of several ones within the function to make it simpler to follow.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
Suggested-by: Wei Yang <richardw.yang@linux.intel.com>
Reviewed-by: Wei Yang <richardw.yang@linux.intel.com>
Message-Id: <20190213123858.24620-1-imammedo@redhat.com>
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
---
 backends/hostmem-file.c | 9 ++++-----
 1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/backends/hostmem-file.c b/backends/hostmem-file.c
index ba601ce940..ce54788048 100644
--- a/backends/hostmem-file.c
+++ b/backends/hostmem-file.c
@@ -41,10 +41,12 @@ struct HostMemoryBackendFile {
 static void
 file_backend_memory_alloc(HostMemoryBackend *backend, Error **errp)
 {
+#ifndef CONFIG_POSIX
+    error_setg(errp, "backend '%s' not supported on this host",
+               object_get_typename(OBJECT(backend)));
+#else
     HostMemoryBackendFile *fb = MEMORY_BACKEND_FILE(backend);
-#ifdef CONFIG_POSIX
     gchar *name;
-#endif
 
     if (!backend->size) {
         error_setg(errp, "can't create backend with size 0");
@@ -54,9 +56,6 @@ file_backend_memory_alloc(HostMemoryBackend *backend, Error **errp)
         error_setg(errp, "mem-path property not set");
         return;
     }
-#ifndef CONFIG_POSIX
-    error_setg(errp, "-mem-path not supported on this host");
-#else
     backend->force_prealloc = mem_prealloc;
     name = host_memory_backend_get_name(backend);
     memory_region_init_ram_from_file(&backend->mr, OBJECT(backend),
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [Qemu-devel] [PATCH v3 2/2] hostmem-file: reject invalid pmem file sizes
  2019-02-14  3:10 [Qemu-devel] [PATCH v3 0/2] hostmem-file: reject invalid pmem file sizes Stefan Hajnoczi
  2019-02-14  3:10 ` [Qemu-devel] [PATCH v3 1/2] hostmem: simplify ifdef-s in file_backend_memory_alloc() Stefan Hajnoczi
@ 2019-02-14  3:10 ` Stefan Hajnoczi
  2019-02-14  4:19   ` Wei Yang
                     ` (2 more replies)
  2019-02-14  8:50 ` [Qemu-devel] [PATCH v3 0/2] " Pankaj Gupta
  2 siblings, 3 replies; 14+ messages in thread
From: Stefan Hajnoczi @ 2019-02-14  3:10 UTC (permalink / raw)
  To: qemu-devel
  Cc: Eduardo Habkost, Igor Mammedov, Stefan Hajnoczi, Wei Yang, Zhang Yi

Guests started with NVDIMMs larger than the underlying host file produce
confusing errors inside the guest.  This happens because the guest
accesses pages beyond the end of the file.

Check the pmem file size on startup and print a clear error message if
the size is invalid.

Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1669053
Cc: Wei Yang <richardw.yang@linux.intel.com>
Cc: Zhang Yi <yi.z.zhang@linux.intel.com>
Cc: Eduardo Habkost <ehabkost@redhat.com>
Cc: Igor Mammedov <imammedo@redhat.com>
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
---
 include/qemu/osdep.h    | 13 ++++++++++
 backends/hostmem-file.c | 23 ++++++++++++++++++
 util/oslib-posix.c      | 53 +++++++++++++++++++++++++++++++++++++++++
 util/oslib-win32.c      |  5 ++++
 4 files changed, 94 insertions(+)

diff --git a/include/qemu/osdep.h b/include/qemu/osdep.h
index 840af09cb0..303d315c5d 100644
--- a/include/qemu/osdep.h
+++ b/include/qemu/osdep.h
@@ -570,6 +570,19 @@ void qemu_set_tty_echo(int fd, bool echo);
 void os_mem_prealloc(int fd, char *area, size_t sz, int smp_cpus,
                      Error **errp);
 
+/**
+ * qemu_get_pmem_size:
+ * @filename: path to a pmem file
+ * @errp: pointer to a NULL-initialized error object
+ *
+ * Determine the size of a persistent memory file.  Besides supporting files on
+ * DAX file systems, this function also supports Linux devdax character
+ * devices.
+ *
+ * Returns: the size or 0 on failure
+ */
+uint64_t qemu_get_pmem_size(const char *filename, Error **errp);
+
 /**
  * qemu_get_pid_name:
  * @pid: pid of a process
diff --git a/backends/hostmem-file.c b/backends/hostmem-file.c
index ce54788048..37ac6445d2 100644
--- a/backends/hostmem-file.c
+++ b/backends/hostmem-file.c
@@ -56,6 +56,29 @@ file_backend_memory_alloc(HostMemoryBackend *backend, Error **errp)
         error_setg(errp, "mem-path property not set");
         return;
     }
+
+    /*
+     * Verify pmem file size since starting a guest with an incorrect size
+     * leads to confusing failures inside the guest.
+     */
+    if (fb->is_pmem) {
+        Error *local_err = NULL;
+        uint64_t size;
+
+        size = qemu_get_pmem_size(fb->mem_path, &local_err);
+        if (!size) {
+            error_propagate(errp, local_err);
+            return;
+        }
+
+        if (backend->size > size) {
+            error_setg(errp, "size property %" PRIu64 " is larger than "
+                       "pmem file \"%s\" size %" PRIu64, backend->size,
+                       fb->mem_path, size);
+            return;
+        }
+    }
+
     backend->force_prealloc = mem_prealloc;
     name = host_memory_backend_get_name(backend);
     memory_region_init_ram_from_file(&backend->mr, OBJECT(backend),
diff --git a/util/oslib-posix.c b/util/oslib-posix.c
index 37c5854b9c..10d90d1783 100644
--- a/util/oslib-posix.c
+++ b/util/oslib-posix.c
@@ -500,6 +500,59 @@ void os_mem_prealloc(int fd, char *area, size_t memory, int smp_cpus,
     }
 }
 
+uint64_t qemu_get_pmem_size(const char *filename, Error **errp)
+{
+    struct stat st;
+
+    if (stat(filename, &st) < 0) {
+        error_setg(errp, "unable to stat pmem file \"%s\"", filename);
+        return 0;
+    }
+
+#if defined(__linux__)
+    /* Special handling for devdax character devices */
+    if (S_ISCHR(st.st_mode)) {
+        char *subsystem_path = NULL;
+        char *subsystem = NULL;
+        char *size_path = NULL;
+        char *size_str = NULL;
+        uint64_t ret = 0;
+
+        subsystem_path = g_strdup_printf("/sys/dev/char/%d:%d/subsystem",
+                                         major(st.st_rdev), minor(st.st_rdev));
+        subsystem = g_file_read_link(subsystem_path, NULL);
+        if (!subsystem) {
+            error_setg(errp, "unable to read subsystem for pmem file \"%s\"",
+                       filename);
+            goto devdax_err;
+        }
+
+        if (!g_str_has_suffix(subsystem, "/dax")) {
+            error_setg(errp, "pmem file \"%s\" is not a dax device", filename);
+            goto devdax_err;
+        }
+
+        size_path = g_strdup_printf("/sys/dev/char/%d:%d/size",
+                                    major(st.st_rdev), minor(st.st_rdev));
+        if (!g_file_get_contents(size_path, &size_str, NULL, NULL)) {
+            error_setg(errp, "unable to read size for pmem file \"%s\"",
+                       size_path);
+            goto devdax_err;
+        }
+
+        ret = g_ascii_strtoull(size_str, NULL, 0);
+
+devdax_err:
+        g_free(size_str);
+        g_free(size_path);
+        g_free(subsystem);
+        g_free(subsystem_path);
+        return ret;
+    }
+#endif /* defined(__linux__) */
+
+    return st.st_size;
+}
 
 char *qemu_get_pid_name(pid_t pid)
 {
diff --git a/util/oslib-win32.c b/util/oslib-win32.c
index b4c17f5dfa..bd633afab6 100644
--- a/util/oslib-win32.c
+++ b/util/oslib-win32.c
@@ -560,6 +560,11 @@ void os_mem_prealloc(int fd, char *area, size_t memory, int smp_cpus,
     }
 }
 
+uint64_t qemu_get_pmem_size(const char *filename, Error **errp)
+{
+    error_setg(errp, "pmem support not available");
+    return 0;
+}
 
 char *qemu_get_pid_name(pid_t pid)
 {
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* Re: [Qemu-devel] [PATCH v3 2/2] hostmem-file: reject invalid pmem file sizes
  2019-02-14  3:10 ` [Qemu-devel] [PATCH v3 2/2] hostmem-file: reject invalid pmem file sizes Stefan Hajnoczi
@ 2019-02-14  4:19   ` Wei Yang
  2019-02-14  8:15     ` Stefan Hajnoczi
  2019-02-14 11:01   ` Igor Mammedov
  2019-03-08 17:53   ` Eduardo Habkost
  2 siblings, 1 reply; 14+ messages in thread
From: Wei Yang @ 2019-02-14  4:19 UTC (permalink / raw)
  To: Stefan Hajnoczi
  Cc: qemu-devel, Eduardo Habkost, Igor Mammedov, Wei Yang, Zhang Yi

On Thu, Feb 14, 2019 at 11:10:04AM +0800, Stefan Hajnoczi wrote:
>Guests started with NVDIMMs larger than the underlying host file produce
>confusing errors inside the guest.  This happens because the guest
>accesses pages beyond the end of the file.
>
>Check the pmem file size on startup and print a clear error message if
>the size is invalid.
>
>Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1669053
>Cc: Wei Yang <richardw.yang@linux.intel.com>
>Cc: Zhang Yi <yi.z.zhang@linux.intel.com>
>Cc: Eduardo Habkost <ehabkost@redhat.com>
>Cc: Igor Mammedov <imammedo@redhat.com>
>Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
>---
> include/qemu/osdep.h    | 13 ++++++++++
> backends/hostmem-file.c | 23 ++++++++++++++++++
> util/oslib-posix.c      | 53 +++++++++++++++++++++++++++++++++++++++++
> util/oslib-win32.c      |  5 ++++
> 4 files changed, 94 insertions(+)
>
>diff --git a/include/qemu/osdep.h b/include/qemu/osdep.h
>index 840af09cb0..303d315c5d 100644
>--- a/include/qemu/osdep.h
>+++ b/include/qemu/osdep.h
>@@ -570,6 +570,19 @@ void qemu_set_tty_echo(int fd, bool echo);
> void os_mem_prealloc(int fd, char *area, size_t sz, int smp_cpus,
>                      Error **errp);
> 
>+/**
>+ * qemu_get_pmem_size:
>+ * @filename: path to a pmem file
>+ * @errp: pointer to a NULL-initialized error object
>+ *
>+ * Determine the size of a persistent memory file.  Besides supporting files on
>+ * DAX file systems, this function also supports Linux devdax character
>+ * devices.
>+ *
>+ * Returns: the size or 0 on failure
>+ */
>+uint64_t qemu_get_pmem_size(const char *filename, Error **errp);
>+
> /**
>  * qemu_get_pid_name:
>  * @pid: pid of a process
>diff --git a/backends/hostmem-file.c b/backends/hostmem-file.c
>index ce54788048..37ac6445d2 100644
>--- a/backends/hostmem-file.c
>+++ b/backends/hostmem-file.c
>@@ -56,6 +56,29 @@ file_backend_memory_alloc(HostMemoryBackend *backend, Error **errp)
>         error_setg(errp, "mem-path property not set");
>         return;
>     }
>+
>+    /*
>+     * Verify pmem file size since starting a guest with an incorrect size
>+     * leads to confusing failures inside the guest.
>+     */
>+    if (fb->is_pmem) {
>+        Error *local_err = NULL;
>+        uint64_t size;
>+
>+        size = qemu_get_pmem_size(fb->mem_path, &local_err);
>+        if (!size) {
>+            error_propagate(errp, local_err);
>+            return;
>+        }
>+
>+        if (backend->size > size) {
>+            error_setg(errp, "size property %" PRIu64 " is larger than "
>+                       "pmem file \"%s\" size %" PRIu64, backend->size,
>+                       fb->mem_path, size);
>+            return;
>+        }
>+    }
>+
>     backend->force_prealloc = mem_prealloc;
>     name = host_memory_backend_get_name(backend);
>     memory_region_init_ram_from_file(&backend->mr, OBJECT(backend),
>diff --git a/util/oslib-posix.c b/util/oslib-posix.c
>index 37c5854b9c..10d90d1783 100644
>--- a/util/oslib-posix.c
>+++ b/util/oslib-posix.c
>@@ -500,6 +500,59 @@ void os_mem_prealloc(int fd, char *area, size_t memory, int smp_cpus,
>     }
> }
> 
>+uint64_t qemu_get_pmem_size(const char *filename, Error **errp)
>+{
>+    struct stat st;
>+
>+    if (stat(filename, &st) < 0) {
>+        error_setg(errp, "unable to stat pmem file \"%s\"", filename);
>+        return 0;
>+    }
>+
>+#if defined(__linux__)
>+    /* Special handling for devdax character devices */
>+    if (S_ISCHR(st.st_mode)) {
>+        char *subsystem_path = NULL;
>+        char *subsystem = NULL;
>+        char *size_path = NULL;
>+        char *size_str = NULL;
>+        uint64_t ret = 0;
>+
>+        subsystem_path = g_strdup_printf("/sys/dev/char/%d:%d/subsystem",
>+                                         major(st.st_rdev), minor(st.st_rdev));
>+        subsystem = g_file_read_link(subsystem_path, NULL);
>+        if (!subsystem) {
>+            error_setg(errp, "unable to read subsystem for pmem file \"%s\"",
>+                       filename);
>+            goto devdax_err;
>+        }
>+
>+        if (!g_str_has_suffix(subsystem, "/dax")) {
>+            error_setg(errp, "pmem file \"%s\" is not a dax device", filename);
>+            goto devdax_err;
>+        }
>+
>+        size_path = g_strdup_printf("/sys/dev/char/%d:%d/size",
>+                                    major(st.st_rdev), minor(st.st_rdev));
>+        if (!g_file_get_contents(size_path, &size_str, NULL, NULL)) {
>+            error_setg(errp, "unable to read size for pmem file \"%s\"",
>+                       size_path);
>+            goto devdax_err;
>+        }
>+
>+        ret = g_ascii_strtoull(size_str, NULL, 0);
>+
>+devdax_err:
>+        g_free(size_str);
>+        g_free(size_path);
>+        g_free(subsystem);
>+        g_free(subsystem_path);
>+        return ret;
>+    }
>+#endif /* defined(__linux__) */
>+
>+    return st.st_size;
>+}
> 
> char *qemu_get_pid_name(pid_t pid)
> {
>diff --git a/util/oslib-win32.c b/util/oslib-win32.c
>index b4c17f5dfa..bd633afab6 100644
>--- a/util/oslib-win32.c
>+++ b/util/oslib-win32.c
>@@ -560,6 +560,11 @@ void os_mem_prealloc(int fd, char *area, size_t memory, int smp_cpus,
>     }
> }
> 
>+uint64_t qemu_get_pmem_size(const char *filename, Error **errp)
>+{
>+    error_setg(errp, "pmem support not available");
>+    return 0;
>+}

After the cleanup from Igor, qemu_get_pmem_size() would be invoked only on
POSIX system.

Is it still necessary to define this on win32?

> 
> char *qemu_get_pid_name(pid_t pid)
> {
>-- 
>2.20.1

-- 
Wei Yang
Help you, Help me

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Qemu-devel] [PATCH v3 1/2] hostmem: simplify ifdef-s in file_backend_memory_alloc()
  2019-02-14  3:10 ` [Qemu-devel] [PATCH v3 1/2] hostmem: simplify ifdef-s in file_backend_memory_alloc() Stefan Hajnoczi
@ 2019-02-14  7:26   ` Wei Yang
  2019-02-14  8:16     ` Stefan Hajnoczi
  0 siblings, 1 reply; 14+ messages in thread
From: Wei Yang @ 2019-02-14  7:26 UTC (permalink / raw)
  To: Stefan Hajnoczi; +Cc: qemu-devel, Eduardo Habkost, Igor Mammedov, Wei Yang

Maybe change the title 

   s/hotmem/hostmem-file/

would be more proper.

I missed this in previous review.

On Thu, Feb 14, 2019 at 11:10:03AM +0800, Stefan Hajnoczi wrote:
>From: Igor Mammedov <imammedo@redhat.com>
>
>cleanup file_backend_memory_alloc() by using one CONFIG_POSIX ifdef
>instead of several ones within the function to make it simpler to follow.
>
>Signed-off-by: Igor Mammedov <imammedo@redhat.com>
>Suggested-by: Wei Yang <richardw.yang@linux.intel.com>
>Reviewed-by: Wei Yang <richardw.yang@linux.intel.com>
>Message-Id: <20190213123858.24620-1-imammedo@redhat.com>
>Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
>---
> backends/hostmem-file.c | 9 ++++-----
> 1 file changed, 4 insertions(+), 5 deletions(-)
>
>diff --git a/backends/hostmem-file.c b/backends/hostmem-file.c
>index ba601ce940..ce54788048 100644
>--- a/backends/hostmem-file.c
>+++ b/backends/hostmem-file.c
>@@ -41,10 +41,12 @@ struct HostMemoryBackendFile {
> static void
> file_backend_memory_alloc(HostMemoryBackend *backend, Error **errp)
> {
>+#ifndef CONFIG_POSIX
>+    error_setg(errp, "backend '%s' not supported on this host",
>+               object_get_typename(OBJECT(backend)));
>+#else
>     HostMemoryBackendFile *fb = MEMORY_BACKEND_FILE(backend);
>-#ifdef CONFIG_POSIX
>     gchar *name;
>-#endif
> 
>     if (!backend->size) {
>         error_setg(errp, "can't create backend with size 0");
>@@ -54,9 +56,6 @@ file_backend_memory_alloc(HostMemoryBackend *backend, Error **errp)
>         error_setg(errp, "mem-path property not set");
>         return;
>     }
>-#ifndef CONFIG_POSIX
>-    error_setg(errp, "-mem-path not supported on this host");
>-#else
>     backend->force_prealloc = mem_prealloc;
>     name = host_memory_backend_get_name(backend);
>     memory_region_init_ram_from_file(&backend->mr, OBJECT(backend),
>-- 
>2.20.1

-- 
Wei Yang
Help you, Help me

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Qemu-devel] [PATCH v3 2/2] hostmem-file: reject invalid pmem file sizes
  2019-02-14  4:19   ` Wei Yang
@ 2019-02-14  8:15     ` Stefan Hajnoczi
  2019-02-14  8:20       ` Wei Yang
  0 siblings, 1 reply; 14+ messages in thread
From: Stefan Hajnoczi @ 2019-02-14  8:15 UTC (permalink / raw)
  To: Wei Yang; +Cc: qemu-devel, Eduardo Habkost, Igor Mammedov, Zhang Yi

[-- Attachment #1: Type: text/plain, Size: 830 bytes --]

On Thu, Feb 14, 2019 at 12:19:15PM +0800, Wei Yang wrote:
> On Thu, Feb 14, 2019 at 11:10:04AM +0800, Stefan Hajnoczi wrote:
> >diff --git a/util/oslib-win32.c b/util/oslib-win32.c
> >index b4c17f5dfa..bd633afab6 100644
> >--- a/util/oslib-win32.c
> >+++ b/util/oslib-win32.c
> >@@ -560,6 +560,11 @@ void os_mem_prealloc(int fd, char *area, size_t memory, int smp_cpus,
> >     }
> > }
> > 
> >+uint64_t qemu_get_pmem_size(const char *filename, Error **errp)
> >+{
> >+    error_setg(errp, "pmem support not available");
> >+    return 0;
> >+}
> 
> After the cleanup from Igor, qemu_get_pmem_size() would be invoked only on
> POSIX system.
> 
> Is it still necessary to define this on win32?

Either way is possible.  I'd like to leave it like this unless there are
strong feelings against this.

Stefan

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 455 bytes --]

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Qemu-devel] [PATCH v3 1/2] hostmem: simplify ifdef-s in file_backend_memory_alloc()
  2019-02-14  7:26   ` Wei Yang
@ 2019-02-14  8:16     ` Stefan Hajnoczi
  2019-03-01 10:40       ` Igor Mammedov
  0 siblings, 1 reply; 14+ messages in thread
From: Stefan Hajnoczi @ 2019-02-14  8:16 UTC (permalink / raw)
  To: Wei Yang; +Cc: qemu-devel, Eduardo Habkost, Igor Mammedov

[-- Attachment #1: Type: text/plain, Size: 259 bytes --]

On Thu, Feb 14, 2019 at 03:26:29PM +0800, Wei Yang wrote:
> Maybe change the title 
> 
>    s/hotmem/hostmem-file/
> 
> would be more proper.
> 
> I missed this in previous review.

You're right.  This can be fixed when merging the patch.

Stefan

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 455 bytes --]

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Qemu-devel] [PATCH v3 2/2] hostmem-file: reject invalid pmem file sizes
  2019-02-14  8:15     ` Stefan Hajnoczi
@ 2019-02-14  8:20       ` Wei Yang
  0 siblings, 0 replies; 14+ messages in thread
From: Wei Yang @ 2019-02-14  8:20 UTC (permalink / raw)
  To: Stefan Hajnoczi
  Cc: Wei Yang, qemu-devel, Eduardo Habkost, Igor Mammedov, Zhang Yi

On Thu, Feb 14, 2019 at 04:15:58PM +0800, Stefan Hajnoczi wrote:
>On Thu, Feb 14, 2019 at 12:19:15PM +0800, Wei Yang wrote:
>> On Thu, Feb 14, 2019 at 11:10:04AM +0800, Stefan Hajnoczi wrote:
>> >diff --git a/util/oslib-win32.c b/util/oslib-win32.c
>> >index b4c17f5dfa..bd633afab6 100644
>> >--- a/util/oslib-win32.c
>> >+++ b/util/oslib-win32.c
>> >@@ -560,6 +560,11 @@ void os_mem_prealloc(int fd, char *area, size_t memory, int smp_cpus,
>> >     }
>> > }
>> > 
>> >+uint64_t qemu_get_pmem_size(const char *filename, Error **errp)
>> >+{
>> >+    error_setg(errp, "pmem support not available");
>> >+    return 0;
>> >+}
>> 
>> After the cleanup from Igor, qemu_get_pmem_size() would be invoked only on
>> POSIX system.
>> 
>> Is it still necessary to define this on win32?
>
>Either way is possible.  I'd like to leave it like this unless there are
>strong feelings against this.
>

Well, I am fine with this.

Reviewed-by: Wei Yang <richardw.yang@linux.intel.com>

>Stefan



-- 
Wei Yang
Help you, Help me

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Qemu-devel] [PATCH v3 0/2] hostmem-file: reject invalid pmem file sizes
  2019-02-14  3:10 [Qemu-devel] [PATCH v3 0/2] hostmem-file: reject invalid pmem file sizes Stefan Hajnoczi
  2019-02-14  3:10 ` [Qemu-devel] [PATCH v3 1/2] hostmem: simplify ifdef-s in file_backend_memory_alloc() Stefan Hajnoczi
  2019-02-14  3:10 ` [Qemu-devel] [PATCH v3 2/2] hostmem-file: reject invalid pmem file sizes Stefan Hajnoczi
@ 2019-02-14  8:50 ` Pankaj Gupta
  2 siblings, 0 replies; 14+ messages in thread
From: Pankaj Gupta @ 2019-02-14  8:50 UTC (permalink / raw)
  To: Stefan Hajnoczi; +Cc: qemu-devel, Igor Mammedov, Eduardo Habkost



> 
> v3:
>  * Added Patch 1 by Igor [Wei]
>  * Moved pmem size check after mem_path check [Wei]
> 
> Guests started with NVDIMMs larger than the underlying host file produce
> confusing errors inside the guest.  This happens because the guest
> accesses pages beyond the end of the file.
> 
> Check the pmem file size on startup and print a clear error message if
> the size is invalid.
> 
> Igor Mammedov (1):
>   hostmem: simplify ifdef-s in file_backend_memory_alloc()
> 
> Stefan Hajnoczi (1):
>   hostmem-file: reject invalid pmem file sizes
> 
>  include/qemu/osdep.h    | 13 ++++++++++
>  backends/hostmem-file.c | 32 +++++++++++++++++++++----
>  util/oslib-posix.c      | 53 +++++++++++++++++++++++++++++++++++++++++
>  util/oslib-win32.c      |  5 ++++
>  4 files changed, 98 insertions(+), 5 deletions(-)
> 
> --
> 2.20.1

Both the patches look good to me.
Reviewed-by: Pankaj Gupta <pagupta@redhat.com>

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Qemu-devel] [PATCH v3 2/2] hostmem-file: reject invalid pmem file sizes
  2019-02-14  3:10 ` [Qemu-devel] [PATCH v3 2/2] hostmem-file: reject invalid pmem file sizes Stefan Hajnoczi
  2019-02-14  4:19   ` Wei Yang
@ 2019-02-14 11:01   ` Igor Mammedov
  2019-03-08 17:53   ` Eduardo Habkost
  2 siblings, 0 replies; 14+ messages in thread
From: Igor Mammedov @ 2019-02-14 11:01 UTC (permalink / raw)
  To: Stefan Hajnoczi; +Cc: qemu-devel, Zhang Yi, Eduardo Habkost, Wei Yang

On Thu, 14 Feb 2019 11:10:04 +0800
Stefan Hajnoczi <stefanha@redhat.com> wrote:

> Guests started with NVDIMMs larger than the underlying host file produce
> confusing errors inside the guest.  This happens because the guest
> accesses pages beyond the end of the file.
> 
> Check the pmem file size on startup and print a clear error message if
> the size is invalid.
> 
> Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1669053
> Cc: Wei Yang <richardw.yang@linux.intel.com>
> Cc: Zhang Yi <yi.z.zhang@linux.intel.com>
> Cc: Eduardo Habkost <ehabkost@redhat.com>
> Cc: Igor Mammedov <imammedo@redhat.com>
> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>

Reviewed-by: Igor Mammedov <imammedo@redhat.com>

> ---
>  include/qemu/osdep.h    | 13 ++++++++++
>  backends/hostmem-file.c | 23 ++++++++++++++++++
>  util/oslib-posix.c      | 53 +++++++++++++++++++++++++++++++++++++++++
>  util/oslib-win32.c      |  5 ++++
>  4 files changed, 94 insertions(+)
> 
> diff --git a/include/qemu/osdep.h b/include/qemu/osdep.h
> index 840af09cb0..303d315c5d 100644
> --- a/include/qemu/osdep.h
> +++ b/include/qemu/osdep.h
> @@ -570,6 +570,19 @@ void qemu_set_tty_echo(int fd, bool echo);
>  void os_mem_prealloc(int fd, char *area, size_t sz, int smp_cpus,
>                       Error **errp);
>  
> +/**
> + * qemu_get_pmem_size:
> + * @filename: path to a pmem file
> + * @errp: pointer to a NULL-initialized error object
> + *
> + * Determine the size of a persistent memory file.  Besides supporting files on
> + * DAX file systems, this function also supports Linux devdax character
> + * devices.
> + *
> + * Returns: the size or 0 on failure
> + */
> +uint64_t qemu_get_pmem_size(const char *filename, Error **errp);
> +
>  /**
>   * qemu_get_pid_name:
>   * @pid: pid of a process
> diff --git a/backends/hostmem-file.c b/backends/hostmem-file.c
> index ce54788048..37ac6445d2 100644
> --- a/backends/hostmem-file.c
> +++ b/backends/hostmem-file.c
> @@ -56,6 +56,29 @@ file_backend_memory_alloc(HostMemoryBackend *backend, Error **errp)
>          error_setg(errp, "mem-path property not set");
>          return;
>      }
> +
> +    /*
> +     * Verify pmem file size since starting a guest with an incorrect size
> +     * leads to confusing failures inside the guest.
> +     */
> +    if (fb->is_pmem) {
> +        Error *local_err = NULL;
> +        uint64_t size;
> +
> +        size = qemu_get_pmem_size(fb->mem_path, &local_err);
> +        if (!size) {
> +            error_propagate(errp, local_err);
> +            return;
> +        }
> +
> +        if (backend->size > size) {
> +            error_setg(errp, "size property %" PRIu64 " is larger than "
> +                       "pmem file \"%s\" size %" PRIu64, backend->size,
> +                       fb->mem_path, size);
> +            return;
> +        }
> +    }
> +
>      backend->force_prealloc = mem_prealloc;
>      name = host_memory_backend_get_name(backend);
>      memory_region_init_ram_from_file(&backend->mr, OBJECT(backend),
> diff --git a/util/oslib-posix.c b/util/oslib-posix.c
> index 37c5854b9c..10d90d1783 100644
> --- a/util/oslib-posix.c
> +++ b/util/oslib-posix.c
> @@ -500,6 +500,59 @@ void os_mem_prealloc(int fd, char *area, size_t memory, int smp_cpus,
>      }
>  }
>  
> +uint64_t qemu_get_pmem_size(const char *filename, Error **errp)
> +{
> +    struct stat st;
> +
> +    if (stat(filename, &st) < 0) {
> +        error_setg(errp, "unable to stat pmem file \"%s\"", filename);
> +        return 0;
> +    }
> +
> +#if defined(__linux__)
> +    /* Special handling for devdax character devices */
> +    if (S_ISCHR(st.st_mode)) {
> +        char *subsystem_path = NULL;
> +        char *subsystem = NULL;
> +        char *size_path = NULL;
> +        char *size_str = NULL;
> +        uint64_t ret = 0;
> +
> +        subsystem_path = g_strdup_printf("/sys/dev/char/%d:%d/subsystem",
> +                                         major(st.st_rdev), minor(st.st_rdev));
> +        subsystem = g_file_read_link(subsystem_path, NULL);
> +        if (!subsystem) {
> +            error_setg(errp, "unable to read subsystem for pmem file \"%s\"",
> +                       filename);
> +            goto devdax_err;
> +        }
> +
> +        if (!g_str_has_suffix(subsystem, "/dax")) {
> +            error_setg(errp, "pmem file \"%s\" is not a dax device", filename);
> +            goto devdax_err;
> +        }
> +
> +        size_path = g_strdup_printf("/sys/dev/char/%d:%d/size",
> +                                    major(st.st_rdev), minor(st.st_rdev));
> +        if (!g_file_get_contents(size_path, &size_str, NULL, NULL)) {
> +            error_setg(errp, "unable to read size for pmem file \"%s\"",
> +                       size_path);
> +            goto devdax_err;
> +        }
> +
> +        ret = g_ascii_strtoull(size_str, NULL, 0);
> +
> +devdax_err:
> +        g_free(size_str);
> +        g_free(size_path);
> +        g_free(subsystem);
> +        g_free(subsystem_path);
> +        return ret;
> +    }
> +#endif /* defined(__linux__) */
> +
> +    return st.st_size;
> +}
>  
>  char *qemu_get_pid_name(pid_t pid)
>  {
> diff --git a/util/oslib-win32.c b/util/oslib-win32.c
> index b4c17f5dfa..bd633afab6 100644
> --- a/util/oslib-win32.c
> +++ b/util/oslib-win32.c
> @@ -560,6 +560,11 @@ void os_mem_prealloc(int fd, char *area, size_t memory, int smp_cpus,
>      }
>  }
>  
> +uint64_t qemu_get_pmem_size(const char *filename, Error **errp)
> +{
> +    error_setg(errp, "pmem support not available");
> +    return 0;
> +}
>  
>  char *qemu_get_pid_name(pid_t pid)
>  {

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Qemu-devel] [PATCH v3 1/2] hostmem: simplify ifdef-s in file_backend_memory_alloc()
  2019-02-14  8:16     ` Stefan Hajnoczi
@ 2019-03-01 10:40       ` Igor Mammedov
  2019-03-01 16:47         ` Stefan Hajnoczi
  0 siblings, 1 reply; 14+ messages in thread
From: Igor Mammedov @ 2019-03-01 10:40 UTC (permalink / raw)
  To: Stefan Hajnoczi; +Cc: Wei Yang, qemu-devel, Eduardo Habkost

On Thu, 14 Feb 2019 16:16:19 +0800
Stefan Hajnoczi <stefanha@redhat.com> wrote:

> On Thu, Feb 14, 2019 at 03:26:29PM +0800, Wei Yang wrote:
> > Maybe change the title 
> > 
> >    s/hotmem/hostmem-file/
> > 
> > would be more proper.
> > 
> > I missed this in previous review.  
> 
> You're right.  This can be fixed when merging the patch.
> 
> Stefan

Did this patch fall through cracks?

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Qemu-devel] [PATCH v3 1/2] hostmem: simplify ifdef-s in file_backend_memory_alloc()
  2019-03-01 10:40       ` Igor Mammedov
@ 2019-03-01 16:47         ` Stefan Hajnoczi
  2019-03-06 10:23           ` Laurent Vivier
  0 siblings, 1 reply; 14+ messages in thread
From: Stefan Hajnoczi @ 2019-03-01 16:47 UTC (permalink / raw)
  To: Igor Mammedov; +Cc: Stefan Hajnoczi, Wei Yang, Eduardo Habkost, qemu-devel

[-- Attachment #1: Type: text/plain, Size: 636 bytes --]

On Fri, Mar 01, 2019 at 11:40:06AM +0100, Igor Mammedov wrote:
> On Thu, 14 Feb 2019 16:16:19 +0800
> Stefan Hajnoczi <stefanha@redhat.com> wrote:
> 
> > On Thu, Feb 14, 2019 at 03:26:29PM +0800, Wei Yang wrote:
> > > Maybe change the title 
> > > 
> > >    s/hotmem/hostmem-file/
> > > 
> > > would be more proper.
> > > 
> > > I missed this in previous review.  
> > 
> > You're right.  This can be fixed when merging the patch.
> > 
> > Stefan
> 
> Did this patch fall through cracks?

Eduardo has been away.  It wasn't urgent but I'd be happy if either you
or Eduardo picks up these patches.

Thanks,
Stefan

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 455 bytes --]

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Qemu-devel] [PATCH v3 1/2] hostmem: simplify ifdef-s in file_backend_memory_alloc()
  2019-03-01 16:47         ` Stefan Hajnoczi
@ 2019-03-06 10:23           ` Laurent Vivier
  0 siblings, 0 replies; 14+ messages in thread
From: Laurent Vivier @ 2019-03-06 10:23 UTC (permalink / raw)
  To: Stefan Hajnoczi, Igor Mammedov
  Cc: qemu-devel, Wei Yang, Stefan Hajnoczi, Eduardo Habkost

[-- Attachment #1: Type: text/plain, Size: 770 bytes --]

On 01/03/2019 17:47, Stefan Hajnoczi wrote:
> On Fri, Mar 01, 2019 at 11:40:06AM +0100, Igor Mammedov wrote:
>> On Thu, 14 Feb 2019 16:16:19 +0800
>> Stefan Hajnoczi <stefanha@redhat.com> wrote:
>>
>>> On Thu, Feb 14, 2019 at 03:26:29PM +0800, Wei Yang wrote:
>>>> Maybe change the title 
>>>>
>>>>    s/hotmem/hostmem-file/
>>>>
>>>> would be more proper.
>>>>
>>>> I missed this in previous review.  
>>>
>>> You're right.  This can be fixed when merging the patch.
>>>
>>> Stefan
>>
>> Did this patch fall through cracks?
> 
> Eduardo has been away.  It wasn't urgent but I'd be happy if either you
> or Eduardo picks up these patches.
> 
> Thanks,
> Stefan
> 

On Igor request, applied to my trivial-patches branch.

Thanks,
Laurent


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Qemu-devel] [PATCH v3 2/2] hostmem-file: reject invalid pmem file sizes
  2019-02-14  3:10 ` [Qemu-devel] [PATCH v3 2/2] hostmem-file: reject invalid pmem file sizes Stefan Hajnoczi
  2019-02-14  4:19   ` Wei Yang
  2019-02-14 11:01   ` Igor Mammedov
@ 2019-03-08 17:53   ` Eduardo Habkost
  2 siblings, 0 replies; 14+ messages in thread
From: Eduardo Habkost @ 2019-03-08 17:53 UTC (permalink / raw)
  To: Stefan Hajnoczi; +Cc: qemu-devel, Igor Mammedov, Wei Yang, Zhang Yi

On Thu, Feb 14, 2019 at 11:10:04AM +0800, Stefan Hajnoczi wrote:
> Guests started with NVDIMMs larger than the underlying host file produce
> confusing errors inside the guest.  This happens because the guest
> accesses pages beyond the end of the file.
> 
> Check the pmem file size on startup and print a clear error message if
> the size is invalid.
> 
> Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1669053
> Cc: Wei Yang <richardw.yang@linux.intel.com>
> Cc: Zhang Yi <yi.z.zhang@linux.intel.com>
> Cc: Eduardo Habkost <ehabkost@redhat.com>
> Cc: Igor Mammedov <imammedo@redhat.com>
> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>

I've just noticed this wasn't picked up on my previous pull
request.  I'm queueing this on machine-next, now.

-- 
Eduardo

^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2019-03-08 17:53 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-02-14  3:10 [Qemu-devel] [PATCH v3 0/2] hostmem-file: reject invalid pmem file sizes Stefan Hajnoczi
2019-02-14  3:10 ` [Qemu-devel] [PATCH v3 1/2] hostmem: simplify ifdef-s in file_backend_memory_alloc() Stefan Hajnoczi
2019-02-14  7:26   ` Wei Yang
2019-02-14  8:16     ` Stefan Hajnoczi
2019-03-01 10:40       ` Igor Mammedov
2019-03-01 16:47         ` Stefan Hajnoczi
2019-03-06 10:23           ` Laurent Vivier
2019-02-14  3:10 ` [Qemu-devel] [PATCH v3 2/2] hostmem-file: reject invalid pmem file sizes Stefan Hajnoczi
2019-02-14  4:19   ` Wei Yang
2019-02-14  8:15     ` Stefan Hajnoczi
2019-02-14  8:20       ` Wei Yang
2019-02-14 11:01   ` Igor Mammedov
2019-03-08 17:53   ` Eduardo Habkost
2019-02-14  8:50 ` [Qemu-devel] [PATCH v3 0/2] " Pankaj Gupta

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.