Re: [PATCH v2] virtio_balloon: Fix endless deflation and inflation on arm64

2023-10-02 Thread Michael S. Tsirkin
On Mon, Oct 02, 2023 at 01:50:45PM +0200, David Hildenbrand wrote:
> On 25.09.23 01:58, Gavin Shan wrote:
> > Hi David and Michael,
> > 
> > On 8/31/23 11:10, Gavin Shan wrote:
> > > The deflation request to the target, which isn't unaligned to the
> > > guest page size causes endless deflation and inflation actions. For
> > > example, we receive the flooding QMP events for the changes on memory
> > > balloon's size after a deflation request to the unaligned target is
> > > sent for the ARM64 guest, where we have 64KB base page size.
> > > 
> > > /home/gavin/sandbox/qemu.main/build/qemu-system-aarch64  \
> > > -accel kvm -machine virt,gic-version=host -cpu host  \
> > > -smp maxcpus=8,cpus=8,sockets=2,clusters=2,cores=2,threads=1 \
> > > -m 1024M,slots=16,maxmem=64G \
> > > -object memory-backend-ram,id=mem0,size=512M \
> > > -object memory-backend-ram,id=mem1,size=512M \
> > > -numa node,nodeid=0,memdev=mem0,cpus=0-3 \
> > > -numa node,nodeid=1,memdev=mem1,cpus=4-7 \
> > >   :  \
> > > -device virtio-balloon-pci,id=balloon0,bus=pcie.10
> > > 
> > > { "execute" : "balloon", "arguments": { "value" : 1073672192 } }
> > > {"return": {}}
> > > {"timestamp": {"seconds": 1693272173, "microseconds": 88667},   \
> > >  "event": "BALLOON_CHANGE", "data": {"actual": 1073610752}}
> > > {"timestamp": {"seconds": 1693272174, "microseconds": 89704},   \
> > >  "event": "BALLOON_CHANGE", "data": {"actual": 1073610752}}
> > > {"timestamp": {"seconds": 1693272175, "microseconds": 90819},   \
> > >  "event": "BALLOON_CHANGE", "data": {"actual": 1073610752}}
> > > {"timestamp": {"seconds": 1693272176, "microseconds": 91961},   \
> > >  "event": "BALLOON_CHANGE", "data": {"actual": 1073610752}}
> > > {"timestamp": {"seconds": 1693272177, "microseconds": 93040},   \
> > >  "event": "BALLOON_CHANGE", "data": {"actual": 1073676288}}
> > > {"timestamp": {"seconds": 1693272178, "microseconds": 94117},   \
> > >  "event": "BALLOON_CHANGE", "data": {"actual": 1073676288}}
> > > {"timestamp": {"seconds": 1693272179, "microseconds": 95337},   \
> > >  "event": "BALLOON_CHANGE", "data": {"actual": 1073610752}}
> > > {"timestamp": {"seconds": 1693272180, "microseconds": 96615},   \
> > >  "event": "BALLOON_CHANGE", "data": {"actual": 1073676288}}
> > > {"timestamp": {"seconds": 1693272181, "microseconds": 97626},   \
> > >  "event": "BALLOON_CHANGE", "data": {"actual": 1073610752}}
> > > {"timestamp": {"seconds": 1693272182, "microseconds": 98693},   \
> > >  "event": "BALLOON_CHANGE", "data": {"actual": 1073676288}}
> > > {"timestamp": {"seconds": 1693272183, "microseconds": 99698},   \
> > >  "event": "BALLOON_CHANGE", "data": {"actual": 1073610752}}
> > > {"timestamp": {"seconds": 1693272184, "microseconds": 100727},  \
> > >  "event": "BALLOON_CHANGE", "data": {"actual": 1073610752}}
> > > {"timestamp": {"seconds": 1693272185, "microseconds": 90430},   \
> > >  "event": "BALLOON_CHANGE", "data": {"actual": 1073610752}}
> > > {"timestamp": {"seconds": 1693272186, "microseconds": 102999},  \
> > >  "event": "BALLOON_CHANGE", "data": {"actual": 1073676288}}
> > >:
> > > 
> > > 
> > > Fix it by aligning the target up to the guest page size, 64KB in this
> > > specific case. With this applied, no flooding QMP events are observed
> > > and the memory balloon's size can be stablizied to 0x3ffe soon
> > > after the deflation request is sent.
> > > 
> > > { "execute" : "balloon", "arguments": { "value" : 1073672192 } }
> > > {"return": {}}
> > > {"timestamp": {"seconds": 1693273328, "microseconds": 793075},  \
> > >  "event": "BALLOON_CHANGE", "data": {"actual": 1073610752}}
> > > { "execute" : "query-balloon" }
> > > {"return": {"actual": 1073610752}}
> > > 
> > > Signed-off-by: Gavin Shan 
> > > Tested-by: Zhenyu Zhang 
> > > ---
> > > v2: Align @num_pages up to the guest page size in towards_target()
> > >   directly as David suggested.
> > > ---
> > >drivers/virtio/virtio_balloon.c | 6 +-
> > >1 file changed, 5 insertions(+), 1 deletion(-)
> > > 
> > 
> > If the patch looks good, could you please merge this to Linux 6.6.rc4 since
> > it's something needed by our downstream. I hope it can land upstream as 
> > early
> > as possible, thanks a lot.
> 
> @MST, I cannot spot it in your usual vhost git yet. Should I pick it up or
> what are your plans?

