Re: [PATCH] acpi: Set maximum size to 64k for "etc/acpi/rsdp" blob

2023-01-31 Thread Feng Sun
Michael S. Tsirkin  于2023年1月30日周一 23:07写道:
>
> On Mon, Jan 30, 2023 at 10:47:25PM +0800, Feng Sun wrote:
> > Igor Mammedov  于2023年1月24日周二 18:30写道:
> > >
> > > On Tue, 17 Jan 2023 19:15:21 +0800
> > > Sun Feng  wrote:
> > >
> > > > Migrate from aarch64 host with PAGE_SIZE 64k to 4k failed with 
> > > > following errors:
> > > >
> > > > qmp_cmd_name: migrate-incoming, arguments: {"uri": "tcp:[::]:49152"}
> > > > {"timestamp": {"seconds": 1673922775, "microseconds": 534702}, "event": 
> > > > "MIGRATION", "data": {"status": "setup"}}
> > > > {"timestamp": {"seconds": 1673922776, "microseconds": 53003}, "event": 
> > > > "MIGRATION", "data": {"status": "active"}}
> > > > 2023-01-17T02:32:56.058827Z qemu-system-aarch64: Length too large: 
> > > > /rom@etc/acpi/rsdp: 0x1 > 0x1000: Invalid argument
> > >
> > > this should mention/explain why it's happening.
> > >
> > > i.e we now have 4k limit for RSDP, but then source somehow managed to 
> > > start with 64k
> > > allocated to for RSDP. It looks like limit isn't working as expected to 
> > > me.
> >
> > 4k limit should be romsize limit. I can see Rom '/rom@etc/acpi/rsdp'
> > with romsize:4096, datasize:36.
> > RAMBlock's used_length is set with datasize aligned to PAGE_SIZE, so
> > it become 64k when PAGE_SIZE is 64k.
> > ```
> > static
> > RAMBlock *qemu_ram_alloc_internal(ram_addr_t size, ram_addr_t max_size,
> >   void (*resized)(const char*,
> >   uint64_t length,
> >   void *host),
> >   void *host, uint32_t ram_flags,
> >   MemoryRegion *mr, Error **errp)
> > {
> > RAMBlock *new_block;
> > Error *local_err = NULL;
> >
> > assert((ram_flags & ~(RAM_SHARED | RAM_RESIZEABLE | RAM_PREALLOC |
> >   RAM_NORESERVE)) == 0);
> > assert(!host ^ (ram_flags & RAM_PREALLOC));
> >
> > size = HOST_PAGE_ALIGN(size);
> > max_size = HOST_PAGE_ALIGN(max_size);
> > new_block = g_malloc0(sizeof(*new_block));
> > new_block->mr = mr;
> > new_block->resized = resized;
> > new_block->used_length = size;
> > ```
> > So when migrate to 4k PAGE_SIZE, it will report the errors.
> >
> > ramblock information for PAGE_SIZE 64k and 4k.
> > ```
> > # getconf PAGE_SIZE
> > 65536
> > # virsh qemu-monitor-command testvm --hmp 'info ramblock'
> >   Block NamePSize  Offset
> > Used  Total
> >mach-virt.ram   64 KiB  0x
> > 0x4000 0x4000
> >  virt.flash0   64 KiB  0x4000
> > 0x0400 0x0400
> >  virt.flash1   64 KiB  0x4400
> > 0x0400 0x0400
> > /rom@etc/acpi/tables   64 KiB  0x4804
> > 0x0002 0x0020
> > :00:01.2:00.0/virtio-net-pci.rom   64 KiB  0x4800
> > 0x0004 0x0004
> >/rom@etc/table-loader   64 KiB  0x4824
> > 0x0001 0x0001
> >   /rom@etc/acpi/rsdp   64 KiB  0x4828
> > 0x0001 0x0001
> >
> > # getconf PAGE_SIZE
> > 4096
> > # virsh qemu-monitor-command testvm --hmp 'info ramblock'
> >   Block NamePSize  Offset
> > Used  Total
> >mach-virt.ram4 KiB  0x
> > 0x0008 0x0008
> >  virt.flash04 KiB  0x0008
> > 0x0400 0x0400
> >  virt.flash14 KiB  0x00080400
> > 0x0400 0x0400
> > /rom@etc/acpi/tables4 KiB  0x00080800
> > 0x0002 0x0020
> >/rom@etc/table-loader4 KiB  0x00080820
> > 0x1000 0x0001
> >   /rom@etc/acpi/rsdp4 KiB  0x00080824
> > 0x1000 0x1000
> > ```
>
> Oh interesting. I don't remember why I decided to align in.
> What does the following do (warning: completely untested):
>
>
> diff --git a/softmmu/physmem.c b/softmmu/physmem.c
> index cb998cdf23..5c732101b9 100644
> --- a/softmmu/physmem.c
> +++ b/softmmu/physmem.c
> @@ -2154,7 +2154,7 @@ RAMBlock *qemu_ram_alloc_internal(ram_addr_t size, 
> ram_addr_t max_size,
>RAM_NORESERVE)) == 0);
>  assert(!host ^ (ram_flags & RAM_PREALLOC));
>
> -size = HOST_PAGE_ALIGN(size);
> +// size = HOST_PAGE_ALIGN(size);
>  max_size = HOST_PAGE_ALIGN(max_size);
>  new_block = g_malloc0(sizeof(*new_block));
>  new_block->mr = mr;
>

