Re: [PATCH v2 08/21] memory: Add Error** argument to .log_global*() handlers

2024-03-04 Thread Cédric Le Goater

Hello Peter,

I missed this email last week, so I might not have addressed your
comments. sorry about that.


On 2/29/24 06:29, Peter Xu wrote:

On Tue, Feb 27, 2024 at 07:03:32PM +0100, Cédric Le Goater wrote:

Modify all log_global*() handlers to take an Error** parameter and
return a bool. A new MEMORY_LISTENER_CALL_LOG_GLOBAL macro looping on
the listeners is introduced to handle a possible error, which will
would interrupt the loop if necessary.

To be noted a change in memory_global_dirty_log_start() behavior as it
will return as soon as an error is detected.

Cc: Stefano Stabellini 
Cc: Anthony Perard 
Cc: Paul Durrant 
Cc: Michael S. Tsirkin 
Cc: Paolo Bonzini 
Cc: David Hildenbrand 
Signed-off-by: Cédric Le Goater 
---
  include/exec/memory.h | 15 ++--
  hw/i386/xen/xen-hvm.c |  6 ++--
  hw/vfio/common.c  |  8 +++--
  hw/virtio/vhost.c |  6 ++--
  system/memory.c   | 83 +--
  system/physmem.c  |  5 +--
  6 files changed, 101 insertions(+), 22 deletions(-)

diff --git a/include/exec/memory.h b/include/exec/memory.h
index 
8626a355b310ed7b1a1db7978ba4b394032c2f15..4bc146c5ebdd377cd14a4e462f32cc945db5a0a8
 100644
