tools/testing/selftests/sync/sync_stress_parallelism.c

Source file repositories/reference/linux-study-clean/tools/testing/selftests/sync/sync_stress_parallelism.c

File Facts

System
Linux kernel
Corpus path
tools/testing/selftests/sync/sync_stress_parallelism.c
Extension
.c
Size
3398 bytes
Lines
112
Domain
Support Tooling And Documentation
Bucket
tools
Inferred role
Support Tooling And Documentation: implementation source
Status
source implementation candidate

Why This File Exists

Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.

Dependency Surface

Detected Declarations

Annotated Snippet

#include <pthread.h>

#include "sync.h"
#include "sw_sync.h"
#include "synctest.h"

static struct {
	int iterations;
	int timeline;
	int counter;
} test_data_two_threads;

static int test_stress_two_threads_shared_timeline_thread(void *d)
{
	int thread_id = (long)d;
	int timeline = test_data_two_threads.timeline;
	int iterations = test_data_two_threads.iterations;
	int fence, valid, ret, i;

	for (i = 0; i < iterations; i++) {
		fence = sw_sync_fence_create(timeline, "fence",
					     i * 2 + thread_id);
		valid = sw_sync_fence_is_valid(fence);
		ASSERT(valid, "Failure allocating fence\n");

		/* Wait on the prior thread to complete */
		ret = sync_wait(fence, -1);
		ASSERT(ret > 0, "Problem occurred on prior thread\n");

		/*
		 * Confirm the previous thread's writes are visible
		 * and then increment
		 */
		ASSERT(test_data_two_threads.counter == i * 2 + thread_id,
		       "Counter got damaged!\n");
		test_data_two_threads.counter++;

		/* Kick off the other thread */
		ret = sw_sync_timeline_inc(timeline, 1);
		ASSERT(ret == 0, "Advancing timeline failed\n");

		sw_sync_fence_destroy(fence);
	}

	return 0;
}

int test_stress_two_threads_shared_timeline(void)
{
	pthread_t a, b;
	int valid;
	int timeline = sw_sync_timeline_create();

	valid = sw_sync_timeline_is_valid(timeline);
	ASSERT(valid, "Failure allocating timeline\n");

	test_data_two_threads.iterations = 1 << 16;
	test_data_two_threads.counter = 0;
	test_data_two_threads.timeline = timeline;

	/*
	 * Use a single timeline to synchronize two threads
	 * hammmering on the same counter.
	 */

	pthread_create(&a, NULL, (void *(*)(void *))
		       test_stress_two_threads_shared_timeline_thread,
		       (void *)0);
	pthread_create(&b, NULL, (void *(*)(void *))
		       test_stress_two_threads_shared_timeline_thread,
		       (void *)1);

	pthread_join(a, NULL);
	pthread_join(b, NULL);

	/* make sure the threads did not trample on one another */
	ASSERT(test_data_two_threads.counter ==
	       test_data_two_threads.iterations * 2,
	       "Counter has unexpected value\n");

	sw_sync_timeline_destroy(timeline);

	return 0;
}

Annotation

Implementation Notes