diff mbox

[RFC,0/4] fixes for pci tree

Message ID 20140616062907.GA29736@G08FNSTD100614.fnst.cn.fujitsu.com
State New
Headers show

Commit Message

Hu Tao June 16, 2014, 6:29 a.m. UTC
On Sun, Jun 15, 2014 at 01:00:56PM +0300, Michael S. Tsirkin wrote:
> On Sat, Jun 14, 2014 at 12:48:55PM +0800, Hu Tao wrote:
> > Michael,
> > 
> > This is fixes for your pci tree.
> > 
> > patch 1 remove signed range as requested.
> 
> This also fixes make check failures so I applied this.
> 
> Others don't look like regressions to me -
> this is error handling in new functionality, correct?

Yes.


BTW, thre are two more problems:

1. if numa node number doesn't start from 0 then qemu will core dump.

cmd line:

./x86_64-softmmu/qemu-system-x86_64 -hda
/home/data/libvirt-images/f18.img  -m 128M,maxmem=2G,slots=3 -qmp
unix:/tmp/m,server,nowait -monitor stdio -enable-kvm -object
memory-backend-ram,id=m1,size=128M -numa node,nodeid=1,cpus=1,memdev=m1

This problem can be fixed by:


2. your current pci tree doesn't compile because patch 'qmp: add query-memdev' is dropped
while commit 5b517e74ed7825(hmp: add info memdev) depends on it. 

but patch 'qmp: add query-memdev' itself has a problem: if memory-backend-ram is on the command
line but no numa, info memdev returns nothing:

./x86_64-softmmu/qemu-system-x86_64 -hda /home/data/libvirt-images/f18.img  -m 128M,maxmem=2G,slots=3 -qmp unix:/tmp/m,server,nowait -monitor stdio -enable-kvm -object memory-backend-ram,id=m1,size=128M 
QEMU 2.0.50 monitor - type 'help' for more information
(qemu) info memdev
(nothing returned)

even worse, if with -numa mem=size then qemu will core dump:

./x86_64-softmmu/qemu-system-x86_64 -hda /home/data/libvirt-images/f18.img  -m 128M,maxmem=2G,slots=3 -qmp unix:/tmp/m,server,nowait -monitor stdio -enable-kvm -object memory-backend-ram,id=m1,size=128M -numa node,nodeid=0,cpus=0,mem=128M
(qemu) info memdev
Segmentation fault (core dumped)

this is because query_memdev searchs for memdev information in numa_info[].node_memdev,
which don't have value if there is no numa or numa isn't used with memory-backend-ram.

the solution can be gather memdevs in a list. Or query at /objects?

