|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v6 07/24] arm/x86/vmap: Add vmalloc_type and vm_init_type
On 07/04/16 04:49, Konrad Rzeszutek Wilk wrote:
> For those users who want to use the virtual addresses that
> are in the hypervisor's virtual address space - these two new
> functions allow that. Along with providing the underlaying
> MFNs for the user's (such as changing page table permissions).
>
> Implementation wise the vmap API keeps track of two virtual
> address regions now:
> a) VMAP_VIRT_START
> b) Any provided virtual address space (need start and end).
>
> The a) one is the default one and the existing behavior
> for users of vmalloc, vmap, etc is the same.
>
> If however one wishes to use the b) one only has to use
> the vm_init_type to initalize and the vmalloc_type to utilize it.
>
> This allows users (such as xSplice) to provide their own
> mechanism to change the the page flags, and also use virtual
> addresses closer to the hypervisor virtual addresses (at least
> on x86) while not having to deal with the allocation of
> pages.
>
> For example of users, see patch titled "xsplice: Implement payload
> loading", where we parse the payload's ELF relocations - which
> is defined to be signed 32-bit (so max displacement is 2GB virtual
> spacE). The displacement of the hypervisor virtual addresses to the
> vmalloc (on x86) is more than 32-bits - which means that ELF relocations
> would truncate the 34 and 33th bit. Hence this alternate API
>
> We also add add extra checks in case the b) range has not been initialized.
>
> Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx>
> Suggested-by: Jan Beulich <jbeulich@xxxxxxxx>
> ---
> Cc: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>
> Cc: Jan Beulich <jbeulich@xxxxxxxx>
> Cc: Keir Fraser <keir@xxxxxxx>
> Cc: Tim Deegan <tim@xxxxxxx>
> Cc: Stefano Stabellini <sstabellini@xxxxxxxxxx>
> Cc: Julien Grall <julien.grall@xxxxxxx>
>
> v4: New patch.
> v5: Update per Jan's comments.
> v6: Drop the stray parentheses on typedefs.
> Ditch the vunmap callback. Stash away the virtual addresses in lists.
> Ditch the vmap callback. Just provide virtual address.
> Ditch the vmalloc_range. Require users of alternative virtual address
> to call vmap_init_type first.
(For anyone else wishing to review this, `git diff --color-words` makes
it a far easier job)
This is definitely an improvement over previous versions, and in
principle looks fine, with moderate issue.
> diff --git a/xen/include/xen/vmap.h b/xen/include/xen/vmap.h
> index 5671ac8..07fa3b4 100644
> --- a/xen/include/xen/vmap.h
> +++ b/xen/include/xen/vmap.h
> @@ -4,16 +4,44 @@
> #include <xen/mm.h>
> #include <asm/page.h>
>
> +enum vmap_type {
> + VMAP_DEFAULT,
> + VMAP_XEN,
> + VMAP_nr,
> +};
These really arn't types of vmap. They are just different regions to
try and use; the underlying infrastructure is still all the same.
I would recommend "enum vmap_region" instead, as well as VMAP_REGION_NR
to avoid having a mixed-case constant.
> +
> +void vm_free_type(const void *, enum vmap_type);
> +void vunmap_type(const void *, enum vmap_type);
> +void *vmalloc_type(size_t size, enum vmap_type type, mfn_t **mfn_array);
> +void vm_init_type(enum vmap_type type, void *start, void *end);
> +void vfree_type(void *va, enum vmap_type type);
Exposing the type (/region) parameter is quite unsafe, when mixed with
the va. What happens if someone passes in a va for one region, with a
VMAP_$other ?
How likely are we to gain a 3rd region? My gut feeling is that it would
be safer to hide all of the type/region bits in vmap.c (other than
perhaps the _init() calls), and expose $VMAP_FOO_xen() functions in the API.
~Andrew
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |