|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH] x86/hvm: allow for more fine grained assisted flush
On Thu, Apr 30, 2020 at 11:17:25AM +0200, Roger Pau Monne wrote:
> diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c
> index 814b7020d8..1d41b6e2ea 100644
> --- a/xen/arch/x86/hvm/hvm.c
> +++ b/xen/arch/x86/hvm/hvm.c
> @@ -4011,17 +4011,42 @@ static void hvm_s3_resume(struct domain *d)
> }
> }
>
> -static bool always_flush(void *ctxt, struct vcpu *v)
> +static bool flush_check(void *mask, struct vcpu *v)
> {
> - return true;
> + return mask ? test_bit(v->vcpu_id, (unsigned long *)mask) : true;
> }
>
> -static int hvmop_flush_tlb_all(void)
> +static int hvmop_flush_tlb(XEN_GUEST_HANDLE_PARAM(xen_hvm_flush_tlbs_t) uop)
> {
> + xen_hvm_flush_tlbs_t op;
> + DECLARE_BITMAP(mask, HVM_MAX_VCPUS) = { };
> + bool valid_mask = false;
> +
> if ( !is_hvm_domain(current->domain) )
> return -EINVAL;
>
> - return paging_flush_tlb(always_flush, NULL) ? 0 : -ERESTART;
> + if ( !guest_handle_is_null(uop) )
> + {
> + if ( copy_from_guest(&op, uop, 1) )
> + return -EFAULT;
> +
> + /*
> + * TODO: implement support for the other features present in
> + * xen_hvm_flush_tlbs_t: flushing a specific virtual address and not
> + * flushing global mappings.
> + */
> +
> + if ( op.mask_size > ARRAY_SIZE(mask) )
This should also check that the passed in flags are correct, ie:
if ( op.mask_size > ARRAY_SIZE(mask) ||
(op.flags & ~(HVMOP_flush_global | HVMOP_flush_va_valid)) )
return -EINVAL;
Roger.
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |