diff mbox

AMD IOMMU: correctly propagate errors from amd_iommu_init()

Message ID 575FE46D02000078000F4A8F@prv-mh.provo.novell.com (mailing list archive)
State New, archived
Headers show

Commit Message

Jan Beulich June 14, 2016, 9:03 a.m. UTC
... instead of using -ENODEV for any kind of error. It in particular
addresses Coverity ID 1362694 (introduced by commit eb48587210 ["AMD
IOMMU: introduce support for IVHD block type 11h"]).

Coverity ID: 1362694

Signed-off-by: Jan Beulich <jbeulich@suse.com>
AMD IOMMU: correctly propagate errors from amd_iommu_init()

... instead of using -ENODEV for any kind of error. It in particular
addresses Coverity ID 1362694 (introduced by commit eb48587210 ["AMD
IOMMU: introduce support for IVHD block type 11h"]).

Coverity ID: 1362694

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/drivers/passthrough/amd/iommu_init.c
+++ b/xen/drivers/passthrough/amd/iommu_init.c
@@ -1226,6 +1226,7 @@ static bool_t __init amd_sp5100_erratum2
 int __init amd_iommu_init(void)
 {
     struct amd_iommu *iommu;
+    int rc = -ENODEV;
 
     BUG_ON( !iommu_found() );
 
@@ -1237,28 +1238,39 @@ int __init amd_iommu_init(void)
     if ( unlikely(acpi_gbl_FADT.boot_flags & ACPI_FADT_NO_MSI) )
         goto error_out;
 
-    ivhd_type = amd_iommu_get_supported_ivhd_type();
-    if ( ivhd_type < 0 )
+    rc = amd_iommu_get_supported_ivhd_type();
+    if ( rc < 0 )
         goto error_out;
+    ivhd_type = rc;
 
-    ivrs_bdf_entries = amd_iommu_get_ivrs_dev_entries();
-    if ( !ivrs_bdf_entries )
+    rc = amd_iommu_get_ivrs_dev_entries();
+    if ( !rc )
+        rc = -ENODEV;
+    if ( rc < 0 )
         goto error_out;
+    ivrs_bdf_entries = rc;
 
     radix_tree_init(&ivrs_maps);
     for_each_amd_iommu ( iommu )
-        if ( alloc_ivrs_mappings(iommu->seg) != 0 )
+    {
+        rc = alloc_ivrs_mappings(iommu->seg);
+        if ( rc )
             goto error_out;
+    }
 
-    if ( amd_iommu_update_ivrs_mapping_acpi() != 0 )
+    rc = amd_iommu_update_ivrs_mapping_acpi();
+    if ( rc )
         goto error_out;
 
     /* initialize io-apic interrupt remapping entries */
-    if ( iommu_intremap && amd_iommu_setup_ioapic_remapping() != 0 )
+    if ( iommu_intremap )
+        rc = amd_iommu_setup_ioapic_remapping();
+    if ( rc )
         goto error_out;
 
     /* allocate and initialize a global device table shared by all iommus */
-    if ( iterate_ivrs_mappings(amd_iommu_setup_device_table) != 0 )
+    rc = iterate_ivrs_mappings(amd_iommu_setup_device_table);
+    if ( rc )
         goto error_out;
 
     /*
@@ -1271,14 +1283,17 @@ int __init amd_iommu_init(void)
 
     /* per iommu initialization  */
     for_each_amd_iommu ( iommu )
-        if ( amd_iommu_init_one(iommu) != 0 )
+    {
+        rc = amd_iommu_init_one(iommu);
+        if ( rc )
             goto error_out;
+    }
 
     return 0;
 
 error_out:
     amd_iommu_init_cleanup();
-    return -ENODEV;
+    return rc;
 }
 
 static void disable_iommu(struct amd_iommu *iommu)

Comments

Andrew Cooper June 14, 2016, 9:09 a.m. UTC | #1
On 14/06/16 10:03, Jan Beulich wrote:
> ... instead of using -ENODEV for any kind of error. It in particular
> addresses Coverity ID 1362694 (introduced by commit eb48587210 ["AMD
> IOMMU: introduce support for IVHD block type 11h"]).
>
> Coverity ID: 1362694
>
> Signed-off-by: Jan Beulich <jbeulich@suse.com>

Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
Suravee Suthikulpanit June 15, 2016, 3:25 p.m. UTC | #2
On 6/14/2016 4:09 AM, Andrew Cooper wrote:
> On 14/06/16 10:03, Jan Beulich wrote:
>> ... instead of using -ENODEV for any kind of error. It in particular
>> addresses Coverity ID 1362694 (introduced by commit eb48587210 ["AMD
>> IOMMU: introduce support for IVHD block type 11h"]).
>>
>> Coverity ID: 1362694
>>
>> Signed-off-by: Jan Beulich <jbeulich@suse.com>
>
> Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
>
>

Reviewed-by: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
Tested-by: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>

Thank you for the fix up.

Suravee
Quan Xu June 16, 2016, 2:03 a.m. UTC | #3
On June 14, 2016 5:03 PM, Jan Beulich <JBeulich@suse.com> wrote:
> -    if ( amd_iommu_update_ivrs_mapping_acpi() != 0 )
> +    rc = amd_iommu_update_ivrs_mapping_acpi();
> +    if ( rc )
>          goto error_out;
> 
>      /* initialize io-apic interrupt remapping entries */
> -    if ( iommu_intremap && amd_iommu_setup_ioapic_remapping() != 0 )
> +    if ( iommu_intremap )
> +        rc = amd_iommu_setup_ioapic_remapping();
> +    if ( rc )
>          goto error_out;


Is it better to indent this if() here? Then,

+    if ( iommu_intremap )
+    {
+        rc = amd_iommu_setup_ioapic_remapping();
+        if ( rc )
+            goto error_out;
+    }

Quan
Jan Beulich June 16, 2016, 8:28 a.m. UTC | #4
>>> On 16.06.16 at 04:03, <quan.xu@intel.com> wrote:
> On June 14, 2016 5:03 PM, Jan Beulich <JBeulich@suse.com> wrote:
>> -    if ( amd_iommu_update_ivrs_mapping_acpi() != 0 )
>> +    rc = amd_iommu_update_ivrs_mapping_acpi();
>> +    if ( rc )
>>          goto error_out;
>> 
>>      /* initialize io-apic interrupt remapping entries */
>> -    if ( iommu_intremap && amd_iommu_setup_ioapic_remapping() != 0 )
>> +    if ( iommu_intremap )
>> +        rc = amd_iommu_setup_ioapic_remapping();
>> +    if ( rc )
>>          goto error_out;
> 
> 
> Is it better to indent this if() here? Then,
> 
> +    if ( iommu_intremap )
> +    {
> +        rc = amd_iommu_setup_ioapic_remapping();
> +        if ( rc )
> +            goto error_out;
> +    }

What would this help (apart from increasing LOC and patch size)?

Jan
Quan Xu June 16, 2016, 8:57 a.m. UTC | #5
On June 16, 2016 4:29 PM, Jan Beulich <JBeulich@suse.com> wrote:
> >>> On 16.06.16 at 04:03, <quan.xu@intel.com> wrote:

> > On June 14, 2016 5:03 PM, Jan Beulich <JBeulich@suse.com> wrote:

> >> -    if ( amd_iommu_update_ivrs_mapping_acpi() != 0 )

> >> +    rc = amd_iommu_update_ivrs_mapping_acpi();

> >> +    if ( rc )

> >>          goto error_out;

> >>

> >>      /* initialize io-apic interrupt remapping entries */

> >> -    if ( iommu_intremap && amd_iommu_setup_ioapic_remapping() != 0 )

> >> +    if ( iommu_intremap )

> >> +        rc = amd_iommu_setup_ioapic_remapping();

> >> +    if ( rc )

> >>          goto error_out;

> >

> >

> > Is it better to indent this if() here? Then,

> >

> > +    if ( iommu_intremap )

> > +    {

> > +        rc = amd_iommu_setup_ioapic_remapping();

> > +        if ( rc )

> > +            goto error_out;

> > +    }

> 

> What would this help (apart from increasing LOC and patch size)?

> 


Ah, first of all, it is not a logic issue, but just make the code clear:
      - this if( rc ) is called only if ( iommu_intremap ) is true.
      - this error is from amd_iommu_setup_ioapic_remapping().

Also from '-    if ( iommu_intremap && amd_iommu_setup_ioapic_remapping() != 0 )', I'd like to fix it as my suggestion.

Quan
diff mbox

Patch

--- a/xen/drivers/passthrough/amd/iommu_init.c
+++ b/xen/drivers/passthrough/amd/iommu_init.c
@@ -1226,6 +1226,7 @@  static bool_t __init amd_sp5100_erratum2
 int __init amd_iommu_init(void)
 {
     struct amd_iommu *iommu;
+    int rc = -ENODEV;
 
     BUG_ON( !iommu_found() );
 
@@ -1237,28 +1238,39 @@  int __init amd_iommu_init(void)
     if ( unlikely(acpi_gbl_FADT.boot_flags & ACPI_FADT_NO_MSI) )
         goto error_out;
 
-    ivhd_type = amd_iommu_get_supported_ivhd_type();
-    if ( ivhd_type < 0 )
+    rc = amd_iommu_get_supported_ivhd_type();
+    if ( rc < 0 )
         goto error_out;
+    ivhd_type = rc;
 
-    ivrs_bdf_entries = amd_iommu_get_ivrs_dev_entries();
-    if ( !ivrs_bdf_entries )
+    rc = amd_iommu_get_ivrs_dev_entries();
+    if ( !rc )
+        rc = -ENODEV;
+    if ( rc < 0 )
         goto error_out;
+    ivrs_bdf_entries = rc;
 
     radix_tree_init(&ivrs_maps);
     for_each_amd_iommu ( iommu )
-        if ( alloc_ivrs_mappings(iommu->seg) != 0 )
+    {
+        rc = alloc_ivrs_mappings(iommu->seg);
+        if ( rc )
             goto error_out;
+    }
 
-    if ( amd_iommu_update_ivrs_mapping_acpi() != 0 )
+    rc = amd_iommu_update_ivrs_mapping_acpi();
+    if ( rc )
         goto error_out;
 
     /* initialize io-apic interrupt remapping entries */
-    if ( iommu_intremap && amd_iommu_setup_ioapic_remapping() != 0 )
+    if ( iommu_intremap )
+        rc = amd_iommu_setup_ioapic_remapping();
+    if ( rc )
         goto error_out;
 
     /* allocate and initialize a global device table shared by all iommus */
-    if ( iterate_ivrs_mappings(amd_iommu_setup_device_table) != 0 )
+    rc = iterate_ivrs_mappings(amd_iommu_setup_device_table);
+    if ( rc )
         goto error_out;
 
     /*
@@ -1271,14 +1283,17 @@  int __init amd_iommu_init(void)
 
     /* per iommu initialization  */
     for_each_amd_iommu ( iommu )
-        if ( amd_iommu_init_one(iommu) != 0 )
+    {
+        rc = amd_iommu_init_one(iommu);
+        if ( rc )
             goto error_out;
+    }
 
     return 0;
 
 error_out:
     amd_iommu_init_cleanup();
-    return -ENODEV;
+    return rc;
 }
 
 static void disable_iommu(struct amd_iommu *iommu)