Yes - I merged it but I'm still testing my tree. Will be in
the next pull request.

___
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization


Re: [PATCH v2] virtio_balloon: Fix endless deflation and inflation on arm64

2023-10-02 Thread David Hildenbrand

On 25.09.23 01:58, Gavin Shan wrote:

Hi David and Michael,

On 8/31/23 11:10, Gavin Shan wrote:

The deflation request to the target, which isn't unaligned to the
guest page size causes endless deflation and inflation actions. For
example, we receive the flooding QMP events for the changes on memory
balloon's size after a deflation request to the unaligned target is
sent for the ARM64 guest, where we have 64KB base page size.

/home/gavin/sandbox/qemu.main/build/qemu-system-aarch64  \
-accel kvm -machine virt,gic-version=host -cpu host  \
-smp maxcpus=8,cpus=8,sockets=2,clusters=2,cores=2,threads=1 \
-m 1024M,slots=16,maxmem=64G \
-object memory-backend-ram,id=mem0,size=512M \
-object memory-backend-ram,id=mem1,size=512M \
-numa node,nodeid=0,memdev=mem0,cpus=0-3 \
-numa node,nodeid=1,memdev=mem1,cpus=4-7 \
  :  \
-device virtio-balloon-pci,id=balloon0,bus=pcie.10

{ "execute" : "balloon", "arguments": { "value" : 1073672192 } }
{"return": {}}
{"timestamp": {"seconds": 1693272173, "microseconds": 88667},   \
 "event": "BALLOON_CHANGE", "data": {"actual": 1073610752}}
{"timestamp": {"seconds": 1693272174, "microseconds": 89704},   \
 "event": "BALLOON_CHANGE", "data": {"actual": 1073610752}}
{"timestamp": {"seconds": 1693272175, "microseconds": 90819},   \
 "event": "BALLOON_CHANGE", "data": {"actual": 1073610752}}
{"timestamp": {"seconds": 1693272176, "microseconds": 91961},   \
 "event": "BALLOON_CHANGE", "data": {"actual": 1073610752}}
{"timestamp": {"seconds": 1693272177, "microseconds": 93040},   \
 "event": "BALLOON_CHANGE", "data": {"actual": 1073676288}}
{"timestamp": {"seconds": 1693272178, "microseconds": 94117},   \
 "event": "BALLOON_CHANGE", "data": {"actual": 1073676288}}
{"timestamp": {"seconds": 1693272179, "microseconds": 95337},   \
 "event": "BALLOON_CHANGE", "data": {"actual": 1073610752}}
{"timestamp": {"seconds": 1693272180, "microseconds": 96615},   \
 "event": "BALLOON_CHANGE", "data": {"actual": 1073676288}}
{"timestamp": {"seconds": 1693272181, "microseconds": 97626},   \
 "event": "BALLOON_CHANGE", "data": {"actual": 1073610752}}
{"timestamp": {"seconds": 1693272182, "microseconds": 98693},   \
 "event": "BALLOON_CHANGE", "data": {"actual": 1073676288}}
{"timestamp": {"seconds": 1693272183, "microseconds": 99698},   \
 "event": "BALLOON_CHANGE", "data": {"actual": 1073610752}}
{"timestamp": {"seconds": 1693272184, "microseconds": 100727},  \
 "event": "BALLOON_CHANGE", "data": {"actual": 1073610752}}
{"timestamp": {"seconds": 1693272185, "microseconds": 90430},   \
 "event": "BALLOON_CHANGE", "data": {"actual": 1073610752}}
{"timestamp": {"seconds": 1693272186, "microseconds": 102999},  \
 "event": "BALLOON_CHANGE", "data": {"actual": 1073676288}}
   :


