iommu/vt-d: Factor out dmar_alloc_dev_scope() for later reuse
authorJiang Liu <jiang.liu@linux.intel.com>
Wed, 19 Feb 2014 06:07:24 +0000 (14:07 +0800)
committerJoerg Roedel <joro@8bytes.org>
Tue, 4 Mar 2014 16:51:00 +0000 (17:51 +0100)
Factor out function dmar_alloc_dev_scope() from dmar_parse_dev_scope()
for later reuse.

Signed-off-by: Jiang Liu <jiang.liu@linux.intel.com>
Signed-off-by: Joerg Roedel <joro@8bytes.org>
drivers/iommu/dmar.c
include/linux/dmar.h

index 1581565434106027dca83e1e7bae4c640b3febe9..58dde75c52293d773b67fd4fc4dd24147626765c 100644 (file)
@@ -117,13 +117,9 @@ static int __init dmar_parse_one_dev_scope(struct acpi_dmar_device_scope *scope,
        return 0;
 }
 
-int __init dmar_parse_dev_scope(void *start, void *end, int *cnt,
-                               struct pci_dev ***devices, u16 segment)
+void *dmar_alloc_dev_scope(void *start, void *end, int *cnt)
 {
        struct acpi_dmar_device_scope *scope;
-       void * tmp = start;
-       int index;
-       int ret;
 
        *cnt = 0;
        while (start < end) {
@@ -138,15 +134,24 @@ int __init dmar_parse_dev_scope(void *start, void *end, int *cnt,
                start += scope->length;
        }
        if (*cnt == 0)
-               return 0;
+               return NULL;
+
+       return kcalloc(*cnt, sizeof(struct pci_dev *), GFP_KERNEL);
+}
+
+int __init dmar_parse_dev_scope(void *start, void *end, int *cnt,
+                               struct pci_dev ***devices, u16 segment)
+{
+       struct acpi_dmar_device_scope *scope;
+       int index, ret;
 
-       *devices = kcalloc(*cnt, sizeof(struct pci_dev *), GFP_KERNEL);
-       if (!*devices)
+       *devices = dmar_alloc_dev_scope(start, end, cnt);
+       if (*cnt == 0)
+               return 0;
+       else if (!*devices)
                return -ENOMEM;
 
-       start = tmp;
-       index = 0;
-       while (start < end) {
+       for (index = 0; start < end; start += scope->length) {
                scope = start;
                if (scope->entry_type == ACPI_DMAR_SCOPE_TYPE_ENDPOINT ||
                    scope->entry_type == ACPI_DMAR_SCOPE_TYPE_BRIDGE) {
@@ -158,7 +163,6 @@ int __init dmar_parse_dev_scope(void *start, void *end, int *cnt,
                        }
                        index ++;
                }
-               start += scope->length;
        }
 
        return 0;
index eccb0c0c6cf633c35e7a0ebfd5b9b5511a19bf39..1b08ce80bfbfab3eb10d6941072c50c608dde153 100644 (file)
@@ -69,6 +69,7 @@ extern int dmar_table_init(void);
 extern int dmar_dev_scope_init(void);
 extern int dmar_parse_dev_scope(void *start, void *end, int *cnt,
                                struct pci_dev ***devices, u16 segment);
+extern void *dmar_alloc_dev_scope(void *start, void *end, int *cnt);
 extern void dmar_free_dev_scope(struct pci_dev ***devices, int *cnt);
 
 /* Intel IOMMU detection */