With additional change we can see actually used size with 'info ramblock',

--- a/softmmu/physmem.c
+++ b/softmmu/physmem.c
@@ -1837,7 +1837,7 @@ int qemu_ram_resize(RAMBlock *block, ram_addr_t
newsize, Error **errp)

 assert(block);

-newsize = 

Re: [PATCH] acpi: Set maximum size to 64k for "etc/acpi/rsdp" blob

2023-01-30 Thread Michael S. Tsirkin
On Mon, Jan 30, 2023 at 10:47:25PM +0800, Feng Sun wrote:
> Igor Mammedov  于2023年1月24日周二 18:30写道:
> >
> > On Tue, 17 Jan 2023 19:15:21 +0800
> > Sun Feng  wrote:
> >
> > > Migrate from aarch64 host with PAGE_SIZE 64k to 4k failed with following 
> > > errors:
> > >
> > > qmp_cmd_name: migrate-incoming, arguments: {"uri": "tcp:[::]:49152"}
> > > {"timestamp": {"seconds": 1673922775, "microseconds": 534702}, "event": 
> > > "MIGRATION", "data": {"status": "setup"}}
> > > {"timestamp": {"seconds": 1673922776, "microseconds": 53003}, "event": 
> > > "MIGRATION", "data": {"status": "active"}}
> > > 2023-01-17T02:32:56.058827Z qemu-system-aarch64: Length too large: 
> > > /rom@etc/acpi/rsdp: 0x1 > 0x1000: Invalid argument
> >
> > this should mention/explain why it's happening.
> >
> > i.e we now have 4k limit for RSDP, but then source somehow managed to start 
> > with 64k
> > allocated to for RSDP. It looks like limit isn't working as expected to me.
> 
> 4k limit should be romsize limit. I can see Rom '/rom@etc/acpi/rsdp'
> with romsize:4096, datasize:36.
> RAMBlock's used_length is set with datasize aligned to PAGE_SIZE, so
> it become 64k when PAGE_SIZE is 64k.
> ```
> static
> RAMBlock *qemu_ram_alloc_internal(ram_addr_t size, ram_addr_t max_size,
>   void (*resized)(const char*,
>   uint64_t length,
>   void *host),
>   void *host, uint32_t ram_flags,
>   MemoryRegion *mr, Error **errp)
> {
> RAMBlock *new_block;
> Error *local_err = NULL;
> 
> assert((ram_flags & ~(RAM_SHARED | RAM_RESIZEABLE | RAM_PREALLOC |
>   RAM_NORESERVE)) == 0);
> assert(!host ^ (ram_flags & RAM_PREALLOC));
> 
> size = HOST_PAGE_ALIGN(size);
> max_size = HOST_PAGE_ALIGN(max_size);
> new_block = g_malloc0(sizeof(*new_block));
> new_block->mr = mr;
> new_block->resized = resized;
> new_block->used_length = size;
> ```
> So when migrate to 4k PAGE_SIZE, it will report the errors.
> 
> ramblock information for PAGE_SIZE 64k and 4k.
> ```
> # getconf PAGE_SIZE
> 65536
> # virsh qemu-monitor-command testvm --hmp 'info ramblock'
>   Block NamePSize  Offset
> Used  Total
>mach-virt.ram   64 KiB  0x
> 0x4000 0x4000
>  virt.flash0   64 KiB  0x4000
> 0x0400 0x0400
>  virt.flash1   64 KiB  0x4400
> 0x0400 0x0400
> /rom@etc/acpi/tables   64 KiB  0x4804
> 0x0002 0x0020
> :00:01.2:00.0/virtio-net-pci.rom   64 KiB  0x4800
> 0x0004 0x0004
>/rom@etc/table-loader   64 KiB  0x4824
> 0x0001 0x0001
>   /rom@etc/acpi/rsdp   64 KiB  0x4828
> 0x0001 0x0001
> 
> # getconf PAGE_SIZE
> 4096
> # virsh qemu-monitor-command testvm --hmp 'info ramblock'
>   Block NamePSize  Offset
> Used  Total
>mach-virt.ram4 KiB  0x
> 0x0008 0x0008
>  virt.flash04 KiB  0x0008
> 0x0400 0x0400
>  virt.flash14 KiB  0x00080400
> 0x0400 0x0400
> /rom@etc/acpi/tables4 KiB  0x00080800
> 0x0002 0x0020
>/rom@etc/table-loader4 KiB  0x00080820
> 0x1000 0x0001
>   /rom@etc/acpi/rsdp4 KiB  0x00080824
> 0x1000 0x1000
> ```

