linuxppc-dev.lists.ozlabs.org archive mirror
 help / color / mirror / Atom feed
From: Anshuman Khandual <khandual@linux.vnet.ibm.com>
To: linux-kernel@vger.kernel.org, linuxppc-dev@lists.ozlabs.org
Cc: mikey@neuling.org, anton@samba.org, shuahkh@osg.samsung.com,
	mpe@ellerman.id.au
Subject: [PATCH V5 12/13] selftests, powerpc: Add thread based stress test for DSCR sysfs interfaces
Date: Thu, 21 May 2015 12:13:12 +0530	[thread overview]
Message-ID: <1432190593-17253-13-git-send-email-khandual@linux.vnet.ibm.com> (raw)
In-Reply-To: <1432190593-17253-1-git-send-email-khandual@linux.vnet.ibm.com>

This patch adds a test to update the system wide DSCR value repeatedly
and then verifies that any thread on any given CPU on the system must
be able to see the same DSCR value whether its is being read through
the problem state based SPR or the privilege state based SPR.

Acked-by: Shuah Khan <shuahkh@osg.samsung.com>
Signed-off-by: Anshuman Khandual <khandual@linux.vnet.ibm.com>
---
 tools/testing/selftests/powerpc/dscr/Makefile      |   2 +-
 .../powerpc/dscr/dscr_sysfs_thread_test.c          | 123 +++++++++++++++++++++
 2 files changed, 124 insertions(+), 1 deletion(-)
 create mode 100644 tools/testing/selftests/powerpc/dscr/dscr_sysfs_thread_test.c

diff --git a/tools/testing/selftests/powerpc/dscr/Makefile b/tools/testing/selftests/powerpc/dscr/Makefile
index fada526..834ef88 100644
--- a/tools/testing/selftests/powerpc/dscr/Makefile
+++ b/tools/testing/selftests/powerpc/dscr/Makefile
@@ -1,6 +1,6 @@
 PROGS := dscr_default_test dscr_explicit_test dscr_user_test	\
 	 dscr_inherit_test dscr_inherit_exec_test		\
-	 dscr_sysfs_test
+	 dscr_sysfs_test dscr_sysfs_thread_test
 
 CFLAGS := $(CFLAGS) -lpthread
 
