Trying to get memory region size of an uninitialized memory region is
probably not a good idea. Let's just do the alloc no matter what.
Signed-off-by: Peter Xu <peterx@redhat.com>
---
backends/hostmem-file.c | 17 +++++++----------
1 file changed, 7 insertions(+), 10 deletions(-)
diff --git a/backends/hostmem-file.c b/backends/hostmem-file.c
index 42efb2f..a61d1bd 100644
--- a/backends/hostmem-file.c
+++ b/backends/hostmem-file.c
@@ -39,6 +39,7 @@ static void
file_backend_memory_alloc(HostMemoryBackend *backend, Error **errp)
{
HostMemoryBackendFile *fb = MEMORY_BACKEND_FILE(backend);
+ gchar *path;
if (!backend->size) {
error_setg(errp, "can't create backend with size 0");
@@ -51,16 +52,12 @@ file_backend_memory_alloc(HostMemoryBackend *backend, Error **errp)
#ifndef CONFIG_LINUX
error_setg(errp, "-mem-path not supported on this host");
#else
- if (!memory_region_size(&backend->mr)) {
- gchar *path;
- backend->force_prealloc = mem_prealloc;
- path = object_get_canonical_path(OBJECT(backend));
- memory_region_init_ram_from_file(&backend->mr, OBJECT(backend),
- path,
- backend->size, fb->share,
- fb->mem_path, errp);
- g_free(path);
- }
+ backend->force_prealloc = mem_prealloc;
+ path = object_get_canonical_path(OBJECT(backend));
+ memory_region_init_ram_from_file(&backend->mr, OBJECT(backend),
+ path, backend->size, fb->share,
+ fb->mem_path, errp);
+ g_free(path);
#endif
}
--
2.7.4
On 10/03/2017 05:13, Peter Xu wrote:
> Trying to get memory region size of an uninitialized memory region is
> probably not a good idea. Let's just do the alloc no matter what.
>
> Signed-off-by: Peter Xu <peterx@redhat.com>
What is the effect of the bug? The idea was to do the initialization
once only (memory_region_size ought to be 0 when the MR is
uninitialized; now it is ugly but it made more sense when MemoryRegion
was just a C struct and not a QOM object).
Paolo
> ---
> backends/hostmem-file.c | 17 +++++++----------
> 1 file changed, 7 insertions(+), 10 deletions(-)
>
> diff --git a/backends/hostmem-file.c b/backends/hostmem-file.c
> index 42efb2f..a61d1bd 100644
> --- a/backends/hostmem-file.c
> +++ b/backends/hostmem-file.c
> @@ -39,6 +39,7 @@ static void
> file_backend_memory_alloc(HostMemoryBackend *backend, Error **errp)
> {
> HostMemoryBackendFile *fb = MEMORY_BACKEND_FILE(backend);
> + gchar *path;
>
> if (!backend->size) {
> error_setg(errp, "can't create backend with size 0");
> @@ -51,16 +52,12 @@ file_backend_memory_alloc(HostMemoryBackend *backend, Error **errp)
> #ifndef CONFIG_LINUX
> error_setg(errp, "-mem-path not supported on this host");
> #else
> - if (!memory_region_size(&backend->mr)) {
> - gchar *path;
> - backend->force_prealloc = mem_prealloc;
> - path = object_get_canonical_path(OBJECT(backend));
> - memory_region_init_ram_from_file(&backend->mr, OBJECT(backend),
> - path,
> - backend->size, fb->share,
> - fb->mem_path, errp);
> - g_free(path);
> - }
> + backend->force_prealloc = mem_prealloc;
> + path = object_get_canonical_path(OBJECT(backend));
> + memory_region_init_ram_from_file(&backend->mr, OBJECT(backend),
> + path, backend->size, fb->share,
> + fb->mem_path, errp);
> + g_free(path);
> #endif
> }
>
>
On Fri, Mar 10, 2017 at 09:33:57AM +0100, Paolo Bonzini wrote: > > > On 10/03/2017 05:13, Peter Xu wrote: > > Trying to get memory region size of an uninitialized memory region is > > probably not a good idea. Let's just do the alloc no matter what. > > > > Signed-off-by: Peter Xu <peterx@redhat.com> > > What is the effect of the bug? The idea was to do the initialization > once only (memory_region_size ought to be 0 when the MR is > uninitialized; now it is ugly but it made more sense when MemoryRegion > was just a C struct and not a QOM object). It's not really a bug. I just saw it, thought it was something not quite right, so posted a patch. Since it's intended, then please ignore this patch, and sorry for the noise... :) (Considering it's a QOM object, it'll better explain itself if we were using something like object_initialized() here for the check, but since we don't have that, I think fetching size is okay as well) Thanks, -- peterx
On 10 March 2017 at 09:59, Peter Xu <peterx@redhat.com> wrote:
> On Fri, Mar 10, 2017 at 09:33:57AM +0100, Paolo Bonzini wrote:
>>
>>
>> On 10/03/2017 05:13, Peter Xu wrote:
>> > Trying to get memory region size of an uninitialized memory region is
>> > probably not a good idea. Let's just do the alloc no matter what.
>> >
>> > Signed-off-by: Peter Xu <peterx@redhat.com>
>>
>> What is the effect of the bug? The idea was to do the initialization
>> once only (memory_region_size ought to be 0 when the MR is
>> uninitialized; now it is ugly but it made more sense when MemoryRegion
>> was just a C struct and not a QOM object).
>
> It's not really a bug. I just saw it, thought it was something not
> quite right, so posted a patch.
We could reasonably abstract out the test into a function
bool backend_mr_initialized(HostMemoryBackend *backend)
{
/* We forbid zero-length in file_backend_memory_alloc,
* so zero always means "we haven't allocated the backend
* MR yet".
*/
return memory_region_size(&backend->mr) != 0;
}
and use it in file_backend_memory_alloc(), set_mem_path()
and file_memory_backend_set_share(). That would make the intent
clearer here I think.
thanks
-- PMM
On Fri, Mar 10, 2017 at 10:17:30AM +0100, Peter Maydell wrote:
> On 10 March 2017 at 09:59, Peter Xu <peterx@redhat.com> wrote:
> > On Fri, Mar 10, 2017 at 09:33:57AM +0100, Paolo Bonzini wrote:
> >>
> >>
> >> On 10/03/2017 05:13, Peter Xu wrote:
> >> > Trying to get memory region size of an uninitialized memory region is
> >> > probably not a good idea. Let's just do the alloc no matter what.
> >> >
> >> > Signed-off-by: Peter Xu <peterx@redhat.com>
> >>
> >> What is the effect of the bug? The idea was to do the initialization
> >> once only (memory_region_size ought to be 0 when the MR is
> >> uninitialized; now it is ugly but it made more sense when MemoryRegion
> >> was just a C struct and not a QOM object).
> >
> > It's not really a bug. I just saw it, thought it was something not
> > quite right, so posted a patch.
>
> We could reasonably abstract out the test into a function
> bool backend_mr_initialized(HostMemoryBackend *backend)
> {
> /* We forbid zero-length in file_backend_memory_alloc,
> * so zero always means "we haven't allocated the backend
> * MR yet".
> */
> return memory_region_size(&backend->mr) != 0;
> }
>
> and use it in file_backend_memory_alloc(), set_mem_path()
> and file_memory_backend_set_share(). That would make the intent
> clearer here I think.
Agree, maybe use it in hostmem.c as well where capable?
(Paolo: I wasn't planning to add anything there, but if any of you
like me to do this cleanup, I would be glad to :)
-- peterx
On 10/03/2017 10:36, Peter Xu wrote:
> On Fri, Mar 10, 2017 at 10:17:30AM +0100, Peter Maydell wrote:
>> On 10 March 2017 at 09:59, Peter Xu <peterx@redhat.com> wrote:
>>> On Fri, Mar 10, 2017 at 09:33:57AM +0100, Paolo Bonzini wrote:
>>>>
>>>>
>>>> On 10/03/2017 05:13, Peter Xu wrote:
>>>>> Trying to get memory region size of an uninitialized memory region is
>>>>> probably not a good idea. Let's just do the alloc no matter what.
>>>>>
>>>>> Signed-off-by: Peter Xu <peterx@redhat.com>
>>>>
>>>> What is the effect of the bug? The idea was to do the initialization
>>>> once only (memory_region_size ought to be 0 when the MR is
>>>> uninitialized; now it is ugly but it made more sense when MemoryRegion
>>>> was just a C struct and not a QOM object).
>>>
>>> It's not really a bug. I just saw it, thought it was something not
>>> quite right, so posted a patch.
>>
>> We could reasonably abstract out the test into a function
>> bool backend_mr_initialized(HostMemoryBackend *backend)
>> {
>> /* We forbid zero-length in file_backend_memory_alloc,
>> * so zero always means "we haven't allocated the backend
>> * MR yet".
>> */
>> return memory_region_size(&backend->mr) != 0;
>> }
>>
>> and use it in file_backend_memory_alloc(), set_mem_path()
>> and file_memory_backend_set_share(). That would make the intent
>> clearer here I think.
>
> Agree, maybe use it in hostmem.c as well where capable?
>
> (Paolo: I wasn't planning to add anything there, but if any of you
> like me to do this cleanup, I would be glad to :)
Yes, please (to name things more consistently it should be
host_memory_backend_initialized).
Paolo
On 10/03/2017 09:59, Peter Xu wrote: >> What is the effect of the bug? The idea was to do the initialization >> once only (memory_region_size ought to be 0 when the MR is >> uninitialized; now it is ugly but it made more sense when MemoryRegion >> was just a C struct and not a QOM object). > It's not really a bug. I just saw it, thought it was something not > quite right, so posted a patch. Since it's intended, then please > ignore this patch, and sorry for the noise... :) It's intended but ugly. :) Peter's idea is a good one if you want to implement something along those lines. Paolo
© 2016 - 2025 Red Hat, Inc.