return kvm_io_bus_cmp(p1, p2);
 }
 
-static int kvm_io_bus_insert_dev(struct kvm_io_bus *bus, struct kvm_io_device *dev,
-                         gpa_t addr, int len)
-{
-       bus->range[bus->dev_count++] = (struct kvm_io_range) {
-               .addr = addr,
-               .len = len,
-               .dev = dev,
-       };
-
-       sort(bus->range, bus->dev_count, sizeof(struct kvm_io_range),
-               kvm_io_bus_sort_cmp, NULL);
-
-       return 0;
-}
-
 static int kvm_io_bus_get_first_dev(struct kvm_io_bus *bus,
                             gpa_t addr, int len)
 {
 int kvm_io_bus_register_dev(struct kvm *kvm, enum kvm_bus bus_idx, gpa_t addr,
                            int len, struct kvm_io_device *dev)
 {
+       int i;
        struct kvm_io_bus *new_bus, *bus;
+       struct kvm_io_range range;
 
        bus = kvm_get_bus(kvm, bus_idx);
        if (!bus)
                          sizeof(struct kvm_io_range)), GFP_KERNEL);
        if (!new_bus)
                return -ENOMEM;
-       memcpy(new_bus, bus, sizeof(*bus) + (bus->dev_count *
-              sizeof(struct kvm_io_range)));
-       kvm_io_bus_insert_dev(new_bus, dev, addr, len);
+
+       range = (struct kvm_io_range) {
+               .addr = addr,
+               .len = len,
+               .dev = dev,
+       };
+
+       for (i = 0; i < bus->dev_count; i++)
+               if (kvm_io_bus_cmp(&bus->range[i], &range) > 0)
+                       break;
+
+       memcpy(new_bus, bus, sizeof(*bus) + i * sizeof(struct kvm_io_range));
+       new_bus->dev_count++;
+       new_bus->range[i] = range;
+       memcpy(new_bus->range + i + 1, bus->range + i,
+               (bus->dev_count - i) * sizeof(struct kvm_io_range));
        rcu_assign_pointer(kvm->buses[bus_idx], new_bus);
        synchronize_srcu_expedited(&kvm->srcu);
        kfree(bus);