Oh interesting. I don't remember why I decided to align in.
What does the following do (warning: completely untested):


diff --git a/softmmu/physmem.c b/softmmu/physmem.c
index cb998cdf23..5c732101b9 100644
--- a/softmmu/physmem.c
+++ b/softmmu/physmem.c
@@ -2154,7 +2154,7 @@ RAMBlock *qemu_ram_alloc_internal(ram_addr_t size, 
ram_addr_t max_size,
   RAM_NORESERVE)) == 0);
 assert(!host ^ (ram_flags & RAM_PREALLOC));
 
-size = HOST_PAGE_ALIGN(size);
+// size = HOST_PAGE_ALIGN(size);
 max_size = HOST_PAGE_ALIGN(max_size);
 new_block = g_malloc0(sizeof(*new_block));
 new_block->mr = mr;




Re: [PATCH] acpi: Set maximum size to 64k for "etc/acpi/rsdp" blob

2023-01-30 Thread Feng Sun
Igor Mammedov  于2023年1月24日周二 18:30写道:
>
> On Tue, 17 Jan 2023 19:15:21 +0800
> Sun Feng  wrote:
>
> > Migrate from aarch64 host with PAGE_SIZE 64k to 4k failed with following 
> > errors:
> >
> > qmp_cmd_name: migrate-incoming, arguments: {"uri": "tcp:[::]:49152"}
> > {"timestamp": {"seconds": 1673922775, "microseconds": 534702}, "event": 
> > "MIGRATION", "data": {"status": "setup"}}
> > {"timestamp": {"seconds": 1673922776, "microseconds": 53003}, "event": 
> > "MIGRATION", "data": {"status": "active"}}
> > 2023-01-17T02:32:56.058827Z qemu-system-aarch64: Length too large: 
> > /rom@etc/acpi/rsdp: 0x1 > 0x1000: Invalid argument
>
> this should mention/explain why it's happening.
>
> i.e we now have 4k limit for RSDP, but then source somehow managed to start 
> with 64k
> allocated to for RSDP. It looks like limit isn't working as expected to me.

