lib/env: add spdk_unaffinitize_thread
This can be used by threads within SPDK to undo the affinitization done either by DPDK (for DPDK lcores) or by inheriting the parent's thread when using pthread_create(). This will be used by the stub app to unaffinitize the reactor core to allow the scheduler to flexibly move it to an idle core. Signed-off-by: Jim Harris <james.r.harris@intel.com> Change-Id: I7e550953cd9dcd7fd9d98bfbb70660994f2eefcd Reviewed-on: https://review.gerrithub.io/366680 Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com> Tested-by: SPDK Automated Test System <sys_sgsw@intel.com> Reviewed-by: Ben Walker <benjamin.walker@intel.com>
This commit is contained in:
parent
c588baab29
commit
c09bfe8965
@ -177,23 +177,6 @@ attach_cb(void *cb_ctx, const struct spdk_nvme_transport_id *trid,
|
|||||||
fio_file_set_size_known(f);
|
fio_file_set_size_known(f);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
cpu_core_unaffinitized(void)
|
|
||||||
{
|
|
||||||
cpu_set_t mask;
|
|
||||||
int i;
|
|
||||||
int num = sysconf(_SC_NPROCESSORS_CONF);
|
|
||||||
|
|
||||||
CPU_ZERO(&mask);
|
|
||||||
for (i = 0; i < num; i++) {
|
|
||||||
CPU_SET(i, &mask);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pthread_setaffinity_np(pthread_self(), sizeof(mask), &mask) < 0) {
|
|
||||||
SPDK_ERRLOG("set thread affinity failed\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Called once at initialization. This is responsible for gathering the size of
|
/* Called once at initialization. This is responsible for gathering the size of
|
||||||
* each "file", which in our case are in the form
|
* each "file", which in our case are in the form
|
||||||
* 'key=value [key=value] ... ns=value'
|
* 'key=value [key=value] ... ns=value'
|
||||||
@ -234,7 +217,7 @@ static int spdk_fio_setup(struct thread_data *td)
|
|||||||
opts.mem_size = 512;
|
opts.mem_size = 512;
|
||||||
spdk_env_init(&opts);
|
spdk_env_init(&opts);
|
||||||
spdk_env_initialized = true;
|
spdk_env_initialized = true;
|
||||||
cpu_core_unaffinitized();
|
spdk_unaffinitize_thread();
|
||||||
}
|
}
|
||||||
|
|
||||||
for_each_file(td, f, i) {
|
for_each_file(td, f, i) {
|
||||||
|
@ -376,6 +376,11 @@ int spdk_pci_addr_parse(struct spdk_pci_addr *addr, const char *bdf);
|
|||||||
*/
|
*/
|
||||||
int spdk_pci_addr_fmt(char *bdf, size_t sz, const struct spdk_pci_addr *addr);
|
int spdk_pci_addr_fmt(char *bdf, size_t sz, const struct spdk_pci_addr *addr);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes any CPU affinitization from the current thread.
|
||||||
|
*/
|
||||||
|
void spdk_unaffinitize_thread(void);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Call a function with CPU affinity unset.
|
* Call a function with CPU affinity unset.
|
||||||
*
|
*
|
||||||
|
@ -228,19 +228,12 @@ void spdk_delay_us(unsigned int us)
|
|||||||
rte_delay_us(us);
|
rte_delay_us(us);
|
||||||
}
|
}
|
||||||
|
|
||||||
void *
|
void
|
||||||
spdk_call_unaffinitized(void *cb(void *arg), void *arg)
|
spdk_unaffinitize_thread(void)
|
||||||
{
|
{
|
||||||
rte_cpuset_t orig_cpuset, new_cpuset;
|
rte_cpuset_t new_cpuset;
|
||||||
void *ret;
|
|
||||||
long num_cores, i;
|
long num_cores, i;
|
||||||
|
|
||||||
if (cb == NULL) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
rte_thread_get_affinity(&orig_cpuset);
|
|
||||||
|
|
||||||
CPU_ZERO(&new_cpuset);
|
CPU_ZERO(&new_cpuset);
|
||||||
|
|
||||||
num_cores = sysconf(_SC_NPROCESSORS_CONF);
|
num_cores = sysconf(_SC_NPROCESSORS_CONF);
|
||||||
@ -251,6 +244,21 @@ spdk_call_unaffinitized(void *cb(void *arg), void *arg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
rte_thread_set_affinity(&new_cpuset);
|
rte_thread_set_affinity(&new_cpuset);
|
||||||
|
}
|
||||||
|
|
||||||
|
void *
|
||||||
|
spdk_call_unaffinitized(void *cb(void *arg), void *arg)
|
||||||
|
{
|
||||||
|
rte_cpuset_t orig_cpuset;
|
||||||
|
void *ret;
|
||||||
|
|
||||||
|
if (cb == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
rte_thread_get_affinity(&orig_cpuset);
|
||||||
|
|
||||||
|
spdk_unaffinitize_thread();
|
||||||
|
|
||||||
ret = cb(arg);
|
ret = cb(arg);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user