This is a in part just loosely connected set of changes in particular aiming at further shim size binary reduction. Review feedback for v2 addressed for 1 and 2; 3 and 4 unchanged. One patch was dropped. 1: x86/EFI: sanitize build logic 2: x86: don't build with EFI support in shim-exclusive mode 3: bitmap: move to/from xenctl_bitmap conversion helpers 4: x86: don't include domctl and alike in shim-exclusive builds Jan
With changes done over time and as far as linking goes, the only special things about building with EFI support enabled are - the need for the dummy relocations object for xen.gz uniformly in all build stages, - the special efi/buildid.o file, which can't be made part of efi/built_in.o, due to the extra linker options required for it. All other efi/*.o can be consumed from the built_in*.o files. In efi/Makefile, besides moving relocs-dummy.o to "extra", also properly split between obj-y and obj-bin-y. Signed-off-by: Jan Beulich <jbeulich@suse.com> --- v3: Fix efi/buildid.o dependency handling. v2: Drop a now stale piece of Makefile logic. --- a/xen/arch/x86/Makefile +++ b/xen/arch/x86/Makefile @@ -113,28 +113,35 @@ $(TARGET): $(TARGET)-syms $(efi-y) boot/ { echo "No Multiboot2 header found" >&2; false; } mv $(TMP) $(TARGET) +# Check if the compiler supports the MS ABI. +export XEN_BUILD_EFI := $(shell $(CC) $(XEN_CFLAGS) -c efi/check.c -o efi/check.o 2>/dev/null && echo y) +# Check if the linker supports PE. +XEN_BUILD_PE := $(if $(XEN_BUILD_EFI),$(shell $(LD) -mi386pep --subsystem=10 -o efi/check.efi efi/check.o 2>/dev/null && echo y)) +CFLAGS-$(XEN_BUILD_EFI) += -DXEN_BUILD_EFI + ALL_OBJS := $(BASEDIR)/arch/x86/boot/built_in.o $(BASEDIR)/arch/x86/efi/built_in.o $(ALL_OBJS) +EFI_OBJS-$(XEN_BUILD_EFI) := efi/relocs-dummy.o ifeq ($(CONFIG_LTO),y) # Gather all LTO objects together prelink_lto.o: $(ALL_OBJS) $(LD_LTO) -r -o $@ $^ -prelink-efi_lto.o: $(ALL_OBJS) efi/runtime.o efi/compat.o - $(LD_LTO) -r -o $@ $(filter-out %/efi/built_in.o,$^) +prelink-efi_lto.o: $(ALL_OBJS) + $(LD_LTO) -r -o $@ $^ # Link it with all the binary objects -prelink.o: $(patsubst %/built_in.o,%/built_in_bin.o,$(ALL_OBJS)) prelink_lto.o +prelink.o: $(patsubst %/built_in.o,%/built_in_bin.o,$(ALL_OBJS)) prelink_lto.o $(EFI_OBJS-y) $(LD) $(XEN_LDFLAGS) -r -o $@ $^ -prelink-efi.o: $(patsubst %/built_in.o,%/built_in_bin.o,$(ALL_OBJS)) prelink-efi_lto.o efi/boot.init.o +prelink-efi.o: $(patsubst %/built_in.o,%/built_in_bin.o,$(ALL_OBJS)) prelink-efi_lto.o $(LD) $(XEN_LDFLAGS) -r -o $@ $^ else -prelink.o: $(ALL_OBJS) +prelink.o: $(ALL_OBJS) $(EFI_OBJS-y) $(LD) $(XEN_LDFLAGS) -r -o $@ $^ -prelink-efi.o: $(ALL_OBJS) efi/boot.init.o efi/runtime.o efi/compat.o - $(LD) $(XEN_LDFLAGS) -r -o $@ $(filter-out %/efi/built_in.o,$^) +prelink-efi.o: $(ALL_OBJS) + $(LD) $(XEN_LDFLAGS) -r -o $@ $^ endif $(TARGET)-syms: prelink.o xen.lds @@ -171,12 +178,6 @@ EFI_LDFLAGS += --minor-image-version=$(X EFI_LDFLAGS += --major-os-version=2 --minor-os-version=0 EFI_LDFLAGS += --major-subsystem-version=2 --minor-subsystem-version=0 -# Check if the compiler supports the MS ABI. -export XEN_BUILD_EFI := $(shell $(CC) $(XEN_CFLAGS) -c efi/check.c -o efi/check.o 2>/dev/null && echo y) -# Check if the linker supports PE. -XEN_BUILD_PE := $(if $(XEN_BUILD_EFI),$(shell $(LD) -mi386pep --subsystem=10 -o efi/check.efi efi/check.o 2>/dev/null && echo y)) -CFLAGS-$(XEN_BUILD_EFI) += -DXEN_BUILD_EFI - $(TARGET).efi: VIRT_BASE = 0x$(shell $(NM) efi/relocs-dummy.o | sed -n 's, A VIRT_START$$,,p') $(TARGET).efi: ALT_BASE = 0x$(shell $(NM) efi/relocs-dummy.o | sed -n 's, A ALT_START$$,,p') @@ -185,6 +186,8 @@ ifeq ($(call ld-ver-build-id,$(LD) $(fil CFLAGS-y += -DBUILD_ID_EFI EFI_LDFLAGS += $(build_id_linker) note_file := efi/buildid.o +efi/buildid.o: $(BASEDIR)/arch/x86/efi/built_in.o +efi/buildid.o: ; # NB: this must be the last input in the linker call, because inputs following # the -b option will all be treated as being in the specified format. note_file_option := -b pe-x86-64 $(note_file) @@ -223,9 +226,6 @@ $(TARGET).efi: FORCE echo '$(if $(filter y,$(XEN_BUILD_EFI)),xen.efi generation,EFI support) disabled' endif -efi/boot.init.o efi/runtime.o efi/compat.o efi/buildid.o efi/relocs-dummy.o: $(BASEDIR)/arch/x86/efi/built_in.o -efi/boot.init.o efi/runtime.o efi/compat.o efi/buildid.o efi/relocs-dummy.o: ; - asm-offsets.s: $(TARGET_SUBARCH)/asm-offsets.c $(BASEDIR)/include/asm-x86/asm-macros.h $(CC) $(filter-out -Wa$(comma)% -flto,$(c_flags)) -S -o $@ $< --- a/xen/arch/x86/efi/Makefile +++ b/xen/arch/x86/efi/Makefile @@ -14,6 +14,7 @@ $(call cc-option-add,cflags-stack-bounda $(EFIOBJ): CFLAGS-stack-boundary := $(cflags-stack-boundary) obj-y := stub.o -obj-$(XEN_BUILD_EFI) := $(EFIOBJ) relocs-dummy.o -extra-$(XEN_BUILD_EFI) += buildid.o +obj-$(XEN_BUILD_EFI) := $(filter-out %.init.o,$(EFIOBJ)) +obj-bin-$(XEN_BUILD_EFI) := $(filter %.init.o,$(EFIOBJ)) +extra-$(XEN_BUILD_EFI) += buildid.o relocs-dummy.o nocov-$(XEN_BUILD_EFI) += stub.o
There's no need for xen.efi at all, and there's also no need for EFI support in xen.gz since the shim runs in PVH mode, i.e. without any firmware (and hence by implication also without EFI one). The slightly odd looking use of $(space) is to ensure the new ifneq() evaluates consistently between "build" and "install" invocations of make. Signed-off-by: Jan Beulich <jbeulich@suse.com> Reviewed-by: Roger Pau Monné <roger.pau@citrix.com> --- There are further anomalies associated with the need to use $(space) here: - xen.efi rebuilding gets suppressed when installing (typically as root) from a non-root-owned tree. I think we should similarly suppress re-building of xen.gz as well in this case, as tool chains available may vary (and hence a partial or full re-build may mistakenly occur). - xen.lds (re-)generation has a dependency issue: The value of XEN_BUILD_EFI changing between builds (like would happen on a pre- built tree with a shim-exclusive config, on which then this patch would be applied) does not cause it to be re-built. Anthony's switching to Linux'es build system will address this afaict, so I didn't see a need to supply a separate patch. --- a/xen/arch/x86/Makefile +++ b/xen/arch/x86/Makefile @@ -80,7 +80,9 @@ x86_emulate.o: x86_emulate/x86_emulate.c efi-y := $(shell if [ ! -r $(BASEDIR)/include/xen/compile.h -o \ -O $(BASEDIR)/include/xen/compile.h ]; then \ - echo '$(TARGET).efi'; fi) + echo '$(TARGET).efi'; fi) \ + $(space) +efi-$(CONFIG_PV_SHIM_EXCLUSIVE) := ifneq ($(build_id_linker),) notes_phdrs = --notes @@ -113,11 +115,13 @@ $(TARGET): $(TARGET)-syms $(efi-y) boot/ { echo "No Multiboot2 header found" >&2; false; } mv $(TMP) $(TARGET) +ifneq ($(efi-y),) # Check if the compiler supports the MS ABI. export XEN_BUILD_EFI := $(shell $(CC) $(XEN_CFLAGS) -c efi/check.c -o efi/check.o 2>/dev/null && echo y) # Check if the linker supports PE. XEN_BUILD_PE := $(if $(XEN_BUILD_EFI),$(shell $(LD) -mi386pep --subsystem=10 -o efi/check.efi efi/check.o 2>/dev/null && echo y)) CFLAGS-$(XEN_BUILD_EFI) += -DXEN_BUILD_EFI +endif ALL_OBJS := $(BASEDIR)/arch/x86/boot/built_in.o $(BASEDIR)/arch/x86/efi/built_in.o $(ALL_OBJS) EFI_OBJS-$(XEN_BUILD_EFI) := efi/relocs-dummy.o
A subsequent change will exclude domctl.c from getting built for a particular configuration, yet the two functions get used from elsewhere. While moving the code - drop unmotivated uses of min_t(), - fix style violations in the moved code, - xfree() as early as possible. Signed-off-by: Jan Beulich <jbeulich@suse.com> Acked-by: Julien Grall <jgrall@amazon.com> --- v3: Drop unmotivated uses of min_t(). Fix style violations in the moved code. xfree() as early as possible. v2: Move function decls to xen/bitmap.h. --- a/xen/common/bitmap.c +++ b/xen/common/bitmap.c @@ -9,6 +9,8 @@ #include <xen/errno.h> #include <xen/bitmap.h> #include <xen/bitops.h> +#include <xen/cpumask.h> +#include <xen/guest_access.h> #include <asm/byteorder.h> /* @@ -384,3 +386,88 @@ void bitmap_byte_to_long(unsigned long * } #endif + +int bitmap_to_xenctl_bitmap(struct xenctl_bitmap *xenctl_bitmap, + const unsigned long *bitmap, unsigned int nbits) +{ + unsigned int guest_bytes, copy_bytes, i; + uint8_t zero = 0; + int err = 0; + uint8_t *bytemap = xmalloc_array(uint8_t, (nbits + 7) / 8); + + if ( !bytemap ) + return -ENOMEM; + + guest_bytes = (xenctl_bitmap->nr_bits + 7) / 8; + copy_bytes = min(guest_bytes, (nbits + 7) / 8); + + bitmap_long_to_byte(bytemap, bitmap, nbits); + + if ( copy_bytes && + copy_to_guest(xenctl_bitmap->bitmap, bytemap, copy_bytes) ) + err = -EFAULT; + + xfree(bytemap); + + for ( i = copy_bytes; !err && i < guest_bytes; i++ ) + if ( copy_to_guest_offset(xenctl_bitmap->bitmap, i, &zero, 1) ) + err = -EFAULT; + + return err; +} + +int xenctl_bitmap_to_bitmap(unsigned long *bitmap, + const struct xenctl_bitmap *xenctl_bitmap, + unsigned int nbits) +{ + unsigned int guest_bytes, copy_bytes; + int err = 0; + uint8_t *bytemap = xzalloc_array(uint8_t, (nbits + 7) / 8); + + if ( !bytemap ) + return -ENOMEM; + + guest_bytes = (xenctl_bitmap->nr_bits + 7) / 8; + copy_bytes = min(guest_bytes, (nbits + 7) / 8); + + if ( copy_bytes ) + { + if ( copy_from_guest(bytemap, xenctl_bitmap->bitmap, copy_bytes) ) + err = -EFAULT; + if ( (xenctl_bitmap->nr_bits & 7) && (guest_bytes == copy_bytes) ) + bytemap[guest_bytes - 1] &= ~(0xff << (xenctl_bitmap->nr_bits & 7)); + } + + if ( !err ) + bitmap_byte_to_long(bitmap, bytemap, nbits); + + xfree(bytemap); + + return err; +} + +int cpumask_to_xenctl_bitmap(struct xenctl_bitmap *xenctl_cpumap, + const cpumask_t *cpumask) +{ + return bitmap_to_xenctl_bitmap(xenctl_cpumap, cpumask_bits(cpumask), + nr_cpu_ids); +} + +int xenctl_bitmap_to_cpumask(cpumask_var_t *cpumask, + const struct xenctl_bitmap *xenctl_cpumap) +{ + int err = 0; + + if ( alloc_cpumask_var(cpumask) ) + { + err = xenctl_bitmap_to_bitmap(cpumask_bits(*cpumask), xenctl_cpumap, + nr_cpu_ids); + /* In case of error, cleanup is up to us, as the caller won't care! */ + if ( err ) + free_cpumask_var(*cpumask); + } + else + err = -ENOMEM; + + return err; +} --- a/xen/common/domctl.c +++ b/xen/common/domctl.c @@ -34,91 +34,6 @@ static DEFINE_SPINLOCK(domctl_lock); -static int bitmap_to_xenctl_bitmap(struct xenctl_bitmap *xenctl_bitmap, - const unsigned long *bitmap, - unsigned int nbits) -{ - unsigned int guest_bytes, copy_bytes, i; - uint8_t zero = 0; - int err = 0; - uint8_t *bytemap = xmalloc_array(uint8_t, (nbits + 7) / 8); - - if ( !bytemap ) - return -ENOMEM; - - guest_bytes = (xenctl_bitmap->nr_bits + 7) / 8; - copy_bytes = min_t(unsigned int, guest_bytes, (nbits + 7) / 8); - - bitmap_long_to_byte(bytemap, bitmap, nbits); - - if ( copy_bytes != 0 ) - if ( copy_to_guest(xenctl_bitmap->bitmap, bytemap, copy_bytes) ) - err = -EFAULT; - - for ( i = copy_bytes; !err && i < guest_bytes; i++ ) - if ( copy_to_guest_offset(xenctl_bitmap->bitmap, i, &zero, 1) ) - err = -EFAULT; - - xfree(bytemap); - - return err; -} - -int xenctl_bitmap_to_bitmap(unsigned long *bitmap, - const struct xenctl_bitmap *xenctl_bitmap, - unsigned int nbits) -{ - unsigned int guest_bytes, copy_bytes; - int err = 0; - uint8_t *bytemap = xzalloc_array(uint8_t, (nbits + 7) / 8); - - if ( !bytemap ) - return -ENOMEM; - - guest_bytes = (xenctl_bitmap->nr_bits + 7) / 8; - copy_bytes = min_t(unsigned int, guest_bytes, (nbits + 7) / 8); - - if ( copy_bytes != 0 ) - { - if ( copy_from_guest(bytemap, xenctl_bitmap->bitmap, copy_bytes) ) - err = -EFAULT; - if ( (xenctl_bitmap->nr_bits & 7) && (guest_bytes == copy_bytes) ) - bytemap[guest_bytes-1] &= ~(0xff << (xenctl_bitmap->nr_bits & 7)); - } - - if ( !err ) - bitmap_byte_to_long(bitmap, bytemap, nbits); - - xfree(bytemap); - - return err; -} - -int cpumask_to_xenctl_bitmap(struct xenctl_bitmap *xenctl_cpumap, - const cpumask_t *cpumask) -{ - return bitmap_to_xenctl_bitmap(xenctl_cpumap, cpumask_bits(cpumask), - nr_cpu_ids); -} - -int xenctl_bitmap_to_cpumask(cpumask_var_t *cpumask, - const struct xenctl_bitmap *xenctl_cpumap) -{ - int err = 0; - - if ( alloc_cpumask_var(cpumask) ) { - err = xenctl_bitmap_to_bitmap(cpumask_bits(*cpumask), xenctl_cpumap, - nr_cpu_ids); - /* In case of error, cleanup is up to us, as the caller won't care! */ - if ( err ) - free_cpumask_var(*cpumask); - } - else - err = -ENOMEM; - - return err; -} - static int nodemask_to_xenctl_bitmap(struct xenctl_bitmap *xenctl_nodemap, const nodemask_t *nodemask) { --- a/xen/include/xen/bitmap.h +++ b/xen/include/xen/bitmap.h @@ -273,6 +273,13 @@ static inline void bitmap_clear(unsigned void bitmap_long_to_byte(uint8_t *bp, const unsigned long *lp, int nbits); void bitmap_byte_to_long(unsigned long *lp, const uint8_t *bp, int nbits); +struct xenctl_bitmap; +int xenctl_bitmap_to_bitmap(unsigned long *bitmap, + const struct xenctl_bitmap *xenctl_bitmap, + unsigned int nbits); +int bitmap_to_xenctl_bitmap(struct xenctl_bitmap *xenctl_bitmap, + const unsigned long *bitmap, unsigned int nbits); + #endif /* __ASSEMBLY__ */ #endif /* __XEN_BITMAP_H */ --- a/xen/include/xen/domain.h +++ b/xen/include/xen/domain.h @@ -27,9 +27,6 @@ struct xen_domctl_getdomaininfo; void getdomaininfo(struct domain *d, struct xen_domctl_getdomaininfo *info); void arch_get_domain_info(const struct domain *d, struct xen_domctl_getdomaininfo *info); -int xenctl_bitmap_to_bitmap(unsigned long *bitmap, - const struct xenctl_bitmap *xenctl_bitmap, - unsigned int nbits); /* * Arch-specifics.
There is no need for platform-wide, system-wide, or per-domain control in this case. Hence avoid including this dead code in the build. Signed-off-by: Jan Beulich <jbeulich@suse.com> Reviewed-by: Roger Pau Monné <roger.pau@citrix.com> --- a/xen/arch/x86/Makefile +++ b/xen/arch/x86/Makefile @@ -23,7 +23,6 @@ obj-$(CONFIG_GDBSX) += debug.o obj-y += delay.o obj-y += desc.o obj-bin-y += dmi_scan.init.o -obj-y += domctl.o obj-y += domain.o obj-bin-y += dom0_build.init.o obj-y += domain_page.o @@ -51,7 +50,6 @@ obj-y += numa.o obj-y += pci.o obj-y += percpu.o obj-y += physdev.o x86_64/physdev.o -obj-y += platform_hypercall.o x86_64/platform_hypercall.o obj-y += psr.o obj-y += setup.o obj-y += shutdown.o @@ -60,7 +58,6 @@ obj-y += smpboot.o obj-y += spec_ctrl.o obj-y += srat.o obj-y += string.o -obj-y += sysctl.o obj-y += time.o obj-y += trace.o obj-y += traps.o @@ -71,6 +68,13 @@ obj-$(CONFIG_TBOOT) += tboot.o obj-y += hpet.o obj-y += vm_event.o obj-y += xstate.o + +ifneq ($(CONFIG_PV_SHIM_EXCLUSIVE),y) +obj-y += domctl.o +obj-y += platform_hypercall.o x86_64/platform_hypercall.o +obj-y += sysctl.o +endif + extra-y += asm-macros.i ifneq ($(CONFIG_HVM),y) --- a/xen/arch/x86/mm/paging.c +++ b/xen/arch/x86/mm/paging.c @@ -47,6 +47,8 @@ /* Per-CPU variable for enforcing the lock ordering */ DEFINE_PER_CPU(int, mm_lock_level); +#ifndef CONFIG_PV_SHIM_EXCLUSIVE + /************************************************/ /* LOG DIRTY SUPPORT */ /************************************************/ @@ -628,6 +630,8 @@ void paging_log_dirty_init(struct domain d->arch.paging.log_dirty.ops = ops; } +#endif /* CONFIG_PV_SHIM_EXCLUSIVE */ + /************************************************/ /* CODE FOR PAGING SUPPORT */ /************************************************/ @@ -667,7 +671,7 @@ void paging_vcpu_init(struct vcpu *v) shadow_vcpu_init(v); } - +#ifndef CONFIG_PV_SHIM_EXCLUSIVE int paging_domctl(struct domain *d, struct xen_domctl_shadow_op *sc, XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl, bool_t resuming) @@ -788,6 +792,7 @@ long paging_domctl_continuation(XEN_GUES return ret; } +#endif /* CONFIG_PV_SHIM_EXCLUSIVE */ /* Call when destroying a domain */ int paging_teardown(struct domain *d) @@ -803,10 +808,12 @@ int paging_teardown(struct domain *d) if ( preempted ) return -ERESTART; +#ifndef CONFIG_PV_SHIM_EXCLUSIVE /* clean up log dirty resources. */ rc = paging_free_log_dirty_bitmap(d, 0); if ( rc == -ERESTART ) return rc; +#endif /* Move populate-on-demand cache back to domain_list for destruction */ rc = p2m_pod_empty_cache(d); --- a/xen/arch/x86/pv/hypercall.c +++ b/xen/arch/x86/pv/hypercall.c @@ -42,7 +42,9 @@ const hypercall_table_t pv_hypercall_tab COMPAT_CALL(set_callbacks), HYPERCALL(fpu_taskswitch), HYPERCALL(sched_op_compat), +#ifndef CONFIG_PV_SHIM_EXCLUSIVE COMPAT_CALL(platform_op), +#endif HYPERCALL(set_debugreg), HYPERCALL(get_debugreg), COMPAT_CALL(update_descriptor), @@ -72,8 +74,10 @@ const hypercall_table_t pv_hypercall_tab #endif HYPERCALL(event_channel_op), COMPAT_CALL(physdev_op), +#ifndef CONFIG_PV_SHIM_EXCLUSIVE HYPERCALL(sysctl), HYPERCALL(domctl), +#endif #ifdef CONFIG_KEXEC COMPAT_CALL(kexec_op), #endif @@ -89,7 +93,9 @@ const hypercall_table_t pv_hypercall_tab HYPERCALL(hypfs_op), #endif HYPERCALL(mca), +#ifndef CONFIG_PV_SHIM_EXCLUSIVE HYPERCALL(arch_1), +#endif }; #undef do_arch_1 --- a/xen/common/Makefile +++ b/xen/common/Makefile @@ -6,7 +6,6 @@ obj-$(CONFIG_CORE_PARKING) += core_parki obj-y += cpu.o obj-$(CONFIG_DEBUG_TRACE) += debugtrace.o obj-$(CONFIG_HAS_DEVICE_TREE) += device_tree.o -obj-y += domctl.o obj-y += domain.o obj-y += event_2l.o obj-y += event_channel.o @@ -26,7 +25,6 @@ obj-$(CONFIG_NEEDS_LIST_SORT) += list_so obj-$(CONFIG_LIVEPATCH) += livepatch.o livepatch_elf.o obj-$(CONFIG_MEM_ACCESS) += mem_access.o obj-y += memory.o -obj-y += monitor.o obj-y += multicall.o obj-y += notifier.o obj-y += page_alloc.o @@ -47,7 +45,6 @@ obj-y += spinlock.o obj-y += stop_machine.o obj-y += string.o obj-y += symbols.o -obj-y += sysctl.o obj-y += tasklet.o obj-y += time.o obj-y += timer.o @@ -66,6 +63,12 @@ obj-bin-$(CONFIG_X86) += $(foreach n,dec obj-$(CONFIG_COMPAT) += $(addprefix compat/,domain.o kernel.o memory.o multicall.o xlat.o) +ifneq ($(CONFIG_PV_SHIM_EXCLUSIVE),y) +obj-y += domctl.o +obj-y += monitor.o +obj-y += sysctl.o +endif + extra-y := symbols-dummy.o obj-$(CONFIG_COVERAGE) += coverage/ --- a/xen/include/asm-x86/paging.h +++ b/xen/include/asm-x86/paging.h @@ -154,6 +154,8 @@ struct paging_mode { /***************************************************************************** * Log dirty code */ +#ifndef CONFIG_PV_SHIM_EXCLUSIVE + /* get the dirty bitmap for a specific range of pfns */ void paging_log_dirty_range(struct domain *d, unsigned long begin_pfn, @@ -202,6 +204,15 @@ struct sh_dirty_vram { s_time_t last_dirty; }; +#else /* !CONFIG_PV_SHIM_EXCLUSIVE */ + +static inline void paging_log_dirty_init(struct domain *d, + const struct log_dirty_ops *ops) {} +static inline void paging_mark_dirty(struct domain *d, mfn_t gmfn) {} +static inline void paging_mark_pfn_dirty(struct domain *d, pfn_t pfn) {} + +#endif /* CONFIG_PV_SHIM_EXCLUSIVE */ + /***************************************************************************** * Entry points into the paging-assistance code */ --- a/xen/include/xen/domain.h +++ b/xen/include/xen/domain.h @@ -125,6 +125,10 @@ struct vnuma_info { struct xen_vmemrange *vmemrange; }; +#ifndef CONFIG_PV_SHIM_EXCLUSIVE void vnuma_destroy(struct vnuma_info *vnuma); +#else +static inline void vnuma_destroy(struct vnuma_info *vnuma) { ASSERT(!vnuma); } +#endif #endif /* __XEN_DOMAIN_H__ */
© 2016 - 2024 Red Hat, Inc.