> Thus I'll wait for comments on these to be resolved,
> and hopefully for some acks.
> 
> > There are 3 problems in current pci tree, as follows:
> > 
> > 1. pc-dimm specified on command line but only -m size (aka not -m size,maxmem,slots)
> > 
> > ./x86_64-softmmu/qemu-system-x86_64 -hda
> > /home/data/libvirt-images/f18.img -smp 2 -object
> > memory-backend-ram,size=512M,id=ram-node0,prealloc=y,policy=bind,host-nodes=0
> > -device pc-dimm,id=d0,memdev=ram-node0  -m 640M  -qmp
> > unix:/tmp/m,server,nowait -monitor stdio -enable-kvm
> > 
> > result:
> > 
> > qemu/hw/mem/pc-dimm.c:110: pc_dimm_get_free_addr: Assertion
> > `address_space_end > address_space_size' failed.
> > Aborted (core dumped)
> > 
> > patch 2 fixes this.
> > 
> > 2. using qemu monitor command object-add to add a memory-backend-ram
> >    object whose's size is too big
> > 
> > ./x86_64-softmmu/qemu-system-x86_64 -hda
> > /home/data/libvirt-images/f18.img -smp 2 -m 512M  -qmp
> > unix:/tmp/m,server,nowait -monitor stdio -enable-kvm
> > 
> > in monitor:
> > (qemu)object_add memory-backend-ram,size=40960G,id=mem0
> > 
> > result:
> > 
> > qemu just exits with message: Cannot set up guest memory 'mem0': Cannot allocate memory
> > 
> > patch 3 fixes this.
> > 
> > 3. specifying a non-existing directory for memory-backend-file
> > 
> > ./x86_64-softmmu/qemu-system-x86_64 -hda
> > /home/data/libvirt-images/f18.img -smp 2 -m 512M,maxmem=1000G,slots=100
> > -qmp unix:/tmp/m,server,nowait -monitor stdio -enable-kvm -object
> > memory-backend-file,size=512M,id=mem0,mem-path=/nonexistingdir -device
> > pc-dimm,id=d0,memdev=mem0
> > 
> > result:
> > 
> > /nonexistingdir: No such file or directory
> > Bad ram offset fffffffffffff000
> > Aborted (core dumped)
> >  
> > patch 4 fixes this.
> > 
> > 
> > please review. Thanks!
> > 
> > 
> > Hu Tao (4):
> >   get rid of signed range
> >   check if we have space left for hotplugged memory
> >   exec: don't exit unconditionally if failed to allocate memory
> >   memory-backend-file: error out if failed to allocate memory
> > 
> >  backends/hostmem-file.c            |   3 +
> >  backends/hostmem-ram.c             |   3 +
> >  exec.c                             |   6 +-
> >  hw/mem/pc-dimm.c                   |   7 +-
> >  include/qemu/range.h               | 144 ++++++++++++-------------------------
> >  qapi/string-input-visitor.c        | 116 +++++++++++++++++-------------
> >  qapi/string-output-visitor.c       |  97 +++++++++++++------------
> >  tests/test-string-input-visitor.c  |   4 +-
> >  tests/test-string-output-visitor.c |   8 +--
> >  9 files changed, 182 insertions(+), 206 deletions(-)
> > 
> > -- 
> > 1.9.3

Comments

Michael S. Tsirkin June 16, 2014, 7:04 a.m. UTC | #1
On Mon, Jun 16, 2014 at 02:29:08PM +0800, Hu Tao wrote:
> On Sun, Jun 15, 2014 at 01:00:56PM +0300, Michael S. Tsirkin wrote:
> > On Sat, Jun 14, 2014 at 12:48:55PM +0800, Hu Tao wrote:
> > > Michael,
> > > 
> > > This is fixes for your pci tree.
> > > 
> > > patch 1 remove signed range as requested.
> > 
> > This also fixes make check failures so I applied this.
> > 
> > Others don't look like regressions to me -
> > this is error handling in new functionality, correct?
> 
> Yes.
> 
> 
> BTW, thre are two more problems:
> 
> 1. if numa node number doesn't start from 0 then qemu will core dump.
> 
> cmd line:
> 
> ./x86_64-softmmu/qemu-system-x86_64 -hda
> /home/data/libvirt-images/f18.img  -m 128M,maxmem=2G,slots=3 -qmp
> unix:/tmp/m,server,nowait -monitor stdio -enable-kvm -object
> memory-backend-ram,id=m1,size=128M -numa node,nodeid=1,cpus=1,memdev=m1
> 
> This problem can be fixed by:
> 
> diff --git a/numa.c b/numa.c
> index ce9382d..b00c5cf 100644
> --- a/numa.c
> +++ b/numa.c
> @@ -270,10 +270,13 @@ void memory_region_allocate_system_memory(MemoryRegion *mr, Obj
>      }
>  
>      memory_region_init(mr, owner, name, ram_size);
> -    for (i = 0; i < nb_numa_nodes; i++) {
> +    for (i = 0; i < MAX_NODES; i++) {
>          Error *local_err = NULL;
>          uint64_t size = numa_info[i].node_mem;
>          HostMemoryBackend *backend = numa_info[i].node_memdev;
> +        if (!backend) {
> +            continue;
> +        }
>          MemoryRegion *seg = host_memory_backend_get_memory(backend, &local_err);
>          if (local_err) {
>              qerror_report_err(local_err);
> 
> 2. your current pci tree doesn't compile because patch 'qmp: add query-memdev' is dropped
> while commit 5b517e74ed7825(hmp: add info memdev) depends on it. 

Hmm it builds for me.
Does it only build if some library is present?

> but patch 'qmp: add query-memdev' itself has a problem: if memory-backend-ram is on the command
> line but no numa, info memdev returns nothing:
> 
> ./x86_64-softmmu/qemu-system-x86_64 -hda /home/data/libvirt-images/f18.img  -m 128M,maxmem=2G,slots=3 -qmp unix:/tmp/m,server,nowait -monitor stdio -enable-kvm -object memory-backend-ram,id=m1,size=128M 
> QEMU 2.0.50 monitor - type 'help' for more information
> (qemu) info memdev
> (nothing returned)
> 
> even worse, if with -numa mem=size then qemu will core dump:
> 
> ./x86_64-softmmu/qemu-system-x86_64 -hda /home/data/libvirt-images/f18.img  -m 128M,maxmem=2G,slots=3 -qmp unix:/tmp/m,server,nowait -monitor stdio -enable-kvm -object memory-backend-ram,id=m1,size=128M -numa node,nodeid=0,cpus=0,mem=128M
> (qemu) info memdev
> Segmentation fault (core dumped)
> 
> this is because query_memdev searchs for memdev information in numa_info[].node_memdev,
> which don't have value if there is no numa or numa isn't used with memory-backend-ram.
> 
> the solution can be gather memdevs in a list. Or query at /objects?

query QOM seems nicer.

> > Thus I'll wait for comments on these to be resolved,
> > and hopefully for some acks.
> > 
> > > There are 3 problems in current pci tree, as follows:
> > > 
> > > 1. pc-dimm specified on command line but only -m size (aka not -m size,maxmem,slots)
> > > 
> > > ./x86_64-softmmu/qemu-system-x86_64 -hda
> > > /home/data/libvirt-images/f18.img -smp 2 -object
> > > memory-backend-ram,size=512M,id=ram-node0,prealloc=y,policy=bind,host-nodes=0
> > > -device pc-dimm,id=d0,memdev=ram-node0  -m 640M  -qmp
> > > unix:/tmp/m,server,nowait -monitor stdio -enable-kvm
> > > 
> > > result:
> > > 
> > > qemu/hw/mem/pc-dimm.c:110: pc_dimm_get_free_addr: Assertion
> > > `address_space_end > address_space_size' failed.
> > > Aborted (core dumped)
> > > 
> > > patch 2 fixes this.
> > > 
> > > 2. using qemu monitor command object-add to add a memory-backend-ram
> > >    object whose's size is too big
> > > 
> > > ./x86_64-softmmu/qemu-system-x86_64 -hda
> > > /home/data/libvirt-images/f18.img -smp 2 -m 512M  -qmp
> > > unix:/tmp/m,server,nowait -monitor stdio -enable-kvm
> > > 
> > > in monitor:
> > > (qemu)object_add memory-backend-ram,size=40960G,id=mem0
> > > 
> > > result:
> > > 
> > > qemu just exits with message: Cannot set up guest memory 'mem0': Cannot allocate memory
> > > 
> > > patch 3 fixes this.
> > > 
> > > 3. specifying a non-existing directory for memory-backend-file
> > > 
> > > ./x86_64-softmmu/qemu-system-x86_64 -hda
> > > /home/data/libvirt-images/f18.img -smp 2 -m 512M,maxmem=1000G,slots=100
> > > -qmp unix:/tmp/m,server,nowait -monitor stdio -enable-kvm -object
> > > memory-backend-file,size=512M,id=mem0,mem-path=/nonexistingdir -device
> > > pc-dimm,id=d0,memdev=mem0
> > > 
> > > result:
> > > 
> > > /nonexistingdir: No such file or directory
> > > Bad ram offset fffffffffffff000
> > > Aborted (core dumped)
> > >  
> > > patch 4 fixes this.
> > > 
> > > 
> > > please review. Thanks!
> > > 
> > > 
> > > Hu Tao (4):
> > >   get rid of signed range
> > >   check if we have space left for hotplugged memory
> > >   exec: don't exit unconditionally if failed to allocate memory
> > >   memory-backend-file: error out if failed to allocate memory
> > > 
> > >  backends/hostmem-file.c            |   3 +
> > >  backends/hostmem-ram.c             |   3 +
> > >  exec.c                             |   6 +-
> > >  hw/mem/pc-dimm.c                   |   7 +-
> > >  include/qemu/range.h               | 144 ++++++++++++-------------------------
> > >  qapi/string-input-visitor.c        | 116 +++++++++++++++++-------------
> > >  qapi/string-output-visitor.c       |  97 +++++++++++++------------
> > >  tests/test-string-input-visitor.c  |   4 +-
> > >  tests/test-string-output-visitor.c |   8 +--
> > >  9 files changed, 182 insertions(+), 206 deletions(-)
> > > 
> > > -- 
> > > 1.9.3
Hu Tao June 16, 2014, 8:28 a.m. UTC | #2
On Mon, Jun 16, 2014 at 10:04:21AM +0300, Michael S. Tsirkin wrote:
> On Mon, Jun 16, 2014 at 02:29:08PM +0800, Hu Tao wrote:
> > On Sun, Jun 15, 2014 at 01:00:56PM +0300, Michael S. Tsirkin wrote:
> > > On Sat, Jun 14, 2014 at 12:48:55PM +0800, Hu Tao wrote:
> > > > Michael,
> > > > 
> > > > This is fixes for your pci tree.
> > > > 
> > > > patch 1 remove signed range as requested.
> > > 
> > > This also fixes make check failures so I applied this.
> > > 
> > > Others don't look like regressions to me -
> > > this is error handling in new functionality, correct?
> > 
> > Yes.
> > 
> > 
> > BTW, thre are two more problems:
> > 
> > 1. if numa node number doesn't start from 0 then qemu will core dump.
> > 
> > cmd line:
> > 
> > ./x86_64-softmmu/qemu-system-x86_64 -hda
> > /home/data/libvirt-images/f18.img  -m 128M,maxmem=2G,slots=3 -qmp
> > unix:/tmp/m,server,nowait -monitor stdio -enable-kvm -object
> > memory-backend-ram,id=m1,size=128M -numa node,nodeid=1,cpus=1,memdev=m1
> > 
> > This problem can be fixed by:
> > 
> > diff --git a/numa.c b/numa.c
> > index ce9382d..b00c5cf 100644
> > --- a/numa.c
> > +++ b/numa.c
> > @@ -270,10 +270,13 @@ void memory_region_allocate_system_memory(MemoryRegion *mr, Obj
> >      }
> >  
> >      memory_region_init(mr, owner, name, ram_size);
> > -    for (i = 0; i < nb_numa_nodes; i++) {
> > +    for (i = 0; i < MAX_NODES; i++) {
> >          Error *local_err = NULL;
> >          uint64_t size = numa_info[i].node_mem;
> >          HostMemoryBackend *backend = numa_info[i].node_memdev;
> > +        if (!backend) {
> > +            continue;
> > +        }
> >          MemoryRegion *seg = host_memory_backend_get_memory(backend, &local_err);
> >          if (local_err) {
> >              qerror_report_err(local_err);
> > 
> > 2. your current pci tree doesn't compile because patch 'qmp: add query-memdev' is dropped
> > while commit 5b517e74ed7825(hmp: add info memdev) depends on it. 
> 
> Hmm it builds for me.
> Does it only build if some library is present?

No, it always builds.

Failed to build both on Fedora 17 and 20. My commandline to build:

../configure --target-list=x86_64-softmmu && make -j4

These are the error messages:

/mnt/data/kernel/qemu/hmp.c: In function ‘hmp_info_memdev’:
/mnt/data/kernel/qemu/hmp.c:1685:5: error: unknown type name ‘MemdevList’
/mnt/data/kernel/qemu/hmp.c:1685:5: error: implicit declaration of function ‘qmp_query_memdev’ [-Werror=implicit-function-declaration]
/mnt/data/kernel/qemu/hmp.c:1685:5: error: nested extern declaration of ‘qmp_query_memdev’ [-Werror=nested-externs]
/mnt/data/kernel/qemu/hmp.c:1685:31: error: initialization makes pointer from integer without a cast [-Werror]
/mnt/data/kernel/qemu/hmp.c:1686:5: error: unknown type name ‘MemdevList’
/mnt/data/kernel/qemu/hmp.c:1694:33: error: request for member ‘value’ in something not a structure or union
/mnt/data/kernel/qemu/hmp.c:1696:56: error: request for member ‘value’ in something not a structure or union
/mnt/data/kernel/qemu/hmp.c:1698:25: error: request for member ‘value’ in something not a structure or union
/mnt/data/kernel/qemu/hmp.c:1700:25: error: request for member ‘value’ in something not a structure or union
/mnt/data/kernel/qemu/hmp.c:1702:25: error: request for member ‘value’ in something not a structure or union
/mnt/data/kernel/qemu/hmp.c:1704:46: error: request for member ‘value’ in something not a structure or union
/mnt/data/kernel/qemu/hmp.c:1709:14: error: request for member ‘next’ in something not a structure or union
cc1: all warnings being treated as errors
make: *** [hmp.o] Error 1
diff mbox

Patch

diff --git a/numa.c b/numa.c
index ce9382d..b00c5cf 100644
--- a/numa.c
+++ b/numa.c
@@ -270,10 +270,13 @@  void memory_region_allocate_system_memory(MemoryRegion *mr, Obj
     }
 
     memory_region_init(mr, owner, name, ram_size);
-    for (i = 0; i < nb_numa_nodes; i++) {
+    for (i = 0; i < MAX_NODES; i++) {
         Error *local_err = NULL;
         uint64_t size = numa_info[i].node_mem;
         HostMemoryBackend *backend = numa_info[i].node_memdev;
+        if (!backend) {
+            continue;
+        }
         MemoryRegion *seg = host_memory_backend_get_memory(backend, &local_err);
         if (local_err) {
             qerror_report_err(local_err);