+ rte_rwlock_write_unlock(&lcore_lock);
+}
+
+int
+rte_lcore_iterate(rte_lcore_iterate_cb cb, void *arg)
+{
+ struct rte_config *cfg = rte_eal_get_configuration();
+ unsigned int lcore_id;
+ int ret = 0;
+
+ rte_rwlock_read_lock(&lcore_lock);
+ for (lcore_id = 0; lcore_id < RTE_MAX_LCORE; lcore_id++) {
+ if (cfg->lcore_role[lcore_id] == ROLE_OFF)
+ continue;
+ ret = cb(lcore_id, arg);
+ if (ret != 0)
+ break;
+ }
+ rte_rwlock_read_unlock(&lcore_lock);
+ return ret;
+}
+
+static int
+lcore_dump_cb(unsigned int lcore_id, void *arg)
+{
+ struct rte_config *cfg = rte_eal_get_configuration();
+ char cpuset[RTE_CPU_AFFINITY_STR_LEN];
+ const char *role;
+ FILE *f = arg;
+ int ret;
+
+ switch (cfg->lcore_role[lcore_id]) {
+ case ROLE_RTE:
+ role = "RTE";
+ break;
+ case ROLE_SERVICE:
+ role = "SERVICE";
+ break;
+ case ROLE_NON_EAL:
+ role = "NON_EAL";
+ break;
+ default:
+ role = "UNKNOWN";
+ break;
+ }
+
+ ret = eal_thread_dump_affinity(&lcore_config[lcore_id].cpuset, cpuset,
+ sizeof(cpuset));
+ fprintf(f, "lcore %u, socket %u, role %s, cpuset %s%s\n", lcore_id,
+ rte_lcore_to_socket_id(lcore_id), role, cpuset,
+ ret == 0 ? "" : "...");
+ return 0;
+}
+
+void
+rte_lcore_dump(FILE *f)
+{
+ rte_lcore_iterate(lcore_dump_cb, f);