|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH RFC v1 49/74] x86/guest: map per-cpu vcpu_info area.
>>> On 04.01.18 at 14:06, <wei.liu2@xxxxxxxxxx> wrote:
> So that the limit of XEN_LEGACY_MAX_VCPUS can be lifted.
>
> Signed-off-by: Roger Pau Monné <roger.pau@xxxxxxxxxx>
> ---
> Should be moved earlier maybe?
Especially the changes to time.c undoing/redoing earlier changes
suggests so.
> --- a/xen/arch/x86/guest/xen.c
> +++ b/xen/arch/x86/guest/xen.c
> @@ -38,6 +38,10 @@ static struct rangeset *mem;
>
> DEFINE_PER_CPU(unsigned int, vcpu_id);
>
> +static struct vcpu_info *vcpu_info;
> +unsigned long vcpu_info_mapped[BITS_TO_LONGS(NR_CPUS)];
static
> @@ -101,6 +105,38 @@ static void map_shared_info(void)
> xchg(&XEN_shared_info->evtchn_mask[i], ~0ul);
> }
>
> +static int map_vcpuinfo(void)
> +{
> + unsigned int vcpu = this_cpu(vcpu_id);
> + struct vcpu_register_vcpu_info info = { };
I doubt you need the initializer here.
> + long rc;
> +
> + if ( !vcpu_info )
> + {
> + this_cpu(vcpu_info) = &XEN_shared_info->vcpu_info[vcpu];
> + return 0;
> + }
> +
> + if ( test_bit(vcpu, vcpu_info_mapped) )
> + {
> + this_cpu(vcpu_info) = &vcpu_info[vcpu];
> + return 0;
> + }
> +
> + info.mfn = virt_to_mfn(&vcpu_info[vcpu]);
> + info.offset = (unsigned long)&vcpu_info[vcpu] & ~PAGE_MASK;
> + rc = xen_hypercall_vcpu_op(VCPUOP_register_vcpu_info, vcpu, &info);
> + if ( rc )
> + this_cpu(vcpu_info) = &XEN_shared_info->vcpu_info[vcpu];
You need to avoid producing an out of bounds pointer here for
large vcpu values.
> @@ -176,12 +211,34 @@ void __init hypervisor_setup(void)
> map_shared_info();
> set_vcpu_id();
>
> + vcpu_info = xzalloc_array(struct vcpu_info, nr_cpu_ids);
> + if ( map_vcpuinfo() || !vcpu_info )
> + {
> + if ( vcpu_info )
> + {
> + xfree(vcpu_info);
> + vcpu_info = NULL;
> + }
> + if ( nr_cpu_ids > XEN_LEGACY_MAX_VCPUS )
How about
if ( map_vcpuinfo() )
{
xfree(vcpu_info);
vcpu_info = NULL;
}
if ( !vcpu_info && nr_cpu_ids > XEN_LEGACY_MAX_VCPUS )
{
...
?
> --- a/xen/arch/x86/time.c
> +++ b/xen/arch/x86/time.c
> @@ -533,11 +533,11 @@ static struct platform_timesource __initdata plt_tsc =
> * Xen clock source is a variant of TSC source.
> */
>
> -DECLARE_PER_CPU(unsigned int, vcpu_id);
> +DECLARE_PER_CPU(struct vcpu_info *, vcpu_info);
I didn't notice the one being removed here - both shouldn't be
declared here, but in a header.
> @@ -107,6 +108,12 @@ static inline long xen_hypercall_hvm_op(unsigned int op,
> void *arg)
> return _hypercall64_2(long, __HYPERVISOR_hvm_op, op, arg);
> }
>
> +static inline long xen_hypercall_vcpu_op(unsigned int cmd, unsigned int vcpu,
I believe "int" is sufficient here (and then also for the variable(s) into
which the return value is/are being latched).
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 |