Fix it by aligning the target up to the guest page size, 64KB in this
specific case. With this applied, no flooding QMP events are observed
and the memory balloon's size can be stablizied to 0x3ffe soon
after the deflation request is sent.

{ "execute" : "balloon", "arguments": { "value" : 1073672192 } }
{"return": {}}
{"timestamp": {"seconds": 1693273328, "microseconds": 793075},  \
 "event": "BALLOON_CHANGE", "data": {"actual": 1073610752}}
{ "execute" : "query-balloon" }
{"return": {"actual": 1073610752}}

Signed-off-by: Gavin Shan 
Tested-by: Zhenyu Zhang 
---
v2: Align @num_pages up to the guest page size in towards_target()
  directly as David suggested.
---
   drivers/virtio/virtio_balloon.c | 6 +-
   1 file changed, 5 insertions(+), 1 deletion(-)



If the patch looks good, could you please merge this to Linux 6.6.rc4 since
it's something needed by our downstream. I hope it can land upstream as early
as possible, thanks a lot.


@MST, I cannot spot it in your usual vhost git yet. Should I pick it up 
or what are your plans?


--
Cheers,

David / dhildenb

___
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization


Re: [PATCH v2] virtio_balloon: Fix endless deflation and inflation on arm64

2023-09-24 Thread Gavin Shan

Hi David and Michael,

On 8/31/23 11:10, Gavin Shan wrote:

The deflation request to the target, which isn't unaligned to the
guest page size causes endless deflation and inflation actions. For
example, we receive the flooding QMP events for the changes on memory
balloon's size after a deflation request to the unaligned target is
sent for the ARM64 guest, where we have 64KB base page size.

   /home/gavin/sandbox/qemu.main/build/qemu-system-aarch64  \
   -accel kvm -machine virt,gic-version=host -cpu host  \
   -smp maxcpus=8,cpus=8,sockets=2,clusters=2,cores=2,threads=1 \
   -m 1024M,slots=16,maxmem=64G \
   -object memory-backend-ram,id=mem0,size=512M \
   -object memory-backend-ram,id=mem1,size=512M \
   -numa node,nodeid=0,memdev=mem0,cpus=0-3 \
   -numa node,nodeid=1,memdev=mem1,cpus=4-7 \
 :  \
   -device virtio-balloon-pci,id=balloon0,bus=pcie.10

   { "execute" : "balloon", "arguments": { "value" : 1073672192 } }
   {"return": {}}
   {"timestamp": {"seconds": 1693272173, "microseconds": 88667},   \
"event": "BALLOON_CHANGE", "data": {"actual": 1073610752}}
   {"timestamp": {"seconds": 1693272174, "microseconds": 89704},   \
"event": "BALLOON_CHANGE", "data": {"actual": 1073610752}}
   {"timestamp": {"seconds": 1693272175, "microseconds": 90819},   \
"event": "BALLOON_CHANGE", "data": {"actual": 1073610752}}
   {"timestamp": {"seconds": 1693272176, "microseconds": 91961},   \
"event": "BALLOON_CHANGE", "data": {"actual": 1073610752}}
   {"timestamp": {"seconds": 1693272177, "microseconds": 93040},   \
"event": "BALLOON_CHANGE", "data": {"actual": 1073676288}}
   {"timestamp": {"seconds": 1693272178, "microseconds": 94117},   \
"event": "BALLOON_CHANGE", "data": {"actual": 1073676288}}
   {"timestamp": {"seconds": 1693272179, "microseconds": 95337},   \
"event": "BALLOON_CHANGE", "data": {"actual": 1073610752}}
   {"timestamp": {"seconds": 1693272180, "microseconds": 96615},   \
"event": "BALLOON_CHANGE", "data": {"actual": 1073676288}}
   {"timestamp": {"seconds": 1693272181, "microseconds": 97626},   \
"event": "BALLOON_CHANGE", "data": {"actual": 1073610752}}
   {"timestamp": {"seconds": 1693272182, "microseconds": 98693},   \
"event": "BALLOON_CHANGE", "data": {"actual": 1073676288}}
   {"timestamp": {"seconds": 1693272183, "microseconds": 99698},   \
"event": "BALLOON_CHANGE", "data": {"actual": 1073610752}}
   {"timestamp": {"seconds": 1693272184, "microseconds": 100727},  \
"event": "BALLOON_CHANGE", "data": {"actual": 1073610752}}
   {"timestamp": {"seconds": 1693272185, "microseconds": 90430},   \
"event": "BALLOON_CHANGE", "data": {"actual": 1073610752}}
   {"timestamp": {"seconds": 1693272186, "microseconds": 102999},  \
"event": "BALLOON_CHANGE", "data": {"actual": 1073676288}}
  :
   

