[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v6 2/9] x86/hvm: introduce hvm_copy_context_and_params
On 28.01.2020 17:54, Tamas K Lengyel wrote: > On Tue, Jan 28, 2020 at 9:48 AM Jan Beulich <jbeulich@xxxxxxxx> wrote: >> >> On 27.01.2020 19:06, Tamas K Lengyel wrote: >>> @@ -4139,49 +4140,32 @@ static int hvm_allow_set_param(struct domain *d, >>> return rc; >>> } >>> >>> -static int hvmop_set_param( >>> - XEN_GUEST_HANDLE_PARAM(xen_hvm_param_t) arg) >>> +static int hvm_set_param(struct domain *d, uint32_t index, uint64_t value) >>> { >>> struct domain *curr_d = current->domain; >>> - struct xen_hvm_param a; >>> - struct domain *d; >>> struct vcpu *v; >>> int rc; >>> >>> - if ( copy_from_guest(&a, arg, 1) ) >>> - return -EFAULT; >>> - >>> - if ( a.index >= HVM_NR_PARAMS ) >>> + if ( index >= HVM_NR_PARAMS ) >>> return -EINVAL; >> >> The equivalent of this on the "get" path now seems to be gone. Is >> there any reason the one here is still needed? >> >>> +int hvmop_set_param( >>> + XEN_GUEST_HANDLE_PARAM(xen_hvm_param_t) arg) >>> +{ >>> + struct xen_hvm_param a; >>> + struct domain *d; >>> + int rc; >>> + >>> + if ( copy_from_guest(&a, arg, 1) ) >>> + return -EFAULT; >>> + >>> + if ( a.index >= HVM_NR_PARAMS ) >>> + return -EINVAL; >>> + >>> + /* Make sure the above bound check is not bypassed during speculation. >>> */ >>> + block_speculation(); >>> + >>> + d = rcu_lock_domain_by_any_id(a.domid); >>> + if ( d == NULL ) >>> + return -ESRCH; >>> + >>> + rc = -EINVAL; >>> + if ( !is_hvm_domain(d) ) >>> + goto out; >> >> Despite your claim to have addressed my remaining comment from v4, >> you still use goto here when there's an easy alternative. > > I didn't write this code. This is preexisting code that I'm just > moving. I don't want to rewrite preexisting code here. Well, with the code movement you could (and imo should) _move_ the "out" label instead of duplicating it. >>> @@ -5297,6 +5322,37 @@ void hvm_set_segment_register(struct vcpu *v, enum >>> x86_segment seg, >>> alternative_vcall(hvm_funcs.set_segment_register, v, seg, reg); >>> } >>> >>> +int hvm_copy_context_and_params(struct domain *dst, struct domain *src) >>> +{ >>> + int rc; >>> + unsigned int i; >>> + struct hvm_domain_context c = { }; >>> + >>> + for ( i = 0; i < HVM_NR_PARAMS; i++ ) >>> + { >>> + uint64_t value = 0; >>> + >>> + if ( hvm_get_param(src, i, &value) || !value ) >>> + continue; >>> + >>> + if ( (rc = hvm_set_param(dst, i, value)) ) >>> + return rc; >>> + } >>> + >>> + c.size = hvm_save_size(src); >>> + if ( (c.data = vmalloc(c.size)) == NULL ) >>> + return -ENOMEM; >>> + >>> + if ( !(rc = hvm_save(src, &c)) ) >> >> Also contrary to your claim you still do allocation and save >> after the loop, leaving dst in a partly modified state in more >> cases than necessary. May I ask that you go back to the v4 >> comments one more time? > > I guess I'll do that cause I thought you asked for the allocation to > be moved at the end. It was the other way around before, so I guess I > don't know what you are asking for. Alloc, save, loop over params, load, free. Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |