{
struct kvm_vcpu *v;
int r = -ENOENT;
+ int idx = srcu_read_lock(&vcpu->kvm->srcu);
switch (data->type) {
case KVM_XEN_ATTR_TYPE_LONG_MODE:
- if (!IS_ENABLED(CONFIG_64BIT) && data->u.long_mode)
- return -EINVAL;
+ if (!IS_ENABLED(CONFIG_64BIT) && data->u.long_mode) {
+ r = -EINVAL;
+ goto out;
+ }
kvm->arch.xen.long_mode = !!data->u.long_mode;
r = 0;
case KVM_XEN_ATTR_TYPE_VCPU_INFO:
v = kvm_get_vcpu_by_id(kvm, data->u.vcpu_attr.vcpu_id);
- if (!v)
- return -EINVAL;
+ if (!v) {
+ r = -EINVAL;
+ goto out;
+ }
+
/* No compat necessary here. */
BUILD_BUG_ON(sizeof(struct vcpu_info) !=
sizeof(struct compat_vcpu_info));
data->u.vcpu_attr.gpa,
sizeof(struct vcpu_info));
if (r)
- return r;
+ goto out;
v->arch.xen.vcpu_info_set = true;
kvm_make_request(KVM_REQ_CLOCK_UPDATE, v);
case KVM_XEN_ATTR_TYPE_VCPU_TIME_INFO:
v = kvm_get_vcpu_by_id(kvm, data->u.vcpu_attr.vcpu_id);
- if (!v)
- return -EINVAL;
+ if (!v) {
+ r = -EINVAL;
+ goto out;
+ }
r = kvm_gfn_to_hva_cache_init(kvm, &v->arch.xen.vcpu_time_info_cache,
data->u.vcpu_attr.gpa,
sizeof(struct pvclock_vcpu_time_info));
if (r)
- return r;
+ goto out;
v->arch.xen.vcpu_time_info_set = true;
kvm_make_request(KVM_REQ_CLOCK_UPDATE, v);
case KVM_XEN_ATTR_TYPE_VCPU_RUNSTATE:
v = kvm_get_vcpu_by_id(kvm, data->u.vcpu_attr.vcpu_id);
- if (!v)
- return -EINVAL;
+ if (!v) {
+ r = -EINVAL;
+ goto out;
+ }
r = kvm_gfn_to_hva_cache_init(kvm, &v->arch.xen.runstate_cache,
data->u.vcpu_attr.gpa,
sizeof(struct vcpu_runstate_info));
if (r)
- return r;
+ goto out;
v->arch.xen.runstate_set = true;
v->arch.xen.current_runstate = RUNSTATE_blocked;
break;
case KVM_XEN_ATTR_TYPE_UPCALL_VECTOR:
- if (data->u.vector < 0x10)
- return -EINVAL;
+ if (data->u.vector < 0x10) {
+ r = -EINVAL;
+ goto out;
+ }
kvm->arch.xen.upcall_vector = data->u.vector;
r = 0;
break;
}
+ srcu_read_unlock(&kvm->srcu, idx);
return r;
}