4k limit should be romsize limit. I can see Rom '/rom@etc/acpi/rsdp'
with romsize:4096, datasize:36.
RAMBlock's used_length is set with datasize aligned to PAGE_SIZE, so
it become 64k when PAGE_SIZE is 64k.
```
static
RAMBlock *qemu_ram_alloc_internal(ram_addr_t size, ram_addr_t max_size,
  void (*resized)(const char*,
  uint64_t length,
  void *host),
  void *host, uint32_t ram_flags,
  MemoryRegion *mr, Error **errp)
{
RAMBlock *new_block;
Error *local_err = NULL;

assert((ram_flags & ~(RAM_SHARED | RAM_RESIZEABLE | RAM_PREALLOC |
  RAM_NORESERVE)) == 0);
assert(!host ^ (ram_flags & RAM_PREALLOC));

size = HOST_PAGE_ALIGN(size);
max_size = HOST_PAGE_ALIGN(max_size);
new_block = g_malloc0(sizeof(*new_block));
new_block->mr = mr;
new_block->resized = resized;
new_block->used_length = size;
```
So when migrate to 4k PAGE_SIZE, it will report the errors.

ramblock information for PAGE_SIZE 64k and 4k.
```
# getconf PAGE_SIZE
65536
# virsh qemu-monitor-command testvm --hmp 'info ramblock'
  Block NamePSize  Offset
Used  Total
   mach-virt.ram   64 KiB  0x
0x4000 0x4000
 virt.flash0   64 KiB  0x4000
0x0400 0x0400
 virt.flash1   64 KiB  0x4400
0x0400 0x0400
/rom@etc/acpi/tables   64 KiB  0x4804
0x0002 0x0020
:00:01.2:00.0/virtio-net-pci.rom   64 KiB  0x4800
0x0004 0x0004
   /rom@etc/table-loader   64 KiB  0x4824
0x0001 0x0001
  /rom@etc/acpi/rsdp   64 KiB  0x4828
0x0001 0x0001

# getconf PAGE_SIZE
4096
# virsh qemu-monitor-command testvm --hmp 'info ramblock'
  Block NamePSize  Offset
Used  Total
   mach-virt.ram4 KiB  0x
0x0008 0x0008
 virt.flash04 KiB  0x0008
0x0400 0x0400
 virt.flash14 KiB  0x00080400
0x0400 0x0400
/rom@etc/acpi/tables4 KiB  0x00080800
0x0002 0x0020
   /rom@etc/table-loader4 KiB  0x00080820
0x1000 0x0001
  /rom@etc/acpi/rsdp4 KiB  0x00080824
0x1000 0x1000
```

-- 
Best wishes!



Re: [PATCH] acpi: Set maximum size to 64k for "etc/acpi/rsdp" blob

2023-01-24 Thread Igor Mammedov
On Tue, 17 Jan 2023 19:15:21 +0800
Sun Feng  wrote:

> Migrate from aarch64 host with PAGE_SIZE 64k to 4k failed with following 
> errors:
> 
> qmp_cmd_name: migrate-incoming, arguments: {"uri": "tcp:[::]:49152"}
> {"timestamp": {"seconds": 1673922775, "microseconds": 534702}, "event": 
> "MIGRATION", "data": {"status": "setup"}}
> {"timestamp": {"seconds": 1673922776, "microseconds": 53003}, "event": 
> "MIGRATION", "data": {"status": "active"}}
> 2023-01-17T02:32:56.058827Z qemu-system-aarch64: Length too large: 
> /rom@etc/acpi/rsdp: 0x1 > 0x1000: Invalid argument

this should mention/explain why it's happening.

