|
|
@@ -211,18 +211,21 @@ static int iommu_insert_resv_region(struct iommu_resv_region *new,
|
|
|
pos = pos->next;
|
|
|
} else if ((start >= a) && (end <= b)) {
|
|
|
if (new->type == type)
|
|
|
- goto done;
|
|
|
+ return 0;
|
|
|
else
|
|
|
pos = pos->next;
|
|
|
} else {
|
|
|
if (new->type == type) {
|
|
|
phys_addr_t new_start = min(a, start);
|
|
|
phys_addr_t new_end = max(b, end);
|
|
|
+ int ret;
|
|
|
|
|
|
list_del(&entry->list);
|
|
|
entry->start = new_start;
|
|
|
entry->length = new_end - new_start + 1;
|
|
|
- iommu_insert_resv_region(entry, regions);
|
|
|
+ ret = iommu_insert_resv_region(entry, regions);
|
|
|
+ kfree(entry);
|
|
|
+ return ret;
|
|
|
} else {
|
|
|
pos = pos->next;
|
|
|
}
|
|
|
@@ -235,7 +238,6 @@ insert:
|
|
|
return -ENOMEM;
|
|
|
|
|
|
list_add_tail(®ion->list, pos);
|
|
|
-done:
|
|
|
return 0;
|
|
|
}
|
|
|
|