Fix it by aligning the target up to the guest page size, 64KB in this
specific case. With this applied, no flooding QMP events are observed
and the memory balloon's size can be stablizied to 0x3ffe soon
after the deflation request is sent.

   { "execute" : "balloon", "arguments": { "value" : 1073672192 } }
   {"return": {}}
   {"timestamp": {"seconds": 1693273328, "microseconds": 793075},  \
"event": "BALLOON_CHANGE", "data": {"actual": 1073610752}}
   { "execute" : "query-balloon" }
   {"return": {"actual": 1073610752}}

Signed-off-by: Gavin Shan 
Tested-by: Zhenyu Zhang 
---
v2: Align @num_pages up to the guest page size in towards_target()
 directly as David suggested.
---
  drivers/virtio/virtio_balloon.c | 6 +-
  1 file changed, 5 insertions(+), 1 deletion(-)



If the patch looks good, could you please merge this to Linux 6.6.rc4 since
it's something needed by our downstream. I hope it can land upstream as early
as possible, thanks a lot.


diff --git a/drivers/virtio/virtio_balloon.c b/drivers/virtio/virtio_balloon.c
index 5b15936a5214..2d5d252ef419 100644
--- a/drivers/virtio/virtio_balloon.c
+++ b/drivers/virtio/virtio_balloon.c
@@ -395,7 +395,11 @@ static inline s64 towards_target(struct virtio_balloon *vb)
virtio_cread_le(vb->vdev, struct virtio_balloon_config, num_pages,
_pages);
  
-	target = num_pages;

+   /*
+* Aligned up to guest page size to avoid inflating and deflating
+* balloon endlessly.
+*/
+   target = ALIGN(num_pages, VIRTIO_BALLOON_PAGES_PER_PAGE);
return target - vb->num_pages;
  }
  


Thanks,
Gavin

___
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization


Re: [PATCH v2] virtio_balloon: Fix endless deflation and inflation on arm64

2023-08-31 Thread David Hildenbrand

On 31.08.23 03:10, Gavin Shan wrote:

