c3568ea376
Spawning the ctrl threads on anything that is not part of the eal coremask is not that polite to the rest of the system, especially when you took good care to pin your processes on cpu resources with tools like taskset (linux) / cpuset (freebsd). Rather than introduce yet another eal options to control on which cpu those ctrl threads are created, let's take the startup cpu affinity as a reference and remove the eal coremask from it. If no cpu is left, then we default to the master core. The cpuset is computed once at init before the original cpu affinity is lost. Introduced a RTE_CPU_AND macro to abstract the differences between linux and freebsd respective macros. Examples in a 4 cores FreeBSD vm: $ ./build/app/testpmd -l 2,3 --no-huge --no-pci -m 512 \ -- -i --total-num-mbufs=2048 $ procstat -S 1057 PID TID COMM TDNAME CPU CSID CPU MASK 1057 100131 testpmd - 2 1 2 1057 100140 testpmd eal-intr-thread 1 1 0-1 1057 100141 testpmd rte_mp_handle 1 1 0-1 1057 100142 testpmd lcore-slave-3 3 1 3 $ cpuset -l 1,2,3 ./build/app/testpmd -l 2,3 --no-huge --no-pci -m 512 \ -- -i --total-num-mbufs=2048 $ procstat -S 1061 PID TID COMM TDNAME CPU CSID CPU MASK 1061 100131 testpmd - 2 2 2 1061 100144 testpmd eal-intr-thread 1 2 1 1061 100145 testpmd rte_mp_handle 1 2 1 1061 100147 testpmd lcore-slave-3 3 2 3 $ cpuset -l 2,3 ./build/app/testpmd -l 2,3 --no-huge --no-pci -m 512 \ -- -i --total-num-mbufs=2048 $ procstat -S 1065 PID TID COMM TDNAME CPU CSID CPU MASK 1065 100131 testpmd - 2 2 2 1065 100148 testpmd eal-intr-thread 2 2 2 1065 100149 testpmd rte_mp_handle 2 2 2 1065 100150 testpmd lcore-slave-3 3 2 3 Fixes: d651ee4919cd ("eal: set affinity for control threads") Cc: stable@dpdk.org Signed-off-by: David Marchand <david.marchand@redhat.com> Reviewed-by: Anatoly Burakov <anatoly.burakov@intel.com> Reviewed-by: Olivier Matz <olivier.matz@6wind.com>
87 lines
3.4 KiB
C
87 lines
3.4 KiB
C
/* SPDX-License-Identifier: BSD-3-Clause
|
|
* Copyright(c) 2010-2014 Intel Corporation
|
|
*/
|
|
|
|
/**
|
|
* @file
|
|
* Holds the structures for the eal internal configuration
|
|
*/
|
|
|
|
#ifndef EAL_INTERNAL_CFG_H
|
|
#define EAL_INTERNAL_CFG_H
|
|
|
|
#include <rte_eal.h>
|
|
#include <rte_pci_dev_feature_defs.h>
|
|
|
|
#include "eal_thread.h"
|
|
|
|
#define MAX_HUGEPAGE_SIZES 3 /**< support up to 3 page sizes */
|
|
|
|
/*
|
|
* internal configuration structure for the number, size and
|
|
* mount points of hugepages
|
|
*/
|
|
struct hugepage_info {
|
|
uint64_t hugepage_sz; /**< size of a huge page */
|
|
char hugedir[PATH_MAX]; /**< dir where hugetlbfs is mounted */
|
|
uint32_t num_pages[RTE_MAX_NUMA_NODES];
|
|
/**< number of hugepages of that size on each socket */
|
|
int lock_descriptor; /**< file descriptor for hugepage dir */
|
|
};
|
|
|
|
/**
|
|
* internal configuration
|
|
*/
|
|
struct internal_config {
|
|
volatile size_t memory; /**< amount of asked memory */
|
|
volatile unsigned force_nchannel; /**< force number of channels */
|
|
volatile unsigned force_nrank; /**< force number of ranks */
|
|
volatile unsigned no_hugetlbfs; /**< true to disable hugetlbfs */
|
|
unsigned hugepage_unlink; /**< true to unlink backing files */
|
|
volatile unsigned no_pci; /**< true to disable PCI */
|
|
volatile unsigned no_hpet; /**< true to disable HPET */
|
|
volatile unsigned vmware_tsc_map; /**< true to use VMware TSC mapping
|
|
* instead of native TSC */
|
|
volatile unsigned no_shconf; /**< true if there is no shared config */
|
|
volatile unsigned in_memory;
|
|
/**< true if DPDK should operate entirely in-memory and not create any
|
|
* shared files or runtime data.
|
|
*/
|
|
volatile unsigned create_uio_dev; /**< true to create /dev/uioX devices */
|
|
volatile enum rte_proc_type_t process_type; /**< multi-process proc type */
|
|
/** true to try allocating memory on specific sockets */
|
|
volatile unsigned force_sockets;
|
|
volatile uint64_t socket_mem[RTE_MAX_NUMA_NODES]; /**< amount of memory per socket */
|
|
volatile unsigned force_socket_limits;
|
|
volatile uint64_t socket_limit[RTE_MAX_NUMA_NODES]; /**< limit amount of memory per socket */
|
|
uintptr_t base_virtaddr; /**< base address to try and reserve memory from */
|
|
volatile unsigned legacy_mem;
|
|
/**< true to enable legacy memory behavior (no dynamic allocation,
|
|
* IOVA-contiguous segments).
|
|
*/
|
|
volatile unsigned match_allocations;
|
|
/**< true to free hugepages exactly as allocated */
|
|
volatile unsigned single_file_segments;
|
|
/**< true if storing all pages within single files (per-page-size,
|
|
* per-node) non-legacy mode only.
|
|
*/
|
|
volatile int syslog_facility; /**< facility passed to openlog() */
|
|
/** default interrupt mode for VFIO */
|
|
volatile enum rte_intr_mode vfio_intr_mode;
|
|
char *hugefile_prefix; /**< the base filename of hugetlbfs files */
|
|
char *hugepage_dir; /**< specific hugetlbfs directory to use */
|
|
char *user_mbuf_pool_ops_name;
|
|
/**< user defined mbuf pool ops name */
|
|
unsigned num_hugepage_sizes; /**< how many sizes on this system */
|
|
struct hugepage_info hugepage_info[MAX_HUGEPAGE_SIZES];
|
|
enum rte_iova_mode iova_mode ; /**< Set IOVA mode on this system */
|
|
rte_cpuset_t ctrl_cpuset; /**< cpuset for ctrl threads */
|
|
volatile unsigned int init_complete;
|
|
/**< indicates whether EAL has completed initialization */
|
|
};
|
|
extern struct internal_config internal_config; /**< Global EAL configuration. */
|
|
|
|
void eal_reset_internal_config(struct internal_config *internal_cfg);
|
|
|
|
#endif /* EAL_INTERNAL_CFG_H */
|