i, true); spdk_thread_create(thread_name, &tmp_cpumask); } spdk_cpuset_set_cpu(&g_reactor_core_mask, i, true); } /* Start the main reactor */ reactor = spdk_reactor_get(current_core); assert(reactor
1 int 2 spdk_vhost_dev_register(struct spdk_vhost_dev *vdev, const char *name, const char *mask_str, 3 const struct spdk_vhost_dev_backend *backend) 4 { 5 char path[PATH_MAX]; 6 struct stat file_stat; 7 struct spdk_cpuset *cpumask; 8 int rc; 9 10 11 /* 将配置文件中读取的...
其他 SPDK 库可能会限制某些 API 只能在此应用程序线程的上下文中调用 spdk_interrupt_mode_is_enabled -> 默认禁用中断 g_thread_op_fn(thread, SPDK_THREAD_OP_NEW) -> reactor_thread_op _reactor_schedule_thread spdk_cpuset_zero spdk_cpuset_set_cpu spdk_cpuset_xor -> 异或, eactor:避免在intr中将...
vhost进程启动时可以配置多个轮循线程(reactor),每个线程绑定一个物理CPU。在示例场景下,我们假设配置了两个轮循线程reactor_0和reactor_1,分别对应物理CPU0和物理CPU1。每配置一个vhost-blk设备时,同样要为该设备绑定物理核,并且只能绑定到一个物理核上,例如这里我们假设vm1的vhost-blk设备绑定到CPU0,vm2和vm3绑...
struct spdk_cpuset *cpumask; uint64_t tsc_last; struct spdk_thread_stats stats; /* * Contains pollers actively running on this thread. Pollers * are run round-robin. The thread takes one poller from the head * of the ring, executes it, then puts it back at the tail of ...
daos_eq_createrte_thread_set_affinity(&orig_cpuset)将cpu亲和性设回去 ch->poller=SPDK_POLLER_REGISTER(bdev_daos_channel_poll,ch,0)bdev_daos_io_channel_destroy_cb spdk_poller_unregister daos_eq_destroy dfs_release dfs_umount daos_cont_close ...
if (spdk_cpuset_get_cpu(cpumask, core)) { evt = spdk_event_allocate(core, _schedule_thread, lw_thread, NULL); break; } } // 传递该event,即对应的reatcor会调用_schedule_thread方法, spdk_event_call(evt); } _schedule_thread(void *arg1, void *arg2) ...
1spdk_reactor_schedule_thread(structspdk_thread *thread)2{3//得到该线程设置的cpu mask4cpumask =spdk_thread_get_cpumask(thread);5for(i =0; i < spdk_env_get_core_count(); i++) {6….//遍历cpu core7//通过cpu mask找到对应的核心,并产生event8if(spdk_cpuset_get_cpu(cpumask, core))...
spdk_cpuset_set_cpu(&polling_cpumask, i, true); } spdk_cpuset_xor(&polling_cpumask, &local_reactor->notify_cpuset);if (core == SPDK_ENV_LCORE_ID_ANY) { /* Get the cpumask of all valid reactors which are suggested and also in polling */ ...
= current_core) { 17 reactor = spdk_reactor_get(i); 18 rc = spdk_env_thread_launch_pinned(reactor->lcore, _spdk_reactor_run, reactor); 19 ... 20 } 21 spdk_cpuset_set_cpu(g_spdk_app_core_mask, i, true); 22 } 23 24 /* 主线程也会执行_spdk_reactor_run */ 25 /* Start ...