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

Re: [Xen-devel] RFC/Proposal: Partial `libxenctrl` API/ABI stabilisation



On Mon, 2015-05-18 at 16:55 +0100, Andrew Cooper wrote:
> On 18/05/15 16:30, Ian Campbell wrote:
> > # Major External Consumers of `libxenctrl`
> >
> > * qemu
> > * kexec tools
> > * in guest tools e.g. users of `libxenstore`, `libvchan`, and by
> >   extension `grant table` and `event channel` functionality. NB:
> >   `libxenstore` is already `SSU` or `SSS` (XXX?)
> >
> > # `libxenctrl` symbols
> >
> > Gathered by:
> >
> >     nm tools/libxc/libxenctrl.so | grep ' [Tt] ' | cut -f 3 -d \ | sort -u
> >
> > `libxenctrl` today exposes many symbols which look to be internal. We
> > should consider also reducing that set by using
> > `__attribute__((visibility("hidden")))`.
> 
> Don't forget libxenguest.so which is built sharing some of the same
> source.  I suspect that quite a few of the libxenctrl symbols could move to

I added a similar section listing things exported by libxenguest.

I don't think libxenguest needs API/ABI stability adding to it at this
point, but it could certainly do with some rationalisation regarding the
split with libxenctrl and the use of its services.

> > The following proposes some functional groupings via some proposed
> > split library names. In some cases we may also wish to consider
> > replacing an API with one which can be properly maintained going
> > forwards. e.g.:
> >
> > - perhaps replacing domctl's used by qemu with new stable
> >   hypercall ABIs and reflecting that in new library APIs.
> > - perhaps exposing more constrained versions of some broad interfaces
> >   for external users.
> >
> > XXX: Change `xc_*` namespacing as well as library names?
> >
> > ## `libxenhypercall`
> >
> > Core open/close interface, "make a hypercall" functionality, hypercall
> > buffers.
> >
> > All other libraries likely depend on this. Applications do as well in
> > order to access open/close interface at least.
> >
> >     - xc_interface_close
> >     - xc_interface_is_fake (???)
> 
> This is used when running something wanting libxc on a non xen system. 
> e.g. readnotes which invokes the Xen elf parsing on a binary, but
> doesn't have any actual hypervisor interaction.

The ??? was whether this needs to be a stable symbol or not. I suspect
it may as well be regardless of whether it needs to be.

> 
> >     - xc_interface_open
> >     - xc_hypercall_buffer_array_create
> >     - xc_hypercall_buffer_array_destroy
> 
> There are surely more than this when it comes to hypercall buffers?

Yes. From the introduction to the document:
        XXX: I haven't yet done a full pass over the list of symbols in
        libxenctrl to categorise them and decide where they belong. I
        thought I would get some early feedback first and just picked a
        few representative examples for each library.

> One issue I have found with libxc in general is that a surprising
> quantity of code is in static inlines in header files, which ends up
> moving into the includee's code. (I had a particular problem with
> do_domctl() and the Xen Interface Version for a project I did a while back)

Yes. I think where possible we should either make these private or
expose them via non-inline functions, I don't think anything really
needs to be inlined.

> > ## `libxengnttab`
> >
> > Interacting with `/dev/xen/gnt{shr,alloc}`
> >
> > XXX two libs or one?
> >
> >     - xc_gntshr_close
> >     - xc_gntshr_munmap
> >     - xc_gntshr_open
> >     - xc_gntshr_share_page_notify
> >     - xc_gntshr_share_pages
> >     - xc_gnttab_close
> >     - xc_gnttab_get_version
> >     - xc_gnttab_map_domain_grant_refs
> >     - xc_gnttab_map_grant_ref
> >     - xc_gnttab_map_grant_ref_notify
> >     - xc_gnttab_map_grant_refs
> >     - xc_gnttab_map_table_v1
> >     - xc_gnttab_map_table_v2
> >     - xc_gnttab_munmap
> >     - xc_gnttab_op
> >     - xc_gnttab_open
> >     - xc_gnttab_set_max_grants
> 
> One probably, given how small it would be.

