> -----Original Message-----
> From: Nicolin Chen <[email protected]>
> Sent: 12 February 2026 06:52
> To: Eric Auger <[email protected]>
> Cc: Shameer Kolothum Thodi <[email protected]>; qemu-
> [email protected]; [email protected]; [email protected];
> Nathan Chen <[email protected]>; Matt Ochs <[email protected]>;
> Jiandi An <[email protected]>; Jason Gunthorpe <[email protected]>;
> [email protected]; [email protected];
> [email protected]; Krishnakant Jaju <[email protected]>
> Subject: Re: [PATCH v5 3/5] hw/arm/smmuv3-accel: Allocate vEVENTQ for
> accelerated SMMUv3 devices
> 
...
> > Usually error_append_hint() is used to append a user friendly msg that
> > helps the user to fix the problem.
> > In qapi/error.h there is an example that relates to "Receive and
> > accumulate multiple errors (first one wins):" by using
> > error_propagate()
> 
> I didn't look very closely but just run a grep for "append" :)
> 
> Yea, I think error_propagate() should work better.

I am not sure error_propagate makes things better though.

If I am not wrong, this is how the change will look like,

static MemTxResult smmu_writel(SMMUv3State *s, hwaddr offset,
                                uint64_t data, MemTxAttrs attrs)
 {
+    Error *err = NULL;
     Error *local_err = NULL;

     switch (offset) {
@@ -1614,9 +1616,15 @@ static MemTxResult smmu_writel(SMMUv3State *s, hwaddr 
offset,
         s->cr0ack = data & ~SMMU_CR0_RESERVED;
         /* in case the command queue has been enabled */
         smmuv3_cmdq_consume(s, &local_err);
+        if (local_err) {
+            error_propagate(&err, local_err);
+            local_err = NULL;
+        }
         /* Allocate vEVENTQ if EventQ is enabled and a vIOMMU is available */
-        if (local_err == NULL) {
-            smmuv3_accel_alloc_veventq(s, &local_err);
+        smmuv3_accel_alloc_veventq(s, &local_err);
+        if (local_err) {
+            error_propagate(&err, local_err);
+            local_err = NULL;
         }
         break;
     case A_CR1:
@@ -1724,8 +1732,8 @@ static MemTxResult smmu_writel(SMMUv3State *s, hwaddr 
offset,
         break;
     }

-    if (local_err) {
-        error_report_err(local_err);
+    if (err) {
+        error_report_err(err);
     }
     return MEMTX_OK;
 }

And error_propagate() only will keep the first error.

Instead, if we do below:

@@ -1614,10 +1615,12 @@ static MemTxResult smmu_writel(SMMUv3State *s, hwaddr 
offset,
         s->cr0ack = data & ~SMMU_CR0_RESERVED;
         /* in case the command queue has been enabled */
         smmuv3_cmdq_consume(s, &local_err);
-        /* Allocate vEVENTQ if EventQ is enabled and a vIOMMU is available */
-        if (local_err == NULL) {
-            smmuv3_accel_alloc_veventq(s, &local_err);
+        if (local_err) {
+            error_report_err(local_err);
+            local_err = NULL;
         }
+        /* Allocate vEVENTQ if EventQ is enabled and a vIOMMU is available */
+        smmuv3_accel_alloc_veventq(s, &local_err);
         break;

This will report errors from both paths.

Please let me know if there is a better way.

Thanks,
Shameer

Reply via email to