| @@ -120,15 +120,31 @@ int kvm_xen_hvm_get_attr(struct kvm *kvm, struct kvm_xen_hvm_attr *data) · 119 unmodified lines |
| 120 | | 120 | |
| 121 | int kvm_xen_vcpu_set_attr(struct kvm_vcpu *vcpu, struct kvm_xen_vcpu_attr *data) | 121 | int kvm_xen_vcpu_set_attr(struct kvm_vcpu *vcpu, struct kvm_xen_vcpu_attr *data) |
| 122 | { | 122 | { |
| 123 | int r = -ENOENT; | 123 | int idx, r = -ENOENT; |
| 124 | | 124 | |
| 125 | mutex_lock(&vcpu->kvm->lock); | 125 | mutex_lock(&vcpu->kvm->lock); |
| | 126 | idx = srcu_read_lock(&vcpu->kvm->srcu); |
| 126 | | 127 | |
| 127 | switch (data->type) { | 128 | switch (data->type) { |
| | 129 | case KVM_XEN_VCPU_ATTR_TYPE_VCPU_INFO: |
| | 130 | /* No compat necessary here. */ |
| | 131 | BUILD_BUG_ON(sizeof(struct vcpu_info) != |
| | 132 | sizeof(struct compat_vcpu_info)); |
| | 133 | |
| | 134 | r = kvm_gfn_to_hva_cache_init(vcpu->kvm, |
| | 135 | &vcpu->arch.xen.vcpu_info_cache, |
| | 136 | data->u.gpa, |
| | 137 | sizeof(struct vcpu_info)); |
| | 138 | if (!r) |
| | 139 | vcpu->arch.xen.vcpu_info_set = true; |
| | 140 | break; |
| | 141 | |
| | 142 | |
| 128 | default: | 143 | default: |
| 129 | break; | 144 | break; |
| 130 | } | 145 | } |
| 131 | | 146 | |
| | 147 | srcu_read_unlock(&vcpu->kvm->srcu, idx); |
| 132 | mutex_unlock(&vcpu->kvm->lock); | 148 | mutex_unlock(&vcpu->kvm->lock); |
| 133 | return r; | 149 | return r; |
| 134 | } | 150 | } |
| @@ -140,6 +156,13 @@ int kvm_xen_vcpu_get_attr(struct kvm_vcpu *vcpu, struct kvm_xen_vcpu_attr *data) · 5 unmodified lines |
| 140 | mutex_lock(&vcpu->kvm->lock); | 156 | mutex_lock(&vcpu->kvm->lock); |
| 141 | | 157 | |
| 142 | switch (data->type) { | 158 | switch (data->type) { |
| | 159 | case KVM_XEN_VCPU_ATTR_TYPE_VCPU_INFO: |
| | 160 | if (vcpu->arch.xen.vcpu_info_set) { |
| | 161 | data->u.gpa = vcpu->arch.xen.vcpu_info_cache.gpa; |
| | 162 | r = 0; |
| | 163 | } |
| | 164 | break; |
| | 165 | |
| 143 | default: | 166 | default: |
| 144 | break; | 167 | break; |
| 145 | } | 168 | } |