I agree.

My current diff vs. draft A is below, I'll await a bit more feedback
before posting a proper update.

Ian.

diff --git a/docs/misc/libxenctrl-functions.pandoc 
b/docs/misc/libxenctrl-functions.pandoc
index ef5ec49..56d93fd 100644
--- a/docs/misc/libxenctrl-functions.pandoc
+++ b/docs/misc/libxenctrl-functions.pandoc
@@ -89,6 +89,13 @@ libxenctrl first.
   extension `grant table` and `event channel` functionality. NB:
   `libxenstore` is already `SSU` or `SSS` (XXX?)
 
+# `libxenguest`
+
+Uses some of the same sources as `libxenctrl`. Could do with some
+rationalisation of what lives where.
+
+Not a candidate for API/ABI stabilith at this point.
+
 # `libxenctrl` symbols
 
 Gathered by:
@@ -97,7 +104,7 @@ Gathered by:
 
 `libxenctrl` today exposes many symbols which look to be internal. We
 should consider also reducing that set by using
-`__attribute__((visibility("hidden")))`.
+`__attribute__((visibility("hidden")))` or a version script.
 
 The following proposes some functional groupings via some proposed
 split library names. In some cases we may also wish to consider
@@ -111,6 +118,10 @@ forwards. e.g.:
 
 XXX: Change `xc_*` namespacing as well as library names?
 
+In additition to these there are many inlines in `xenctrl.h`. Where
+possible these should become either private functions or regular
+functions exported by the library.
+
 ## `libxenhypercall`
 
 Core open/close interface, "make a hypercall" functionality, hypercall
@@ -120,7 +131,7 @@ All other libraries likely depend on this. Applications do 
as well in
 order to access open/close interface at least.
 
     - xc_interface_close
-    - xc_interface_is_fake (???)
+    - xc_interface_is_fake
     - xc_interface_open
     - xc_hypercall_buffer_array_create
     - xc_hypercall_buffer_array_destroy
@@ -147,8 +158,6 @@ Interacting with `/dev/xen/evtchn`
 
 Interacting with `/dev/xen/gnt{shr,alloc}`
 
-XXX two libs or one?
-
     - xc_gntshr_close
     - xc_gntshr_munmap
     - xc_gntshr_open
@@ -627,6 +636,399 @@ XXX Lots of this should be internal/hidden
     - xc_interface_close_common
     - xc_interface_open_common
 