i.e we now have 4k limit for RSDP, but then source somehow managed to start 
with 64k
allocated to for RSDP. It looks like limit isn't working as expected to me.

> 2023-01-17T02:32:56.058832Z qemu-system-aarch64: error while loading state 
> for instance 0x0 of device 'ram'
> 2023-01-17T02:32:56.059236Z qemu-system-aarch64: load of migration failed: 
> Invalid argument
> {"timestamp": {"seconds": 1673922776, "microseconds": 59248}, "event": 
> "MIGRATION", "data": {"status": "failed"}}
> 2023-01-17 02:32:56.306+: shutting down, reason=failed
> 
> refer to the following commit, set blob "etc/acpi/rsdp" maximum size to 64k 
> works.
> 
> 5033728 acpi: Set proper maximum size for "etc/acpi/rsdp" blob
> 6c2b24d acpi: Set proper maximum size for "etc/table-loader" blob
> 
> Signed-off-by: Sun Feng 
> ---
>  hw/acpi/utils.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/hw/acpi/utils.c b/hw/acpi/utils.c
> index 0c486ea..85f6ff3 100644
> --- a/hw/acpi/utils.c
> +++ b/hw/acpi/utils.c
> @@ -37,7 +37,7 @@ MemoryRegion *acpi_add_rom_blob(FWCfgCallback update, void 
> *opaque,
>  } else if (!strcmp(name, ACPI_BUILD_LOADER_FILE)) {
>  max_size = 0x1;
>  } else if (!strcmp(name, ACPI_BUILD_RSDP_FILE)) {
> -max_size = 0x1000;
> +max_size = 0x1;
>  } else {
>  g_assert_not_reached();
>  }




[PATCH] acpi: Set maximum size to 64k for "etc/acpi/rsdp" blob

2023-01-17 Thread Sun Feng
Migrate from aarch64 host with PAGE_SIZE 64k to 4k failed with following errors:

qmp_cmd_name: migrate-incoming, arguments: {"uri": "tcp:[::]:49152"}
{"timestamp": {"seconds": 1673922775, "microseconds": 534702}, "event": 
"MIGRATION", "data": {"status": "setup"}}
{"timestamp": {"seconds": 1673922776, "microseconds": 53003}, "event": 
"MIGRATION", "data": {"status": "active"}}
2023-01-17T02:32:56.058827Z qemu-system-aarch64: Length too large: 
/rom@etc/acpi/rsdp: 0x1 > 0x1000: Invalid argument
2023-01-17T02:32:56.058832Z qemu-system-aarch64: error while loading state for 
instance 0x0 of device 'ram'
2023-01-17T02:32:56.059236Z qemu-system-aarch64: load of migration failed: 
Invalid argument
{"timestamp": {"seconds": 1673922776, "microseconds": 59248}, "event": 
"MIGRATION", "data": {"status": "failed"}}
2023-01-17 02:32:56.306+: shutting down, reason=failed

refer to the following commit, set blob "etc/acpi/rsdp" maximum size to 64k 
works.

5033728 acpi: Set proper maximum size for "etc/acpi/rsdp" blob
6c2b24d acpi: Set proper maximum size for "etc/table-loader" blob

Signed-off-by: Sun Feng 
---
 hw/acpi/utils.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/hw/acpi/utils.c b/hw/acpi/utils.c
index 0c486ea..85f6ff3 100644
--- a/hw/acpi/utils.c
+++ b/hw/acpi/utils.c
@@ -37,7 +37,7 @@ MemoryRegion *acpi_add_rom_blob(FWCfgCallback update, void 
*opaque,
 } else if (!strcmp(name, ACPI_BUILD_LOADER_FILE)) {
 max_size = 0x1;
 } else if (!strcmp(name, ACPI_BUILD_RSDP_FILE)) {
-max_size = 0x1000;
+max_size = 0x1;
 } else {
 g_assert_not_reached();
 }
-- 
2.7.4