[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH RFC for next] xen: make grant table configurable



On Thu, 17 Jan 2019, Wei Liu wrote:
> Introduce CONFIG_GRANT_TABLE. Provide stubs and make sure x86 and arm
> hypervisors build with grant table disabled.

Looks like a good idea.


> Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx>
> ---
> I did this when I worked on splitting PV and HVM and thought this
> might be useful and it was simple enough to get done.
> 
> RFC because I can envisage some configurations in the distant future
> do away with grant table and event channel. There is small a benefit
> to consider accepting this patch now so that Gitlab's randconf build
> can start testing with grant table turned off right away.

Can Gitlab do Arm hypervisor builds?


> ---
>  xen/arch/arm/setup.c              |  3 ++-
>  xen/arch/arm/traps.c              |  2 ++
>  xen/arch/x86/hvm/Makefile         |  2 +-
>  xen/arch/x86/hvm/hypercall.c      |  4 ++++
>  xen/arch/x86/hypercall.c          |  2 ++
>  xen/arch/x86/pv/Makefile          |  2 +-
>  xen/arch/x86/pv/hypercall.c       |  2 ++
>  xen/arch/x86/setup.c              |  6 +++--
>  xen/common/Kconfig                | 11 +++++++++
>  xen/common/Makefile               |  2 +-
>  xen/include/asm-arm/grant_table.h |  4 +++-
>  xen/include/xen/grant_table.h     | 49 
> +++++++++++++++++++++++++++++++++++++--
>  12 files changed, 80 insertions(+), 9 deletions(-)
> 
> diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c
> index 444857a967..3cd3513928 100644
> --- a/xen/arch/arm/setup.c
> +++ b/xen/arch/arm/setup.c
> @@ -740,7 +740,8 @@ void __init start_xen(unsigned long boot_phys_offset,
>          .flags = XEN_DOMCTL_CDF_hvm_guest | XEN_DOMCTL_CDF_hap,
>          .max_evtchn_port = -1,
>          .max_grant_frames = gnttab_dom0_frames(),
> -        .max_maptrack_frames = opt_max_maptrack_frames,
> +        .max_maptrack_frames = IS_ENABLED(CONFIG_GRANT_TABLE) ?
> +                               opt_max_maptrack_frames : 0,
>      };
>  
>      dcache_line_bytes = read_dcache_line_bytes();
> diff --git a/xen/arch/arm/traps.c b/xen/arch/arm/traps.c
> index 221c762ada..0f1c1b6431 100644
> --- a/xen/arch/arm/traps.c
> +++ b/xen/arch/arm/traps.c
> @@ -1392,7 +1392,9 @@ static arm_hypercall_t arm_hypercall_table[] = {
>      HYPERCALL_DEPRECATED(physdev_op_compat, 1),
>      HYPERCALL(sysctl, 2),
>      HYPERCALL(hvm_op, 2),
> +#ifdef CONFIG_GRANT_TABLE
>      HYPERCALL(grant_table_op, 3),
> +#endif
>      HYPERCALL(multicall, 2),
>      HYPERCALL(platform_op, 1),
>      HYPERCALL_ARM(vcpu_op, 3),
> diff --git a/xen/arch/x86/hvm/Makefile b/xen/arch/x86/hvm/Makefile
> index 86b106f8e7..43e5f3a21f 100644
> --- a/xen/arch/x86/hvm/Makefile
> +++ b/xen/arch/x86/hvm/Makefile
> @@ -7,7 +7,7 @@ obj-y += dm.o
>  obj-bin-y += dom0_build.init.o
>  obj-y += domain.o
>  obj-y += emulate.o
> -obj-y += grant_table.o
> +obj-$(CONFIG_GRANT_TABLE) += grant_table.o
>  obj-y += hpet.o
>  obj-y += hvm.o
>  obj-y += hypercall.o
> diff --git a/xen/arch/x86/hvm/hypercall.c b/xen/arch/x86/hvm/hypercall.c
> index 19d126377a..1f667efc36 100644
> --- a/xen/arch/x86/hvm/hypercall.c
> +++ b/xen/arch/x86/hvm/hypercall.c
> @@ -47,6 +47,7 @@ static long hvm_memory_op(int cmd, 
> XEN_GUEST_HANDLE_PARAM(void) arg)
>      return rc;
>  }
>  
> +#ifdef CONFIG_GRANT_TABLE
>  static long hvm_grant_table_op(
>      unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) uop, unsigned int count)
>  {
> @@ -71,6 +72,7 @@ static long hvm_grant_table_op(
>      else
>          return compat_grant_table_op(cmd, uop, count);
>  }
> +#endif
>  
>  static long hvm_physdev_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg)
>  {
> @@ -119,7 +121,9 @@ static long hvm_physdev_op(int cmd, 
> XEN_GUEST_HANDLE_PARAM(void) arg)
>  
>  static const hypercall_table_t hvm_hypercall_table[] = {
>      HVM_CALL(memory_op),
> +#ifdef CONFIG_GRANT_TABLE
>      HVM_CALL(grant_table_op),
> +#endif
>      COMPAT_CALL(vcpu_op),
>      HVM_CALL(physdev_op),
>      COMPAT_CALL(xen_version),
> diff --git a/xen/arch/x86/hypercall.c b/xen/arch/x86/hypercall.c
> index 032de8f8f8..9311b63c1e 100644
> --- a/xen/arch/x86/hypercall.c
> +++ b/xen/arch/x86/hypercall.c
> @@ -47,7 +47,9 @@ const hypercall_args_t hypercall_args_table[NR_hypercalls] =
>      ARGS(xen_version, 2),
>      ARGS(console_io, 3),
>      ARGS(physdev_op_compat, 1),
> +#ifdef CONFIG_GRANT_TABLE
>      ARGS(grant_table_op, 3),
> +#endif
>      ARGS(vm_assist, 2),
>      COMP(update_va_mapping_otherdomain, 4, 5),
>      ARGS(vcpu_op, 3),
> diff --git a/xen/arch/x86/pv/Makefile b/xen/arch/x86/pv/Makefile
> index 65bca04175..cf28434ba9 100644
> --- a/xen/arch/x86/pv/Makefile
> +++ b/xen/arch/x86/pv/Makefile
> @@ -5,7 +5,7 @@ obj-y += emulate.o
>  obj-y += emul-gate-op.o
>  obj-y += emul-inv-op.o
>  obj-y += emul-priv-op.o
> -obj-y += grant_table.o
> +obj-$(CONFIG_GRANT_TABLE) += grant_table.o
>  obj-y += hypercall.o
>  obj-y += iret.o
>  obj-y += misc-hypercalls.o
> diff --git a/xen/arch/x86/pv/hypercall.c b/xen/arch/x86/pv/hypercall.c
> index 5d11911735..ee0a6da515 100644
> --- a/xen/arch/x86/pv/hypercall.c
> +++ b/xen/arch/x86/pv/hypercall.c
> @@ -53,7 +53,9 @@ const hypercall_table_t pv_hypercall_table[] = {
>      COMPAT_CALL(xen_version),
>      HYPERCALL(console_io),
>      COMPAT_CALL(physdev_op_compat),
> +#ifdef CONFIG_GRANT_TABLE
>      COMPAT_CALL(grant_table_op),
> +#endif
>      COMPAT_CALL(vm_assist),
>      COMPAT_CALL(update_va_mapping_otherdomain),
>      COMPAT_CALL(iret),
> diff --git a/xen/arch/x86/setup.c b/xen/arch/x86/setup.c
> index 06eb483cb4..09ef0e90df 100644
> --- a/xen/arch/x86/setup.c
> +++ b/xen/arch/x86/setup.c
> @@ -686,8 +686,10 @@ void __init noreturn __start_xen(unsigned long mbi_p)
>      struct xen_domctl_createdomain dom0_cfg = {
>          .flags = XEN_DOMCTL_CDF_s3_integrity,
>          .max_evtchn_port = -1,
> -        .max_grant_frames = opt_max_grant_frames,
> -        .max_maptrack_frames = opt_max_maptrack_frames,
> +        .max_grant_frames = IS_ENABLED(CONFIG_GRANT_TABLE) ?
> +                            opt_max_grant_frames : 0,
> +        .max_maptrack_frames = IS_ENABLED(CONFIG_GRANT_TABLE) ?
> +                               opt_max_maptrack_frames : 0,
>      };
>  
>      /* Critical region without IDT or TSS.  Any fault is deadly! */
> diff --git a/xen/common/Kconfig b/xen/common/Kconfig
> index a79cd40441..18e0be3d98 100644
> --- a/xen/common/Kconfig
> +++ b/xen/common/Kconfig
> @@ -11,6 +11,17 @@ config COMPAT
>  config CORE_PARKING
>       bool
>  
> +config GRANT_TABLE
> +     bool "Grant table support"
> +     default y
> +     ---help---
> +       Grant table provides a generic mechanism to memory sharing
> +       between domains. This shared memory interface underpins the
> +       split device drivers for block and network IO in a classic
> +       Xen setup.
> +
> +       If unsure, say Y.
> +
>  config HAS_ALTERNATIVE
>       bool
>  
> diff --git a/xen/common/Makefile b/xen/common/Makefile
> index 56fc201b6b..e748554a44 100644
> --- a/xen/common/Makefile
> +++ b/xen/common/Makefile
> @@ -10,7 +10,7 @@ obj-y += event_2l.o
>  obj-y += event_channel.o
>  obj-y += event_fifo.o
>  obj-$(CONFIG_CRASH_DEBUG) += gdbstub.o
> -obj-y += grant_table.o
> +obj-$(CONFIG_GRANT_TABLE) += grant_table.o
>  obj-y += guestcopy.o
>  obj-bin-y += gunzip.init.o
>  obj-y += irq.o
> diff --git a/xen/include/asm-arm/grant_table.h 
> b/xen/include/asm-arm/grant_table.h
> index 816e3c6d68..50a07b8b17 100644
> --- a/xen/include/asm-arm/grant_table.h
> +++ b/xen/include/asm-arm/grant_table.h
> @@ -31,7 +31,9 @@ void gnttab_mark_dirty(struct domain *d, mfn_t mfn);
>   * enough space for a large grant table
>   */
>  #define gnttab_dom0_frames()                                             \
> -    min_t(unsigned int, opt_max_grant_frames, PFN_DOWN(_etext - _stext))
> +    min_t(unsigned int,                                                  \
> +          IS_ENABLED(CONFIG_GRANT_TABLE) ? opt_max_grant_frames : 0,     \
> +          PFN_DOWN(_etext - _stext))
>  
>  #define gnttab_init_arch(gt)                                             \
>  ({                                                                       \
> diff --git a/xen/include/xen/grant_table.h b/xen/include/xen/grant_table.h
> index 12e8a4b80b..f0498df727 100644
> --- a/xen/include/xen/grant_table.h
> +++ b/xen/include/xen/grant_table.h
> @@ -29,11 +29,12 @@
>  #include <asm/page.h>
>  #include <asm/grant_table.h>
>  
> -struct grant_table;
> -
>  extern unsigned int opt_max_grant_frames;
>  extern unsigned int opt_max_maptrack_frames;
>  
> +#ifdef CONFIG_GRANT_TABLE
> +struct grant_table;
> +
>  /* Create/destroy per-domain grant table context. */
>  int grant_table_init(struct domain *d, unsigned int max_grant_frames,
>                       unsigned int max_maptrack_frames);
> @@ -61,4 +62,48 @@ int gnttab_get_shared_frame(struct domain *d, unsigned 
> long idx,
>  int gnttab_get_status_frame(struct domain *d, unsigned long idx,
>                              mfn_t *mfn);
>  
> +#else
> +
> +static inline int grant_table_init(struct domain *d,
> +                                   unsigned int max_grant_frames,
> +                                   unsigned int max_maptrack_frames)
> +{
> +    return 0;
> +}
> +
> +static inline void grant_table_destroy(struct domain *d) {}
> +
> +static inline void grant_table_init_vcpu(struct vcpu *v) {}
> +
> +static inline void grant_table_warn_active_grants(struct domain *d) {}
> +
> +static inline void gnttab_release_mappings(struct domain *d) {}
> +
> +static inline int mem_sharing_gref_to_gfn(struct grant_table *gt,
> +                                          grant_ref_t ref,
> +                                          gfn_t *gfn, uint16_t *status)
> +{
> +    return -EINVAL;
> +}
> +
> +static inline int gnttab_map_frame(struct domain *d, unsigned long idx,
> +                                   gfn_t gfn, mfn_t *mfn)
> +{
> +    return -EINVAL;
> +}
> +
> +static inline int gnttab_get_shared_frame(struct domain *d, unsigned long 
> idx,
> +                                          mfn_t *mfn)
> +{
> +    return -EINVAL;
> +}
> +
> +static inline int gnttab_get_status_frame(struct domain *d, unsigned long 
> idx,
> +                                          mfn_t *mfn)
> +{
> +    return -EINVAL;
> +}
> +
> +#endif /* CONFIG_GRANT_TABLE */
> +
>  #endif /* __XEN_GRANT_TABLE_H__ */
> -- 
> 2.11.0
> 

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.