|
@@ -3157,10 +3157,25 @@ static void kvm_io_bus_destroy(struct kvm_io_bus *bus)
|
|
|
static inline int kvm_io_bus_cmp(const struct kvm_io_range *r1,
|
|
|
const struct kvm_io_range *r2)
|
|
|
{
|
|
|
- if (r1->addr < r2->addr)
|
|
|
+ gpa_t addr1 = r1->addr;
|
|
|
+ gpa_t addr2 = r2->addr;
|
|
|
+
|
|
|
+ if (addr1 < addr2)
|
|
|
return -1;
|
|
|
- if (r1->addr + r1->len > r2->addr + r2->len)
|
|
|
+
|
|
|
+ /* If r2->len == 0, match the exact address. If r2->len != 0,
|
|
|
+ * accept any overlapping write. Any order is acceptable for
|
|
|
+ * overlapping ranges, because kvm_io_bus_get_first_dev ensures
|
|
|
+ * we process all of them.
|
|
|
+ */
|
|
|
+ if (r2->len) {
|
|
|
+ addr1 += r1->len;
|
|
|
+ addr2 += r2->len;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (addr1 > addr2)
|
|
|
return 1;
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|