--- a/include/exec/memory.h
+++ b/include/exec/memory.h
@@ -998,8 +998,11 @@ struct MemoryListener {
   * active at that time.
   *
   * @listener: The #MemoryListener.
+ * @errp: pointer to Error*, to store an error if it happens.
+ *
+ * Return: true on success, else false setting @errp with error.
   */
-void (*log_global_start)(MemoryListener *listener);
+bool (*log_global_start)(MemoryListener *listener, Error **errp);
  
  /**

   * @log_global_stop:
@@ -1009,8 +1012,11 @@ struct MemoryListener {
   * the address space.
   *
   * @listener: The #MemoryListener.
+ * @errp: pointer to Error*, to store an error if it happens.
+ *
+ * Return: true on success, else false setting @errp with error.
   */
-void (*log_global_stop)(MemoryListener *listener);
+bool (*log_global_stop)(MemoryListener *listener, Error **errp);
  
  /**

   * @log_global_after_sync:
@@ -1019,8 +1025,11 @@ struct MemoryListener {
   * for any #MemoryRegionSection.
   *
   * @listener: The #MemoryListener.
+ * @errp: pointer to Error*, to store an error if it happens.
+ *
+ * Return: true on success, else false setting @errp with error.
   */
-void (*log_global_after_sync)(MemoryListener *listener);
+bool (*log_global_after_sync)(MemoryListener *listener, Error **errp);
  
  /**

   * @eventfd_add:
diff --git a/hw/i386/xen/xen-hvm.c b/hw/i386/xen/xen-hvm.c
index 
f42621e6742552035122ea58092c91c3458338ff..925a207b494b4eed52d5f360b554f18ac8a9806d
 100644
--- a/hw/i386/xen/xen-hvm.c
+++ b/hw/i386/xen/xen-hvm.c
@@ -446,16 +446,18 @@ static void xen_log_sync(MemoryListener *listener, 
MemoryRegionSection *section)
int128_get64(section->size));
  }
  
-static void xen_log_global_start(MemoryListener *listener)

+static bool xen_log_global_start(MemoryListener *listener, Error **errp)
  {
  if (xen_enabled()) {
  xen_in_migration = true;
  }
+return true;
  }
  
-static void xen_log_global_stop(MemoryListener *listener)

+static bool xen_log_global_stop(MemoryListener *listener, Error **errp)
  {
  xen_in_migration = false;
+return true;
  }
  
  static const MemoryListener xen_memory_listener = {

diff --git a/hw/vfio/common.c b/hw/vfio/common.c
index 
059bfdc07a85e2eb908df828c1f42104d683e911..8bba95ba6a2010b78cae54c6905857686bbb6309
 100644
--- a/hw/vfio/common.c
+++ b/hw/vfio/common.c
@@ -1075,7 +1075,8 @@ out:
  return ret;
  }
  
-static void vfio_listener_log_global_start(MemoryListener *listener)

+static bool vfio_listener_log_global_start(MemoryListener *listener,
+   Error **errp)
  {
  VFIOContainerBase *bcontainer = container_of(listener, VFIOContainerBase,
   listener);
@@ -1092,9 +1093,11 @@ static void 
vfio_listener_log_global_start(MemoryListener *listener)
   ret, strerror(-ret));
  vfio_set_migration_error(ret);
  }
+return !!ret;
  }
  
-static void vfio_listener_log_global_stop(MemoryListener *listener)

+static bool vfio_listener_log_global_stop(MemoryListener *listener,
+  Error **errp)
  {
  VFIOContainerBase *bcontainer = container_of(listener, VFIOContainerBase,
   listener);
@@ -,6 +1114,7 @@ static void vfio_listener_log_global_stop(MemoryListener 
*listener)
   ret, strerror(-ret));
  vfio_set_migration_error(ret);
  }
+return !!ret;
  }


Shouldn't both of these be "return !ret"?


Indeed. It went unnoticed because the return value is not tested when the
memory macros 

Re: [PATCH v2 08/21] memory: Add Error** argument to .log_global*() handlers

2024-02-28 Thread Peter Xu
On Tue, Feb 27, 2024 at 07:03:32PM +0100, Cédric Le Goater wrote:
> Modify all log_global*() handlers to take an Error** parameter and
> return a bool. A new MEMORY_LISTENER_CALL_LOG_GLOBAL macro looping on
> the listeners is introduced to handle a possible error, which will
> would interrupt the loop if necessary.
> 
> To be noted a change in memory_global_dirty_log_start() behavior as it
> will return as soon as an error is detected.
> 
> Cc: Stefano Stabellini 
> Cc: Anthony Perard 
> Cc: Paul Durrant 
> Cc: Michael S. Tsirkin 
> Cc: Paolo Bonzini 
> Cc: David Hildenbrand 
> Signed-off-by: Cédric Le Goater 
> ---
>  include/exec/memory.h | 15 ++--
>  hw/i386/xen/xen-hvm.c |  6 ++--
>  hw/vfio/common.c  |  8 +++--
>  hw/virtio/vhost.c |  6 ++--
>  system/memory.c   | 83 +--
>  system/physmem.c  |  5 +--
>  6 files changed, 101 insertions(+), 22 deletions(-)
> 
> diff --git a/include/exec/memory.h b/include/exec/memory.h
> index 
> 8626a355b310ed7b1a1db7978ba4b394032c2f15..4bc146c5ebdd377cd14a4e462f32cc945db5a0a8
>  100644
> --- a/include/exec/memory.h
> +++ b/include/exec/memory.h
> @@ -998,8 +998,11 @@ struct MemoryListener {
>   * active at that time.
>   *
>   * @listener: The #MemoryListener.
> + * @errp: pointer to Error*, to store an error if it happens.
> + *
> + * Return: true on success, else false setting @errp with error.
>   */
> -void (*log_global_start)(MemoryListener *listener);
> +bool (*log_global_start)(MemoryListener *listener, Error **errp);
>  
>  /**
>   * @log_global_stop:
> @@ -1009,8 +1012,11 @@ struct MemoryListener {
>   * the address space.
>   *
>   * @listener: The #MemoryListener.
> + * @errp: pointer to Error*, to store an error if it happens.
> + *
> + * Return: true on success, else false setting @errp with error.
>   */
> -void (*log_global_stop)(MemoryListener *listener);
> +bool (*log_global_stop)(MemoryListener *listener, Error **errp);
>  
>  /**
>   * @log_global_after_sync:
> @@ -1019,8 +1025,11 @@ struct MemoryListener {
>   * for any #MemoryRegionSection.
>   *
>   * @listener: The #MemoryListener.
> + * @errp: pointer to Error*, to store an error if it happens.
> + *
> + * Return: true on success, else false setting @errp with error.
>   */
> -void (*log_global_after_sync)(MemoryListener *listener);
> +bool (*log_global_after_sync)(MemoryListener *listener, Error **errp);
>  
>  /**
>   * @eventfd_add:
> diff --git a/hw/i386/xen/xen-hvm.c b/hw/i386/xen/xen-hvm.c
> index 
> f42621e6742552035122ea58092c91c3458338ff..925a207b494b4eed52d5f360b554f18ac8a9806d
>  100644
> --- a/hw/i386/xen/xen-hvm.c
> +++ b/hw/i386/xen/xen-hvm.c
> @@ -446,16 +446,18 @@ static void xen_log_sync(MemoryListener *listener, 
> MemoryRegionSection *section)
>int128_get64(section->size));
>  }
>  
> -static void xen_log_global_start(MemoryListener *listener)
> +static bool xen_log_global_start(MemoryListener *listener, Error **errp)
>  {
>  if (xen_enabled()) {
>  xen_in_migration = true;
>  }
> +return true;
>  }
>  
> -static void xen_log_global_stop(MemoryListener *listener)
> +static bool xen_log_global_stop(MemoryListener *listener, Error **errp)
>  {
>  xen_in_migration = false;
> +return true;
>  }
>  
>  static const MemoryListener xen_memory_listener = {
> diff --git a/hw/vfio/common.c b/hw/vfio/common.c
> index 
> 059bfdc07a85e2eb908df828c1f42104d683e911..8bba95ba6a2010b78cae54c6905857686bbb6309
>  100644
> --- a/hw/vfio/common.c
> +++ b/hw/vfio/common.c
> @@ -1075,7 +1075,8 @@ out:
>  return ret;
>  }
>  
> -static void vfio_listener_log_global_start(MemoryListener *listener)
> +static bool vfio_listener_log_global_start(MemoryListener *listener,
> +   Error **errp)
>  {
>  VFIOContainerBase *bcontainer = container_of(listener, VFIOContainerBase,
>   listener);
> @@ -1092,9 +1093,11 @@ static void 
> vfio_listener_log_global_start(MemoryListener *listener)
>   ret, strerror(-ret));
>  vfio_set_migration_error(ret);
>  }
> +return !!ret;
>  }
>  
> -static void vfio_listener_log_global_stop(MemoryListener *listener)
> +static bool vfio_listener_log_global_stop(MemoryListener *listener,
> +  Error **errp)
>  {
>  VFIOContainerBase *bcontainer = container_of(listener, VFIOContainerBase,
>   listener);
> @@ -,6 +1114,7 @@ static void 
> vfio_listener_log_global_stop(MemoryListener *listener)
>   ret, strerror(-ret));
>  vfio_set_migration_error(ret);
>  }
> +return !!ret;
>  }

Shouldn't both of these be "return !ret"?

Besides, maybe it'll be easier to go with either:

  1) if to 

[PATCH v2 08/21] memory: Add Error** argument to .log_global*() handlers

2024-02-27 Thread Cédric Le Goater
Modify all log_global*() handlers to take an Error** parameter and
return a bool. A new MEMORY_LISTENER_CALL_LOG_GLOBAL macro looping on
the listeners is introduced to handle a possible error, which will
would interrupt the loop if necessary.

To be noted a change in memory_global_dirty_log_start() behavior as it
will return as soon as an error is detected.

Cc: Stefano Stabellini 
Cc: Anthony Perard 
Cc: Paul Durrant 
Cc: Michael S. Tsirkin 
Cc: Paolo Bonzini 
Cc: David Hildenbrand 
Signed-off-by: Cédric Le Goater 
---
 include/exec/memory.h | 15 ++--
 hw/i386/xen/xen-hvm.c |  6 ++--
 hw/vfio/common.c  |  8 +++--
 hw/virtio/vhost.c |  6 ++--
 system/memory.c   | 83 +--
 system/physmem.c  |  5 +--
 6 files changed, 101 insertions(+), 22 deletions(-)

diff --git a/include/exec/memory.h b/include/exec/memory.h
index 
8626a355b310ed7b1a1db7978ba4b394032c2f15..4bc146c5ebdd377cd14a4e462f32cc945db5a0a8
 100644
--- a/include/exec/memory.h
+++ b/include/exec/memory.h
@@ -998,8 +998,11 @@ struct MemoryListener {
  * active at that time.
  *
  * @listener: The #MemoryListener.
+ * @errp: pointer to Error*, to store an error if it happens.
+ *
+ * Return: true on success, else false setting @errp with error.
  */
-void (*log_global_start)(MemoryListener *listener);
+bool (*log_global_start)(MemoryListener *listener, Error **errp);
 
 /**
  * @log_global_stop:
@@ -1009,8 +1012,11 @@ struct MemoryListener {
  * the address space.
  *
  * @listener: The #MemoryListener.
+ * @errp: pointer to Error*, to store an error if it happens.
+ *
+ * Return: true on success, else false setting @errp with error.
  */
-void (*log_global_stop)(MemoryListener *listener);
+bool (*log_global_stop)(MemoryListener *listener, Error **errp);
 
 /**
  * @log_global_after_sync:
@@ -1019,8 +1025,11 @@ struct MemoryListener {
  * for any #MemoryRegionSection.
  *
  * @listener: The #MemoryListener.
+ * @errp: pointer to Error*, to store an error if it happens.
+ *
+ * Return: true on success, else false setting @errp with error.
  */
-void (*log_global_after_sync)(MemoryListener *listener);
+bool (*log_global_after_sync)(MemoryListener *listener, Error **errp);
 
 /**
  * @eventfd_add:
diff --git a/hw/i386/xen/xen-hvm.c b/hw/i386/xen/xen-hvm.c
index 
f42621e6742552035122ea58092c91c3458338ff..925a207b494b4eed52d5f360b554f18ac8a9806d
 100644
--- a/hw/i386/xen/xen-hvm.c
+++ b/hw/i386/xen/xen-hvm.c
@@ -446,16 +446,18 @@ static void xen_log_sync(MemoryListener *listener, 
MemoryRegionSection *section)
   int128_get64(section->size));
 }
 
-static void xen_log_global_start(MemoryListener *listener)
+static bool xen_log_global_start(MemoryListener *listener, Error **errp)
 {
 if (xen_enabled()) {
 xen_in_migration = true;
 }
+return true;
 }
 
-static void xen_log_global_stop(MemoryListener *listener)
+static bool xen_log_global_stop(MemoryListener *listener, Error **errp)
 {
 xen_in_migration = false;
+return true;
 }
 
 static const MemoryListener xen_memory_listener = {
diff --git a/hw/vfio/common.c b/hw/vfio/common.c
index 
059bfdc07a85e2eb908df828c1f42104d683e911..8bba95ba6a2010b78cae54c6905857686bbb6309
 100644
--- a/hw/vfio/common.c
+++ b/hw/vfio/common.c
@@ -1075,7 +1075,8 @@ out:
 return ret;
 }
 
-static void vfio_listener_log_global_start(MemoryListener *listener)
+static bool vfio_listener_log_global_start(MemoryListener *listener,
+   Error **errp)
 {
 VFIOContainerBase *bcontainer = container_of(listener, VFIOContainerBase,
  listener);
@@ -1092,9 +1093,11 @@ static void 
vfio_listener_log_global_start(MemoryListener *listener)
  ret, strerror(-ret));
 vfio_set_migration_error(ret);
 }
+return !!ret;
 }
 
-static void vfio_listener_log_global_stop(MemoryListener *listener)
+static bool vfio_listener_log_global_stop(MemoryListener *listener,
+  Error **errp)
 {
 VFIOContainerBase *bcontainer = container_of(listener, VFIOContainerBase,
  listener);
@@ -,6 +1114,7 @@ static void vfio_listener_log_global_stop(MemoryListener 
*listener)
  ret, strerror(-ret));
 vfio_set_migration_error(ret);
 }
+return !!ret;
 }
 
 static int vfio_device_dma_logging_report(VFIODevice *vbasedev, hwaddr iova,
diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c
index 
2c9ac794680ea9b65eba6cc22e70cf141e90aa73..7a555f941934991a72a2817e5505fe0ce6d6fc64
 100644
--- a/hw/virtio/vhost.c
+++ b/hw/virtio/vhost.c
@@ -1044,7 +1044,7 @@ check_dev_state:
 return r;
 }
 
-static void vhost_log_global_start(MemoryListener *listener)
+static bool