The deflation request to the target, which isn't unaligned to the
guest page size causes endless deflation and inflation actions. For
example, we receive the flooding QMP events for the changes on memory
balloon's size after a deflation request to the unaligned target is
sent for the ARM64 guest, where we have 64KB base page size.

   /home/gavin/sandbox/qemu.main/build/qemu-system-aarch64  \
   -accel kvm -machine virt,gic-version=host -cpu host  \
   -smp maxcpus=8,cpus=8,sockets=2,clusters=2,cores=2,threads=1 \
   -m 1024M,slots=16,maxmem=64G \
   -object memory-backend-ram,id=mem0,size=512M \
   -object memory-backend-ram,id=mem1,size=512M \
   -numa node,nodeid=0,memdev=mem0,cpus=0-3 \
   -numa node,nodeid=1,memdev=mem1,cpus=4-7 \
 :  \
   -device virtio-balloon-pci,id=balloon0,bus=pcie.10

   { "execute" : "balloon", "arguments": { "value" : 1073672192 } }
   {"return": {}}
   {"timestamp": {"seconds": 1693272173, "microseconds": 88667},   \
"event": "BALLOON_CHANGE", "data": {"actual": 1073610752}}
   {"timestamp": {"seconds": 1693272174, "microseconds": 89704},   \
"event": "BALLOON_CHANGE", "data": {"actual": 1073610752}}
   {"timestamp": {"seconds": 1693272175, "microseconds": 90819},   \
"event": "BALLOON_CHANGE", "data": {"actual": 1073610752}}
   {"timestamp": {"seconds": 1693272176, "microseconds": 91961},   \
"event": "BALLOON_CHANGE", "data": {"actual": 1073610752}}
   {"timestamp": {"seconds": 1693272177, "microseconds": 93040},   \
"event": "BALLOON_CHANGE", "data": {"actual": 1073676288}}
   {"timestamp": {"seconds": 1693272178, "microseconds": 94117},   \
"event": "BALLOON_CHANGE", "data": {"actual": 1073676288}}
   {"timestamp": {"seconds": 1693272179, "microseconds": 95337},   \
"event": "BALLOON_CHANGE", "data": {"actual": 1073610752}}
   {"timestamp": {"seconds": 1693272180, "microseconds": 96615},   \
"event": "BALLOON_CHANGE", "data": {"actual": 1073676288}}
   {"timestamp": {"seconds": 1693272181, "microseconds": 97626},   \
"event": "BALLOON_CHANGE", "data": {"actual": 1073610752}}
   {"timestamp": {"seconds": 1693272182, "microseconds": 98693},   \
"event": "BALLOON_CHANGE", "data": {"actual": 1073676288}}
   {"timestamp": {"seconds": 1693272183, "microseconds": 99698},   \
"event": "BALLOON_CHANGE", "data": {"actual": 1073610752}}
   {"timestamp": {"seconds": 1693272184, "microseconds": 100727},  \
"event": "BALLOON_CHANGE", "data": {"actual": 1073610752}}
   {"timestamp": {"seconds": 1693272185, "microseconds": 90430},   \
"event": "BALLOON_CHANGE", "data": {"actual": 1073610752}}
   {"timestamp": {"seconds": 1693272186, "microseconds": 102999},  \
"event": "BALLOON_CHANGE", "data": {"actual": 1073676288}}
  :
   

Fix it by aligning the target up to the guest page size, 64KB in this
specific case. With this applied, no flooding QMP events are observed
and the memory balloon's size can be stablizied to 0x3ffe soon
after the deflation request is sent.

   { "execute" : "balloon", "arguments": { "value" : 1073672192 } }
   {"return": {}}
   {"timestamp": {"seconds": 1693273328, "microseconds": 793075},  \
"event": "BALLOON_CHANGE", "data": {"actual": 1073610752}}
   { "execute" : "query-balloon" }
   {"return": {"actual": 1073610752}}

Signed-off-by: Gavin Shan 
Tested-by: Zhenyu Zhang 
---
v2: Align @num_pages up to the guest page size in towards_target()
 directly as David suggested.
---
  drivers/virtio/virtio_balloon.c | 6 +-
  1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/drivers/virtio/virtio_balloon.c b/drivers/virtio/virtio_balloon.c
index 5b15936a5214..2d5d252ef419 100644
--- a/drivers/virtio/virtio_balloon.c
+++ b/drivers/virtio/virtio_balloon.c
@@ -395,7 +395,11 @@ static inline s64 towards_target(struct virtio_balloon *vb)
virtio_cread_le(vb->vdev, struct virtio_balloon_config, num_pages,
_pages);
  
-	target = num_pages;

+   /*
+* Aligned up to guest page size to avoid inflating and deflating
+* balloon endlessly.
+*/
+   target = ALIGN(num_pages, VIRTIO_BALLOON_PAGES_PER_PAGE);
return target - vb->num_pages;
  }
  


Thanks!

Reviewed-by: David Hildenbrand 

--
Cheers,

David / dhildenb

___
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization