2015-06-05 12:26+0200, Paolo Bonzini:
> On 29/05/2015 21:23, Radim Krčmář wrote:
>>> > +int kvm_vcpu_write_guest(struct kvm_vcpu *vcpu, gpa_t gpa, const void 
>>> > *data,
>>> > +                  unsigned long len)
>>> > +{
| [...]
>>> > +}
>> (There is no need to pass vcpu, and kvm, in this API.
> 
> How so?  A single kvm_vcpu_write_guest can cross multiple slots.

I meant passing 'struct kvm_memslots *' instead and as soon as possible,
which would still allow more slots.  Something like this hunk:

diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index 10ae7e348dcc..8c6d84c12f18 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -1718,8 +1718,8 @@ int kvm_vcpu_write_guest_page(struct kvm_vcpu *vcpu, 
gfn_t gfn,
 }
 EXPORT_SYMBOL_GPL(kvm_vcpu_write_guest_page);
 
-int kvm_write_guest(struct kvm *kvm, gpa_t gpa, const void *data,
-                   unsigned long len)
+static int __kvm_write_guest(struct kvm_memslots *slots, gpa_t gpa, const void 
*data,
+               unsigned long len)
 {
        gfn_t gfn = gpa >> PAGE_SHIFT;
        int seg;
@@ -1727,7 +1727,8 @@ int kvm_write_guest(struct kvm *kvm, gpa_t gpa, const 
void *data,
        int ret;
 
        while ((seg = next_segment(len, offset)) != 0) {
-               ret = kvm_write_guest_page(kvm, gfn, data, offset, seg);
+               ret = __kvm_write_guest_page(__gfn_to_memslot(slots, gfn), gfn,
+                               data, offset, seg);
                if (ret < 0)
                        return ret;
                offset = 0;
@@ -1737,26 +1738,18 @@ int kvm_write_guest(struct kvm *kvm, gpa_t gpa, const 
void *data,
        }
        return 0;
 }
+
+int kvm_write_guest(struct kvm *kvm, gpa_t gpa, const void *data,
+                   unsigned long len)
+{
+       return __kvm_write_guest(kvm_memslots(kvm), gpa, data, len);
+}
 EXPORT_SYMBOL_GPL(kvm_write_guest);
 
 int kvm_vcpu_write_guest(struct kvm_vcpu *vcpu, gpa_t gpa, const void *data,
                         unsigned long len)
 {
-       gfn_t gfn = gpa >> PAGE_SHIFT;
-       int seg;
-       int offset = offset_in_page(gpa);
-       int ret;
-
-       while ((seg = next_segment(len, offset)) != 0) {
-               ret = kvm_vcpu_write_guest_page(vcpu, gfn, data, offset, seg);
-               if (ret < 0)
-                       return ret;
-               offset = 0;
-               len -= seg;
-               data += seg;
-               ++gfn;
-       }
-       return 0;
+       return __kvm_write_guest(kvm_vcpu_memslots(vcpu), gpa, data, len);
 }
 EXPORT_SYMBOL_GPL(kvm_vcpu_write_guest);
 
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to