Commit cdeecfb8 authored by Jim Harris's avatar Jim Harris Committed by Tomasz Zawadzki
Browse files

util: add spdk_cpuset_for_each_cpu



This calls a provided function for every cpu that is set in the
provided cpuset.

As part of this patch, implement spdk_cpuset_count using this new
API, to reduce code duplication.

Signed-off-by: default avatarJim Harris <jim.harris@samsung.com>
Change-Id: I005734ad0fc87a25b507268dc174c3746c16bc0e
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/23723


Reviewed-by: default avatarTomasz Zawadzki <tomasz.zawadzki@intel.com>
Reviewed-by: default avatarKonrad Sztyber <konrad.sztyber@intel.com>
Community-CI: Mellanox Build Bot
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
parent b1923f4d
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -116,6 +116,15 @@ void spdk_cpuset_set_cpu(struct spdk_cpuset *set, uint32_t cpu, bool state);
 */
bool spdk_cpuset_get_cpu(const struct spdk_cpuset *set, uint32_t cpu);

/** Call the specified function for each set cpu in the specified cpuset.
 *
 * \param set The cpuset to iterate
 * \param fn The function to call for each set cpu
 * \param ctx Context pointer to pass to fn
 */
void spdk_cpuset_for_each_cpu(const struct spdk_cpuset *set,
			      void (*fn)(void *ctx, uint32_t cpu), void *ctx);

/**
 * Get the number of CPUs that are set in CPU set.
 *
+20 −4
Original line number Diff line number Diff line
@@ -104,20 +104,36 @@ spdk_cpuset_get_cpu(const struct spdk_cpuset *set, uint32_t cpu)
	return (set->cpus[cpu / 8] >> (cpu % 8)) & 1U;
}

uint32_t
spdk_cpuset_count(const struct spdk_cpuset *set)
void
spdk_cpuset_for_each_cpu(const struct spdk_cpuset *set,
			 void (*fn)(void *ctx, uint32_t cpu), void *ctx)
{
	uint32_t count = 0;
	uint8_t n;
	unsigned int i, j;
	for (i = 0; i < sizeof(set->cpus); i++) {
		n = set->cpus[i];
		for (j = 0; j < 8; j++) {
			if (n & (1 << j)) {
				count++;
				fn(ctx, i * 8 + j);
			}
		}
	}
}

static void
count_fn(void *ctx, uint32_t cpu)
{
	uint32_t *count = ctx;

	(*count)++;
}

uint32_t
spdk_cpuset_count(const struct spdk_cpuset *set)
{
	uint32_t count = 0;

	spdk_cpuset_for_each_cpu(set, count_fn, &count);
	return count;
}

+1 −0
Original line number Diff line number Diff line
@@ -50,6 +50,7 @@
	spdk_cpuset_zero;
	spdk_cpuset_set_cpu;
	spdk_cpuset_get_cpu;
	spdk_cpuset_for_each_cpu;
	spdk_cpuset_count;
	spdk_cpuset_fmt;
	spdk_cpuset_parse;
+21 −1
Original line number Diff line number Diff line
@@ -238,6 +238,26 @@ test_cpuset_fmt(void)
	spdk_cpuset_free(core_mask);
}

static void
set_bit(void *ctx, uint32_t cpu)
{
	uint64_t *mask = ctx;

	SPDK_CU_ASSERT_FATAL(cpu < 64);
	(*mask) |= (1 << cpu);
}

static void
test_cpuset_foreach(void)
{
	struct spdk_cpuset cpuset = {};
	uint64_t mask = 0;

	CU_ASSERT(spdk_cpuset_parse(&cpuset, "0xF135704") == 0);
	spdk_cpuset_for_each_cpu(&cpuset, set_bit, &mask);
	CU_ASSERT(mask == 0xF135704);
}

int
main(int argc, char **argv)
{
@@ -251,7 +271,7 @@ main(int argc, char **argv)
	CU_ADD_TEST(suite, test_cpuset);
	CU_ADD_TEST(suite, test_cpuset_parse);
	CU_ADD_TEST(suite, test_cpuset_fmt);

	CU_ADD_TEST(suite, test_cpuset_foreach);

	num_failures = spdk_ut_run_tests(argc, argv, NULL);