+# `libxenguest` symbols
+
+Gathered by:
+
+    $ nm tools/libxc/libxenguest.so | grep ' [Tt] ' | cut -f 3 -d \ | sort -u
+
+    - add_full_page
+    - add_to_batch
+    - alloc_magic_pages
+    - alloc_str
+    - alloc_superpage_mfns
+    - amd_xc_cpuid_policy
+    - analysis_phase
+    - apply_batch
+    - arch_setup_bootearly
+    - arch_setup_bootlate
+    - arch_setup_meminit
+    - backup_ptes
+    - bitmap_alloc
+    - bitmap_clear
+    - bitmap_or
+    - bitmap_size
+    - buffer_qemu
+    - buffer_tail
+    - buffer_tail_hvm
+    - buffer_tail_pv
+    - build_assertions
+    - build_hvm_info
+    - call_gmon_start
+    - canonicalize_pagetable
+    - change_pte
+    - check_elf_kernel
+    - check_magic
+    - check_mmio_hole
+    - clear_bit
+    - clear_page
+    - __clear_pte
+    - clear_pte
+    - compat_buffer_qemu
+    - compress_page
+    - copy_mfns_from_guest
+    - count_pgtables
+    - count_pgtables_x86_32_pae
+    - count_pgtables_x86_64
+    - cpuid
+    - cr3_to_mfn
+    - csum_page
+    - deregister_tm_clones
+    - dhdr_type_to_str
+    - do_domctl
+    - __do_global_dtors_aux
+    - __do_global_dtors_aux_fini_array_entry
+    - dump_bad_pseudophysmap_entry
+    - dump_qemu
+    - elf_access_ok
+    - elf_access_unsigned
+    - ELF_ADVANCE_DEST
+    - elf_call_log_callback
+    - elf_check_broken
+    - elf_get_ptr
+    - elf_init
+    - elf_is_elfbinary
+    - elf_load_binary
+    - elf_load_bsdsyms
+    - elf_load_image
+    - elf_lookup_addr
+    - elf_mark_broken
+    - elf_memcpy_safe
+    - elf_memcpy_unchecked
+    - elf_memmove_unchecked
+    - elf_memset_safe
+    - elf_memset_unchecked
+    - elf_note_desc
+    - elf_note_name
+    - elf_note_next
+    - elf_note_numeric
+    - elf_note_numeric_array
+    - elf_parse_binary
+    - elf_parse_bsdsyms
+    - elf_phdr_by_index
+    - elf_phdr_count
+    - elf_phdr_is_loadable
+    - elf_ptrval_in_range
+    - elf_round_up
+    - elf_section_end
+    - elf_section_name
+    - elf_section_start
+    - elf_segment_end
+    - elf_segment_start
+    - elf_set_log
+    - elf_shdr_by_index
+    - elf_shdr_by_name
+    - elf_shdr_count
+    - elf_strfmt
+    - elf_strval
+    - elf_sym_by_index
+    - elf_sym_by_name
+    - elf_xen_addr_calc_check
+    - elf_xen_feature_get
+    - elf_xen_feature_set
+    - elf_xen_note_check
+    - elf_xen_parse
+    - elf_xen_parse_features
+    - elf_xen_parse_guest_info
+    - elf_xen_parse_note
+    - elf_xen_parse_notes
+    - enable_logdirty
+    - expand_p2m
+    - find_table
+    - _fini
+    - flush_batch
+    - frame_dummy
+    - __frame_dummy_init_array_entry
+    - fstat
+    - __fstat
+    - get_cache_page
+    - get_platform_info
+    - get_suspend_file
+    - get_unaligned_le16
+    - get_unaligned_le32
+    - handle_hvm_context
+    - handle_hvm_params
+    - handle_page_data
+    - handle_qemu
+    - handle_shared_info
+    - handle_toolstack
+    - handle_tsc_info
+    - handle_x86_pv_info
+    - handle_x86_pv_p2m_frames
+    - handle_x86_pv_vcpu_blob
+    - _init
+    - intel_xc_cpuid_policy
+    - invalidate_cache_page
+    - is_page_exchangable
+    - launch_vm
+    - le16_to_cpup
+    - le32_to_cpup
+    - llgettimeofday
+    - loadelfimage
+    - loadmodules
+    - load_p2m_frame_list
+    - lock_suspend_event
+    - log_callback
+    - lz4_decompress_unknownoutputsize
+    - lz4_uncompress_unknownoutputsize
+    - map_and_save_p2m_table
+    - map_frame_list_list
+    - map_grant_table_frames
+    - map_p2m
+    - map_shinfo
+    - merge_pte
+    - mfn_in_pseudophysmap
+    - mfn_to_cr3
+    - mfn_to_pfn
+    - modules_init
+    - move_l3_below_4G
+    - noncached_write
+    - normalise_pagetable
+    - nr_page_tables
+    - outbuf_flush
+    - outbuf_free
+    - outbuf_hardwrite
+    - outbuf_init
+    - outbuf_write
+    - pagebuf_free
+    - pagebuf_get
+    - pagebuf_get_one
+    - pagebuf_init
+    - pfn_is_populated
+    - pfn_set_populated
+    - pfn_to_mfn
+    - pin_pagetables
+    - pin_table
+    - populate_pfns
+    - print_mem
+    - print_stats
+    - process_page_data
+    - process_start_info
+    - process_vcpu_basic
+    - process_vcpu_extended
+    - process_vcpu_msrs
+    - process_vcpu_xsave
+    - pte_to_frame
+    - rdexact
+    - read_headers
+    - read_record
+    - rec_type_to_str
+    - register_arch_hooks
+    - register_loader
+    - register_tm_clones
+    - restore
+    - save
+    - save_tsc_info
+    - send_all_pages
+    - send_domain_memory_live
+    - send_domain_memory_nonlive
+    - send_some_pages
+    - set_bit
+    - setup_guest
+    - setup_hypercall_page
+    - setup_pgtables_x86_32_pae
+    - setup_pgtables_x86_64
+    - shared_info_x86_32
+    - shared_info_x86_64
+    - start_info_x86_32
+    - start_info_x86_64
+    - stat
+    - __stat
+    - suspend_and_state
+    - suspend_domain
+    - tailbuf_free
+    - tailbuf_free_hvm
+    - tailbuf_free_pv
+    - test_bit
+    - tv_delta
+    - tv_to_us
+    - uncanonicalize_pagetable
+    - unlock_suspend_event
+    - update_guest_p2m
+    - update_progress_string
+    - __update_pte
+    - update_pte
+    - update_vcpu_context
+    - VALGRIND_PRINTF
+    - VALGRIND_PRINTF_BACKTRACE
+    - vcpu_x86_32
+    - vcpu_x86_64
+    - write_all_vcpu_information
+    - write_batch
+    - write_buffer
+    - write_compressed
+    - write_end_record
+    - write_headers
+    - write_hvm_context
+    - write_hvm_params
+    - write_one_vcpu_basic
+    - write_one_vcpu_extended
+    - write_one_vcpu_msrs
+    - write_one_vcpu_xsave
+    - write_record
+    - write_shared_info
+    - write_split_record
+    - write_toolstack
+    - write_tsc_info
+    - write_uncached
+    - write_x86_pv_info
+    - write_x86_pv_p2m_frames
+    - x86_compat
+    - x86_hvm_cleanup
+    - x86_hvm_end_of_stream
+    - x86_hvm_localise_page
+    - x86_hvm_normalise_page
+    - x86_hvm_pfn_is_valid
+    - x86_hvm_pfn_to_gfn
+    - x86_hvm_process_record
+    - x86_hvm_set_gfn
+    - x86_hvm_set_page_type
+    - x86_hvm_setup
+    - x86_hvm_start_of_stream
+    - x86_hvm_stream_complete
+    - x86_pv_cleanup
+    - x86_pv_domain_info
+    - x86_pv_end_of_stream
+    - x86_pv_localise_page
+    - x86_pv_map_m2p
+    - x86_pv_normalise_page
+    - x86_pv_pfn_is_valid
+    - x86_pv_pfn_to_gfn
+    - x86_pv_process_record
+    - x86_pv_set_gfn
+    - x86_pv_set_page_type
+    - x86_pv_setup
+    - x86_pv_start_of_stream
+    - x86_pv_stream_complete
+    - x86_shadow
+    - xc_await_suspend
+    - xc_clear_domain_page
+    - xc_compression_add_page
+    - xc_compression_compress_pages
+    - xc_compression_create_context
+    - xc_compression_free_context
+    - xc_compression_reset_pagebuf
+    - xc_compression_uncompress_page
+    - xc_cpuid_apply_policy
+    - xc_cpuid_brand_get
+    - xc_cpuid_check
+    - xc_cpuid_config_xsave
+    - xc_cpuid_do_domctl
+    - xc_cpuid_hvm_policy
+    - xc_cpuid_policy
+    - xc_cpuid_pv_policy
+    - xc_cpuid_set
+    - xc_cpuid_to_str
+    - xc_domain_get_native_protocol
+    - xc_domain_restore
+    - xc_domain_restore2
+    - xc_domain_save
+    - xc_domain_save2
+    - xc_dom_allocate
+    - xc_dom_alloc_page
+    - xc_dom_alloc_segment
+    - xc_dom_boot_domU_map
+    - xc_dom_boot_image
+    - xc_dom_boot_mem_init
+    - xc_dom_boot_xen_init
+    - xc_dom_build_image
+    - xc_dom_check_gzip
+    - xc_dom_compat_check
+    - xc_dom_devicetree_file
+    - xc_dom_devicetree_max_size
+    - xc_dom_devicetree_mem
+    - xc_dom_do_gunzip
+    - xc_dom_feature_translated
+    - xc_dom_find_arch_hooks
+    - xc_dom_find_loader
+    - xc_dom_free_all
+    - xc_dom_gnttab_hvm_seed
+    - xc_dom_gnttab_init
+    - xc_dom_gnttab_seed
+    - xc_dom_gnttab_setup
+    - xc_dom_guest_type
+    - xc_dom_kernel_check_size
+    - xc_dom_kernel_file
+    - xc_dom_kernel_max_size
+    - xc_dom_kernel_mem
+    - xc_dom_linux_build
+    - xc_dom_load_bin_kernel
+    - xc_dom_load_bzimage_kernel
+    - xc_dom_load_elf_kernel
+    - xc_dom_load_elf_symtab
+    - xc_dom_loginit
+    - xc_dom_log_memory_footprint
+    - xc_dom_malloc
+    - xc_dom_malloc_filemap
+    - xc_dom_malloc_page_aligned
+    - xc_dom_mem_init
+    - xc_dom_p2m_guest
+    - xc_dom_p2m_host
+    - xc_dom_panic_func
+    - xc_dom_parse_bin_kernel
+    - xc_dom_parse_bzimage_kernel
+    - xc_dom_parse_elf_kernel
+    - xc_dom_parse_image
+    - xc_dom_pfn_to_ptr
+    - xc_dom_pfn_to_ptr_retcount
+    - xc_dom_printf
+    - xc_dom_probe_bin_kernel
+    - xc_dom_probe_bzimage_kernel
+    - xc_dom_probe_elf_kernel
+    - xc_dom_rambase_init
+    - xc_dom_ramdisk_check_size
+    - xc_dom_ramdisk_file
+    - xc_dom_ramdisk_max_size
+    - xc_dom_ramdisk_mem
+    - xc_dom_register_arch_hooks
+    - xc_dom_register_external
+    - xc_dom_register_loader
+    - xc_dom_release
+    - xc_dom_seg_to_ptr
+    - xc_dom_seg_to_ptr_pages
+    - xc_dom_strdup
+    - xc_dom_try_gunzip
+    - xc_dom_unmap_all
+    - xc_dom_unmap_one
+    - xc_dom_update_guest_p2m
+    - xc_dom_vaddr_to_ptr
+    - xc_elf_set_logfile
+    - xc_exchange_page
+    - xc_get_bit_size
+    - xc_hvm_build
+    - xc_hvm_build_target_mem
+    - xc_inflate_buffer
+    - xc_is_page_granted_v1
+    - xc_is_page_granted_v2
+    - xc_linux_build
+    - xc_linux_build_internal
+    - xc_linux_build_mem
+    - xc_map_m2p
+    - xc_mark_page_offline
+    - xc_mark_page_online
+    - xc_pfn_to_mfn
+    - xc_query_page_offline_status
+    - xc_read_image
+    - xc_suspend_evtchn_init_exclusive
+    - xc_suspend_evtchn_init_sane
+    - xc_suspend_evtchn_release
+    - xc_try_bzip2_decode
+    - xc_try_lz4_decode
+    - _xc_try_lzma_decode
+    - xc_try_lzma_decode
+    - xc_try_lzo1x_decode
+    - xc_try_xz_decode
+
 # Symbols used by qemu
 
     $ nm tools/qemu-xen-dir-remote/i386-softmmu/qemu-system-i386 | grep 
\\bU.xc_



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

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