2015-02-02 17:40:20 +00:00
|
|
|
DPDK_2.0 {
|
|
|
|
global:
|
|
|
|
|
|
|
|
__rte_panic;
|
|
|
|
devargs_list;
|
|
|
|
eal_parse_sysfs_value;
|
|
|
|
eal_timer_source;
|
|
|
|
lcore_config;
|
|
|
|
per_lcore__lcore_id;
|
|
|
|
per_lcore__rte_errno;
|
2015-07-15 16:32:20 +00:00
|
|
|
rte_calloc;
|
|
|
|
rte_calloc_socket;
|
2015-02-02 17:40:20 +00:00
|
|
|
rte_cpu_check_supported;
|
|
|
|
rte_cpu_get_flag_enabled;
|
|
|
|
rte_cycles_vmware_tsc_map;
|
|
|
|
rte_delay_us;
|
|
|
|
rte_dump_physmem_layout;
|
|
|
|
rte_dump_registers;
|
|
|
|
rte_dump_stack;
|
|
|
|
rte_dump_tailq;
|
|
|
|
rte_eal_alarm_cancel;
|
|
|
|
rte_eal_alarm_set;
|
|
|
|
rte_eal_devargs_add;
|
|
|
|
rte_eal_devargs_dump;
|
|
|
|
rte_eal_devargs_type_count;
|
|
|
|
rte_eal_get_configuration;
|
|
|
|
rte_eal_get_lcore_state;
|
|
|
|
rte_eal_get_physmem_size;
|
|
|
|
rte_eal_has_hugepages;
|
|
|
|
rte_eal_hpet_init;
|
|
|
|
rte_eal_init;
|
2015-02-12 15:40:54 +00:00
|
|
|
rte_eal_iopl_init;
|
2015-02-02 17:40:20 +00:00
|
|
|
rte_eal_lcore_role;
|
|
|
|
rte_eal_mp_remote_launch;
|
|
|
|
rte_eal_mp_wait_lcore;
|
2015-06-30 08:26:51 +00:00
|
|
|
rte_eal_parse_devargs_str;
|
2015-02-02 17:40:20 +00:00
|
|
|
rte_eal_process_type;
|
|
|
|
rte_eal_remote_launch;
|
|
|
|
rte_eal_tailq_lookup;
|
2015-03-04 21:50:07 +00:00
|
|
|
rte_eal_tailq_register;
|
2015-02-02 17:40:20 +00:00
|
|
|
rte_eal_wait_lcore;
|
|
|
|
rte_exit;
|
2015-07-15 16:32:20 +00:00
|
|
|
rte_free;
|
2015-02-02 17:40:20 +00:00
|
|
|
rte_get_hpet_cycles;
|
|
|
|
rte_get_hpet_hz;
|
|
|
|
rte_get_tsc_hz;
|
|
|
|
rte_hexdump;
|
|
|
|
rte_intr_callback_register;
|
|
|
|
rte_intr_callback_unregister;
|
|
|
|
rte_intr_disable;
|
|
|
|
rte_intr_enable;
|
|
|
|
rte_log;
|
|
|
|
rte_log_cur_msg_loglevel;
|
|
|
|
rte_log_cur_msg_logtype;
|
|
|
|
rte_logs;
|
2015-07-15 16:32:20 +00:00
|
|
|
rte_malloc;
|
|
|
|
rte_malloc_dump_stats;
|
|
|
|
rte_malloc_get_socket_stats;
|
|
|
|
rte_malloc_set_limit;
|
|
|
|
rte_malloc_socket;
|
|
|
|
rte_malloc_validate;
|
2015-02-02 17:40:20 +00:00
|
|
|
rte_mem_lock_page;
|
|
|
|
rte_mem_virt2phy;
|
|
|
|
rte_memdump;
|
|
|
|
rte_memory_get_nchannel;
|
|
|
|
rte_memory_get_nrank;
|
|
|
|
rte_memzone_dump;
|
|
|
|
rte_memzone_lookup;
|
|
|
|
rte_memzone_reserve;
|
|
|
|
rte_memzone_reserve_aligned;
|
|
|
|
rte_memzone_reserve_bounded;
|
|
|
|
rte_memzone_walk;
|
|
|
|
rte_openlog_stream;
|
2015-07-15 16:32:20 +00:00
|
|
|
rte_realloc;
|
2015-02-02 17:40:20 +00:00
|
|
|
rte_set_application_usage_hook;
|
2015-02-27 12:33:13 +00:00
|
|
|
rte_socket_id;
|
2015-02-02 17:40:20 +00:00
|
|
|
rte_strerror;
|
|
|
|
rte_strsplit;
|
2015-02-25 03:39:48 +00:00
|
|
|
rte_sys_gettid;
|
2015-02-17 02:08:03 +00:00
|
|
|
rte_thread_get_affinity;
|
|
|
|
rte_thread_set_affinity;
|
2015-02-02 17:40:20 +00:00
|
|
|
rte_vlog;
|
2015-07-15 16:32:20 +00:00
|
|
|
rte_zmalloc;
|
|
|
|
rte_zmalloc_socket;
|
2015-02-02 17:40:20 +00:00
|
|
|
|
|
|
|
local: *;
|
|
|
|
};
|
2015-07-15 16:32:25 +00:00
|
|
|
|
|
|
|
DPDK_2.1 {
|
|
|
|
global:
|
|
|
|
|
2017-10-19 16:36:26 +00:00
|
|
|
rte_epoll_ctl;
|
|
|
|
rte_epoll_wait;
|
2015-07-20 03:02:22 +00:00
|
|
|
rte_intr_allow_others;
|
|
|
|
rte_intr_dp_is_en;
|
|
|
|
rte_intr_efd_disable;
|
|
|
|
rte_intr_efd_enable;
|
2015-07-20 03:02:19 +00:00
|
|
|
rte_intr_rx_ctl;
|
2017-10-19 16:36:26 +00:00
|
|
|
rte_intr_tls_epfd;
|
2015-07-15 16:32:25 +00:00
|
|
|
rte_memzone_free;
|
2015-07-18 18:35:57 +00:00
|
|
|
|
2015-07-15 16:32:25 +00:00
|
|
|
} DPDK_2.0;
|
2015-11-04 08:45:34 +00:00
|
|
|
|
|
|
|
DPDK_2.2 {
|
|
|
|
global:
|
|
|
|
|
|
|
|
rte_intr_cap_multiple;
|
2015-11-18 14:05:14 +00:00
|
|
|
rte_keepalive_create;
|
|
|
|
rte_keepalive_dispatch_pings;
|
|
|
|
rte_keepalive_mark_alive;
|
|
|
|
rte_keepalive_register_core;
|
2015-11-04 08:45:34 +00:00
|
|
|
|
2015-11-18 14:05:14 +00:00
|
|
|
} DPDK_2.1;
|
2016-01-28 12:20:23 +00:00
|
|
|
|
2016-03-01 07:45:38 +00:00
|
|
|
DPDK_16.04 {
|
2016-01-28 12:20:23 +00:00
|
|
|
global:
|
|
|
|
|
2016-02-02 22:59:49 +00:00
|
|
|
rte_cpu_get_flag_name;
|
2016-03-09 13:37:25 +00:00
|
|
|
rte_eal_primary_proc_alive;
|
2016-01-28 12:20:23 +00:00
|
|
|
|
|
|
|
} DPDK_2.2;
|
2016-06-13 15:07:44 +00:00
|
|
|
|
|
|
|
DPDK_16.07 {
|
|
|
|
global:
|
|
|
|
|
2016-06-20 09:59:00 +00:00
|
|
|
rte_keepalive_mark_sleep;
|
2016-06-17 15:00:22 +00:00
|
|
|
rte_keepalive_register_relay_callback;
|
2016-07-14 13:27:29 +00:00
|
|
|
rte_rtm_supported;
|
2016-06-17 12:48:16 +00:00
|
|
|
rte_thread_setname;
|
2016-06-13 15:07:44 +00:00
|
|
|
|
|
|
|
} DPDK_16.04;
|
2016-09-26 08:35:09 +00:00
|
|
|
|
|
|
|
DPDK_16.11 {
|
|
|
|
global:
|
|
|
|
|
|
|
|
rte_delay_us_block;
|
|
|
|
rte_delay_us_callback_register;
|
2016-09-20 12:41:24 +00:00
|
|
|
rte_eal_dev_attach;
|
|
|
|
rte_eal_dev_detach;
|
2016-09-26 08:35:09 +00:00
|
|
|
|
|
|
|
} DPDK_16.07;
|
2017-01-18 14:05:17 +00:00
|
|
|
|
|
|
|
DPDK_17.02 {
|
|
|
|
global:
|
|
|
|
|
|
|
|
rte_bus_dump;
|
2017-01-18 14:05:22 +00:00
|
|
|
rte_bus_probe;
|
2017-01-18 14:05:17 +00:00
|
|
|
rte_bus_register;
|
2017-01-18 14:05:21 +00:00
|
|
|
rte_bus_scan;
|
2017-01-18 14:05:17 +00:00
|
|
|
rte_bus_unregister;
|
|
|
|
|
|
|
|
} DPDK_16.11;
|
2017-04-04 16:40:33 +00:00
|
|
|
|
|
|
|
DPDK_17.05 {
|
|
|
|
global:
|
|
|
|
|
2017-04-04 15:38:57 +00:00
|
|
|
rte_cpu_is_supported;
|
2017-10-19 16:36:26 +00:00
|
|
|
rte_intr_free_epoll_fd;
|
2017-04-04 16:40:34 +00:00
|
|
|
rte_log_dump;
|
2017-04-04 16:40:37 +00:00
|
|
|
rte_log_get_global_level;
|
2017-10-19 16:36:26 +00:00
|
|
|
rte_log_register;
|
2017-04-04 16:40:37 +00:00
|
|
|
rte_log_set_global_level;
|
2017-04-04 16:40:33 +00:00
|
|
|
rte_log_set_level;
|
2017-04-04 16:40:35 +00:00
|
|
|
rte_log_set_level_regexp;
|
2017-04-11 13:37:13 +00:00
|
|
|
vfio_get_container_fd;
|
|
|
|
vfio_get_group_fd;
|
|
|
|
vfio_get_group_no;
|
2017-04-04 16:40:33 +00:00
|
|
|
|
|
|
|
} DPDK_17.02;
|
2017-06-30 18:19:30 +00:00
|
|
|
|
|
|
|
DPDK_17.08 {
|
|
|
|
global:
|
|
|
|
|
|
|
|
rte_bus_find;
|
2017-06-30 18:19:35 +00:00
|
|
|
rte_bus_find_by_device;
|
2017-06-30 18:19:37 +00:00
|
|
|
rte_bus_find_by_name;
|
2017-07-22 20:07:33 +00:00
|
|
|
rte_log_get_level;
|
2017-06-30 18:19:30 +00:00
|
|
|
|
|
|
|
} DPDK_17.05;
|
2017-06-30 18:19:41 +00:00
|
|
|
|
2017-10-25 12:29:49 +00:00
|
|
|
DPDK_17.11 {
|
|
|
|
global:
|
|
|
|
|
|
|
|
rte_eal_create_uio_dev;
|
|
|
|
rte_bus_get_iommu_class;
|
|
|
|
rte_eal_has_pci;
|
|
|
|
rte_eal_iova_mode;
|
|
|
|
rte_eal_mbuf_default_mempool_ops;
|
|
|
|
rte_eal_using_phys_addrs;
|
|
|
|
rte_eal_vfio_intr_mode;
|
|
|
|
rte_lcore_has_role;
|
|
|
|
rte_malloc_virt2iova;
|
|
|
|
rte_mem_virt2iova;
|
|
|
|
rte_vfio_enable;
|
|
|
|
rte_vfio_is_enabled;
|
|
|
|
rte_vfio_noiommu_is_enabled;
|
|
|
|
rte_vfio_release_device;
|
|
|
|
rte_vfio_setup_device;
|
|
|
|
|
|
|
|
} DPDK_17.08;
|
|
|
|
|
2017-11-30 21:27:01 +00:00
|
|
|
DPDK_18.02 {
|
|
|
|
global:
|
|
|
|
|
|
|
|
rte_hypervisor_get;
|
|
|
|
rte_hypervisor_get_name;
|
2018-01-15 05:11:25 +00:00
|
|
|
rte_vfio_clear_group;
|
2018-01-26 05:04:49 +00:00
|
|
|
rte_reciprocal_value;
|
2018-01-26 05:04:50 +00:00
|
|
|
rte_reciprocal_value_u64;
|
|
|
|
|
|
|
|
} DPDK_17.11;
|
2017-11-30 21:27:01 +00:00
|
|
|
|
2017-06-30 18:19:41 +00:00
|
|
|
EXPERIMENTAL {
|
|
|
|
global:
|
|
|
|
|
2018-01-29 16:37:30 +00:00
|
|
|
rte_eal_cleanup;
|
2017-07-15 17:56:37 +00:00
|
|
|
rte_eal_devargs_insert;
|
2017-07-07 00:04:33 +00:00
|
|
|
rte_eal_devargs_parse;
|
2017-07-15 17:56:36 +00:00
|
|
|
rte_eal_devargs_remove;
|
2017-06-30 18:19:41 +00:00
|
|
|
rte_eal_hotplug_add;
|
|
|
|
rte_eal_hotplug_remove;
|
2018-02-02 08:03:01 +00:00
|
|
|
rte_eal_mbuf_user_pool_ops;
|
eal: add shared indexed file-backed array
rte_fbarray is a simple indexed array stored in shared memory
via mapping files into memory. Rationale for its existence is the
following: since we are going to map memory page-by-page, there
could be quite a lot of memory segments to keep track of (for
smaller page sizes, page count can easily reach thousands). We
can't really make page lists truly dynamic and infinitely expandable,
because that involves reallocating memory (which is a big no-no in
multiprocess). What we can do instead is have a maximum capacity as
something really, really large, and decide at allocation time how
big the array is going to be. We map the entire file into memory,
which makes it possible to use fbarray as shared memory, provided
the structure itself is allocated in shared memory. Per-fbarray
locking is also used to avoid index data races (but not contents
data races - that is up to user application to synchronize).
In addition, in understanding that we will frequently need to scan
this array for free space and iterating over array linearly can
become slow, rte_fbarray provides facilities to index array's
usage. The following use cases are covered:
- find next free/used slot (useful either for adding new elements
to fbarray, or walking the list)
- find starting index for next N free/used slots (useful for when
we want to allocate chunk of VA-contiguous memory composed of
several pages)
- find how many contiguous free/used slots there are, starting
from specified index (useful for when we want to figure out
how many pages we have until next hole in allocated memory, to
speed up some bulk operations where we would otherwise have to
walk the array and add pages one by one)
This is accomplished by storing a usage mask in-memory, right
after the data section of the array, and using some bit-level
magic to figure out the info we need.
Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
Tested-by: Santosh Shukla <santosh.shukla@caviumnetworks.com>
Tested-by: Hemant Agrawal <hemant.agrawal@nxp.com>
Tested-by: Gowrishankar Muthukrishnan <gowrishankar.m@linux.vnet.ibm.com>
2018-04-11 12:30:23 +00:00
|
|
|
rte_fbarray_attach;
|
|
|
|
rte_fbarray_destroy;
|
|
|
|
rte_fbarray_detach;
|
|
|
|
rte_fbarray_dump_metadata;
|
|
|
|
rte_fbarray_find_idx;
|
|
|
|
rte_fbarray_find_next_free;
|
|
|
|
rte_fbarray_find_next_used;
|
|
|
|
rte_fbarray_find_next_n_free;
|
|
|
|
rte_fbarray_find_next_n_used;
|
|
|
|
rte_fbarray_find_contig_free;
|
|
|
|
rte_fbarray_find_contig_used;
|
|
|
|
rte_fbarray_get;
|
|
|
|
rte_fbarray_init;
|
|
|
|
rte_fbarray_is_used;
|
|
|
|
rte_fbarray_set_free;
|
|
|
|
rte_fbarray_set_used;
|
2018-03-21 11:28:16 +00:00
|
|
|
rte_log_register_type_and_pick_level;
|
2018-04-11 12:29:39 +00:00
|
|
|
rte_malloc_dump_heaps;
|
2018-04-11 12:30:11 +00:00
|
|
|
rte_mem_iova2virt;
|
2018-04-11 12:30:15 +00:00
|
|
|
rte_mem_virt2memseg;
|
mem: replace memseg with memseg lists
Before, we were aggregating multiple pages into one memseg, so the
number of memsegs was small. Now, each page gets its own memseg,
so the list of memsegs is huge. To accommodate the new memseg list
size and to keep the under-the-hood workings sane, the memseg list
is now not just a single list, but multiple lists. To be precise,
each hugepage size available on the system gets one or more memseg
lists, per socket.
In order to support dynamic memory allocation, we reserve all
memory in advance (unless we're in 32-bit legacy mode, in which
case we do not preallocate memory). As in, we do an anonymous
mmap() of the entire maximum size of memory per hugepage size, per
socket (which is limited to either RTE_MAX_MEMSEG_PER_TYPE pages or
RTE_MAX_MEM_MB_PER_TYPE megabytes worth of memory, whichever is the
smaller one), split over multiple lists (which are limited to
either RTE_MAX_MEMSEG_PER_LIST memsegs or RTE_MAX_MEM_MB_PER_LIST
megabytes per list, whichever is the smaller one). There is also
a global limit of CONFIG_RTE_MAX_MEM_MB megabytes, which is mainly
used for 32-bit targets to limit amounts of preallocated memory,
but can be used to place an upper limit on total amount of VA
memory that can be allocated by DPDK application.
So, for each hugepage size, we get (by default) up to 128G worth
of memory, per socket, split into chunks of up to 32G in size.
The address space is claimed at the start, in eal_common_memory.c.
The actual page allocation code is in eal_memalloc.c (Linux-only),
and largely consists of copied EAL memory init code.
Pages in the list are also indexed by address. That is, in order
to figure out where the page belongs, one can simply look at base
address for a memseg list. Similarly, figuring out IOVA address
of a memzone is a matter of finding the right memseg list, getting
offset and dividing by page size to get the appropriate memseg.
This commit also removes rte_eal_dump_physmem_layout() call,
according to deprecation notice [1], and removes that deprecation
notice as well.
On 32-bit targets due to limited VA space, DPDK will no longer
spread memory to different sockets like before. Instead, it will
(by default) allocate all of the memory on socket where master
lcore is. To override this behavior, --socket-mem must be used.
The rest of the changes are really ripple effects from the memseg
change - heap changes, compile fixes, and rewrites to support
fbarray-backed memseg lists. Due to earlier switch to _walk()
functions, most of the changes are simple fixes, however some
of the _walk() calls were switched to memseg list walk, where
it made sense to do so.
Additionally, we are also switching locks from flock() to fcntl().
Down the line, we will be introducing single-file segments option,
and we cannot use flock() locks to lock parts of the file. Therefore,
we will use fcntl() locks for legacy mem as well, in case someone is
unfortunate enough to accidentally start legacy mem primary process
alongside an already working non-legacy mem-based primary process.
[1] http://dpdk.org/dev/patchwork/patch/34002/
Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
Tested-by: Santosh Shukla <santosh.shukla@caviumnetworks.com>
Tested-by: Hemant Agrawal <hemant.agrawal@nxp.com>
Tested-by: Gowrishankar Muthukrishnan <gowrishankar.m@linux.vnet.ibm.com>
2018-04-11 12:30:24 +00:00
|
|
|
rte_mem_virt2memseg_list;
|
2018-04-11 12:30:09 +00:00
|
|
|
rte_memseg_contig_walk;
|
mem: replace memseg with memseg lists
Before, we were aggregating multiple pages into one memseg, so the
number of memsegs was small. Now, each page gets its own memseg,
so the list of memsegs is huge. To accommodate the new memseg list
size and to keep the under-the-hood workings sane, the memseg list
is now not just a single list, but multiple lists. To be precise,
each hugepage size available on the system gets one or more memseg
lists, per socket.
In order to support dynamic memory allocation, we reserve all
memory in advance (unless we're in 32-bit legacy mode, in which
case we do not preallocate memory). As in, we do an anonymous
mmap() of the entire maximum size of memory per hugepage size, per
socket (which is limited to either RTE_MAX_MEMSEG_PER_TYPE pages or
RTE_MAX_MEM_MB_PER_TYPE megabytes worth of memory, whichever is the
smaller one), split over multiple lists (which are limited to
either RTE_MAX_MEMSEG_PER_LIST memsegs or RTE_MAX_MEM_MB_PER_LIST
megabytes per list, whichever is the smaller one). There is also
a global limit of CONFIG_RTE_MAX_MEM_MB megabytes, which is mainly
used for 32-bit targets to limit amounts of preallocated memory,
but can be used to place an upper limit on total amount of VA
memory that can be allocated by DPDK application.
So, for each hugepage size, we get (by default) up to 128G worth
of memory, per socket, split into chunks of up to 32G in size.
The address space is claimed at the start, in eal_common_memory.c.
The actual page allocation code is in eal_memalloc.c (Linux-only),
and largely consists of copied EAL memory init code.
Pages in the list are also indexed by address. That is, in order
to figure out where the page belongs, one can simply look at base
address for a memseg list. Similarly, figuring out IOVA address
of a memzone is a matter of finding the right memseg list, getting
offset and dividing by page size to get the appropriate memseg.
This commit also removes rte_eal_dump_physmem_layout() call,
according to deprecation notice [1], and removes that deprecation
notice as well.
On 32-bit targets due to limited VA space, DPDK will no longer
spread memory to different sockets like before. Instead, it will
(by default) allocate all of the memory on socket where master
lcore is. To override this behavior, --socket-mem must be used.
The rest of the changes are really ripple effects from the memseg
change - heap changes, compile fixes, and rewrites to support
fbarray-backed memseg lists. Due to earlier switch to _walk()
functions, most of the changes are simple fixes, however some
of the _walk() calls were switched to memseg list walk, where
it made sense to do so.
Additionally, we are also switching locks from flock() to fcntl().
Down the line, we will be introducing single-file segments option,
and we cannot use flock() locks to lock parts of the file. Therefore,
we will use fcntl() locks for legacy mem as well, in case someone is
unfortunate enough to accidentally start legacy mem primary process
alongside an already working non-legacy mem-based primary process.
[1] http://dpdk.org/dev/patchwork/patch/34002/
Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
Tested-by: Santosh Shukla <santosh.shukla@caviumnetworks.com>
Tested-by: Hemant Agrawal <hemant.agrawal@nxp.com>
Tested-by: Gowrishankar Muthukrishnan <gowrishankar.m@linux.vnet.ibm.com>
2018-04-11 12:30:24 +00:00
|
|
|
rte_memseg_list_walk;
|
2018-04-11 12:30:00 +00:00
|
|
|
rte_memseg_walk;
|
eal: add channel for multi-process communication
Previouly, there are three channels for multi-process
(i.e., primary/secondary) communication.
1. Config-file based channel, in which, the primary process writes
info into a pre-defined config file, and the secondary process
reads the info out.
2. vfio submodule has its own channel based on unix socket for the
secondary process to get container fd and group fd from the
primary process.
3. pdump submodule also has its own channel based on unix socket for
packet dump.
It'd be good to have a generic communication channel for multi-process
communication to accommodate the requirements including:
a. Secondary wants to send info to primary, for example, secondary
would like to send request (about some specific vdev to primary).
b. Sending info at any time, instead of just initialization time.
c. Share FDs with the other side, for vdev like vhost, related FDs
(memory region, kick) should be shared.
d. A send message request needs the other side to response immediately.
This patch proposes to create a communication channel, based on datagram
unix socket, for above requirements. Each process will block on a unix
socket waiting for messages from the peers.
Three new APIs are added:
1. rte_eal_mp_action_register() is used to register an action,
indexed by a string, when a component at receiver side would like
to response the messages from the peer processe.
2. rte_eal_mp_action_unregister() is used to unregister the action
if the calling component does not want to response the messages.
3. rte_eal_mp_sendmsg() is used to send a message, and returns
immediately. If there are n secondary processes, the primary
process will send n messages.
Suggested-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>
Reviewed-by: Anatoly Burakov <anatoly.burakov@intel.com>
Acked-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
2018-01-30 06:58:08 +00:00
|
|
|
rte_mp_action_register;
|
|
|
|
rte_mp_action_unregister;
|
eal: add synchronous multi-process communication
We need the synchronous way for multi-process communication,
i.e., blockingly waiting for reply message when we send a request
to the peer process.
We add two APIs rte_eal_mp_request() and rte_eal_mp_reply() for
such use case. By invoking rte_eal_mp_request(), a request message
is sent out, and then it waits there for a reply message. The caller
can specify the timeout. And the response messages will be collected
and returned so that the caller can decide how to translate them.
The API rte_eal_mp_reply() is always called by an mp action handler.
Here we add another parameter for rte_eal_mp_t so that the action
handler knows which peer address to reply.
sender-process receiver-process
---------------------- ----------------
thread-n
|_rte_eal_mp_request() ----------> mp-thread
|_timedwait() |_process_msg()
|_action()
|_rte_eal_mp_reply()
mp_thread <---------------------|
|_process_msg()
|_signal(send_thread)
thread-m <----------|
|_collect-reply
* A secondary process is only allowed to talk to the primary process.
* If there are multiple secondary processes for the primary process,
it will send request to peer1, collect response from peer1; then
send request to peer2, collect response from peer2, and so on.
* When thread-n is sending request, thread-m of that process can send
request at the same time.
* For pair <action_name, peer>, we guarantee that only one such request
is on the fly.
Suggested-by: Anatoly Burakov <anatoly.burakov@intel.com>
Suggested-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>
Reviewed-by: Anatoly Burakov <anatoly.burakov@intel.com>
Acked-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
2018-01-30 06:58:09 +00:00
|
|
|
rte_mp_reply;
|
2018-03-31 17:06:15 +00:00
|
|
|
rte_mp_request_sync;
|
2018-03-31 17:06:16 +00:00
|
|
|
rte_mp_request_async;
|
2018-03-31 17:06:15 +00:00
|
|
|
rte_mp_sendmsg;
|
2018-01-12 10:27:16 +00:00
|
|
|
rte_service_attr_get;
|
2018-01-12 10:27:17 +00:00
|
|
|
rte_service_attr_reset_all;
|
2017-08-21 12:58:04 +00:00
|
|
|
rte_service_component_register;
|
2017-08-21 12:58:07 +00:00
|
|
|
rte_service_component_unregister;
|
2017-08-21 12:58:14 +00:00
|
|
|
rte_service_component_runstate_set;
|
2017-07-11 14:19:27 +00:00
|
|
|
rte_service_dump;
|
2018-01-26 20:55:36 +00:00
|
|
|
rte_service_finalize;
|
2017-07-11 14:19:27 +00:00
|
|
|
rte_service_get_by_id;
|
|
|
|
rte_service_get_by_name;
|
|
|
|
rte_service_get_count;
|
2017-08-21 12:58:08 +00:00
|
|
|
rte_service_get_name;
|
2017-07-11 14:19:27 +00:00
|
|
|
rte_service_lcore_add;
|
|
|
|
rte_service_lcore_count;
|
2017-08-29 12:32:51 +00:00
|
|
|
rte_service_lcore_count_services;
|
2017-07-11 14:19:27 +00:00
|
|
|
rte_service_lcore_del;
|
|
|
|
rte_service_lcore_list;
|
|
|
|
rte_service_lcore_reset_all;
|
|
|
|
rte_service_lcore_start;
|
|
|
|
rte_service_lcore_stop;
|
2017-08-21 12:58:03 +00:00
|
|
|
rte_service_map_lcore_get;
|
|
|
|
rte_service_map_lcore_set;
|
2017-07-11 14:19:27 +00:00
|
|
|
rte_service_probe_capability;
|
2017-10-25 13:25:28 +00:00
|
|
|
rte_service_run_iter_on_app_lcore;
|
2017-08-21 12:58:05 +00:00
|
|
|
rte_service_runstate_get;
|
|
|
|
rte_service_runstate_set;
|
2017-10-25 13:25:29 +00:00
|
|
|
rte_service_set_runstate_mapped_check;
|
2017-07-11 14:19:27 +00:00
|
|
|
rte_service_set_stats_enable;
|
|
|
|
rte_service_start_with_defaults;
|
2018-03-31 17:08:13 +00:00
|
|
|
rte_socket_count;
|
|
|
|
rte_socket_id_by_idx;
|
2018-04-11 12:30:21 +00:00
|
|
|
rte_vfio_dma_map;
|
|
|
|
rte_vfio_dma_unmap;
|
2017-06-30 18:19:41 +00:00
|
|
|
|
2017-11-30 21:27:01 +00:00
|
|
|
} DPDK_18.02;
|