diff --git a/tools/testing/selftests/powerpc/dscr/dscr_sysfs_thread_test.c b/tools/testing/selftests/powerpc/dscr/dscr_sysfs_thread_test.c
new file mode 100644
index 0000000..bf4a8a6
--- /dev/null
+++ b/tools/testing/selftests/powerpc/dscr/dscr_sysfs_thread_test.c
@@ -0,0 +1,123 @@
+/*
+ * POWER Data Stream Control Register (DSCR) sysfs thread test
+ *
+ * This test updates the system wide DSCR default value through
+ * sysfs interface which should then update all the CPU specific
+ * DSCR default values which must also be then visible to threads
+ * executing on individual CPUs on the system.
+ *
+ * Copyright (C) 2015 Anshuman Khandual <khandual@linux.vnet.ibm.com>, IBM
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+#define _GNU_SOURCE
+#include "dscr.h"
+
+static pthread_mutex_t lock;	/* Pthread lock */
+static cpu_set_t cpuset;	/* Thread cpu set */
+static int target;		/* Thread target cpu */
+static unsigned long *result;	/* Thread exit status array */
+
+#define NR_ONLN sysconf(_SC_NPROCESSORS_ONLN)
+
+static void *test_thread_dscr(void *in)
+{
+	unsigned long cur_dscr, cur_dscr_usr;
+	unsigned long val = (unsigned long)in;
+
+	pthread_mutex_lock(&lock);
+	target++;
+	if (target == NR_ONLN)
+		target =  0;
+	CPU_ZERO(&cpuset);
+	CPU_SET(target, &cpuset);
+
+	if (sched_setaffinity(0, sizeof(cpuset), &cpuset)) {
+		perror("sched_setaffinity() failed");
+		pthread_mutex_unlock(&lock);
+		result[target] = 1;
+		pthread_exit(&result[target]);
+	}
+	pthread_mutex_unlock(&lock);
+
+	cur_dscr = get_dscr();
+	cur_dscr_usr = get_dscr_usr();
+
+	if (val != cur_dscr) {
+		printf("[cpu %d] Kernel DSCR should be %ld but is %ld\n",
+					sched_getcpu(), val, cur_dscr);
+		result[target] = 1;
+		pthread_exit(&result[target]);
+	}
+
+	if (val != cur_dscr_usr) {
+		printf("[cpu %d] User DSCR should be %ld but is %ld\n",
+					sched_getcpu(), val, cur_dscr_usr);
+		result[target] = 1;
+		pthread_exit(&result[target]);
+	}
+	result[target] = 0;
+	pthread_exit(&result[target]);
+}
+
+static int check_cpu_dscr_thread(unsigned long val)
+{
+	pthread_t threads[NR_ONLN];
+	unsigned long *status[NR_ONLN];
+	unsigned long i;
+
+	for (i = 0; i < NR_ONLN; i++) {
+		if (pthread_create(&threads[i], NULL,
+				test_thread_dscr, (void *)val)) {
+			perror("pthread_create() failed");
+			return 1;
+		}
+	}
+
+	for (i = 0; i < NR_ONLN; i++) {
+		if (pthread_join(threads[i], (void **)&(status[i]))) {
+			perror("pthread_join() failed");
+			return 1;
+		}
+
+		if (*status[i]) {
+			printf(" %ldth thread join failed with %ld\n",
+							i, *status[i]);
+			return 1;
+		}
+	}
+	return 0;
+}
+
+int dscr_sysfs_thread(void)
+{
+	unsigned long orig_dscr_default;
+	int i, j;
+
+	result = malloc(sizeof(unsigned long) * NR_ONLN);
+	pthread_mutex_init(&lock, NULL);
+	target = 0;
+	orig_dscr_default = get_default_dscr();
+	for (i = 0; i < COUNT; i++) {
+		for (j = 0; j < DSCR_MAX; j++) {
+			set_default_dscr(j);
+			if (check_cpu_dscr_thread(j))
+				goto fail;
+		}
+	}
+	free(result);
+	set_default_dscr(orig_dscr_default);
+	return 0;
+fail:
+	free(result);
+	set_default_dscr(orig_dscr_default);
+	return 1;
+}
+
+int main(int argc, char *argv[])
+{
+	return test_harness(dscr_sysfs_thread, "dscr_sysfs_thread_test");
+}
-- 
2.1.0

  parent reply	other threads:[~2015-05-21  6:43 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-05-21  6:43 [PATCH V5 00/13] POWER DSCR fixes, improvements, docs and tests Anshuman Khandual
2015-05-21  6:43 ` [PATCH V5 01/13] powerpc: Fix handling of DSCR related facility unavailable exception Anshuman Khandual
2015-05-21  6:43 ` [PATCH V5 02/13] powerpc, process: Remove the unused extern dscr_default Anshuman Khandual
2015-05-21  6:43 ` [PATCH V5 03/13] powerpc, offset: Change PACA_DSCR to PACA_DSCR_DEFAULT Anshuman Khandual
2015-05-21  6:43 ` [PATCH V5 04/13] powerpc, dscr: Added some in-code documentation Anshuman Khandual
2015-05-21  6:43 ` [PATCH V5 05/13] documentation, powerpc: Add documentation for DSCR support Anshuman Khandual
2015-05-21  6:43 ` [PATCH V5 06/13] selftests, powerpc: Add test for system wide DSCR default Anshuman Khandual
2015-05-21  6:43 ` [PATCH V5 07/13] selftests, powerpc: Add test for explicitly changing DSCR value Anshuman Khandual
2015-05-21  6:43 ` [PATCH V5 08/13] selftests, powerpc: Add test for DSCR SPR numbers Anshuman Khandual
2015-05-21  6:43 ` [PATCH V5 09/13] selftests, powerpc: Add test for DSCR value inheritence across fork Anshuman Khandual
2015-05-21  6:43 ` [PATCH V5 10/13] selftests, powerpc: Add test for DSCR inheritence across fork & exec Anshuman Khandual
2015-05-21  6:43 ` [PATCH V5 11/13] selftests, powerpc: Add test for all DSCR sysfs interfaces Anshuman Khandual
2015-05-21  6:43 ` Anshuman Khandual [this message]
2015-06-03  8:44   ` [PATCH V5 12/13] selftests, powerpc: Add thread based stress test for " Anshuman Khandual
2015-05-21  6:43 ` [PATCH V5 13/13] selftests, powerpc: Add gitignore file for the new DSCR tests Anshuman Khandual
2015-05-25  8:38 ` [PATCH V5 00/13] POWER DSCR fixes, improvements, docs and tests Anshuman Khandual

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1432190593-17253-13-git-send-email-khandual@linux.vnet.ibm.com \
    --to=khandual@linux.vnet.ibm.com \
    --cc=anton@samba.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linuxppc-dev@lists.ozlabs.org \
    --cc=mikey@neuling.org \
    --cc=mpe@ellerman.id.au \
    --cc=shuahkh@osg.samsung.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).