LKML Archive on lore.kernel.org
help / color / mirror / Atom feed
* [PATCH V2 00/12] POWER DSCR fixes, improvements, docs and tests
@ 2015-01-13 10:22 Anshuman Khandual
  2015-01-13 10:22 ` [PATCH V2 01/12] powerpc: Fix handling of DSCR related facility unavailable exception Anshuman Khandual
                   ` (12 more replies)
  0 siblings, 13 replies; 28+ messages in thread
From: Anshuman Khandual @ 2015-01-13 10:22 UTC (permalink / raw)
  To: linuxppc-dev, linux-kernel; +Cc: mpe, benh, anton, mikey, shuahkh

	This patch series has patches for POWER DSCR fixes, improvements,
in code documentaion, kernel support user documentation and selftest based
test cases. It has got five test cases which are derived from Anton's DSCR
test bucket which can be listed as follows.

(1) http://ozlabs.org/~anton/junkcode/dscr_default_test.c
(2) http://ozlabs.org/~anton/junkcode/dscr_explicit_test.c
(3) http://ozlabs.org/~anton/junkcode/dscr_inherit_exec_test.c
(4) http://ozlabs.org/~anton/junkcode/dscr_inherit_test.c
(5) http://ozlabs.org/~anton/junkcode/user_dscr_test.c

So the derivied test cases have Anton's copyright along with mine but the
commit message as of now has only my signed-off-by statement. As Anton
mentioned before he would put his signed-off-by after reviewing these
modified test cases.

NOTE1: Anton's original inherit exec test expected the child to have system
default DSCR value instead of the inherited DSCR value from it's parent.
But looks like thats not the case when we execute the test, it always
inherits it's parent's DSCR value over the exec call as well. So I have
changed the test program assuming its correct to have the inherited DSCR
value in the fork/execed child program. Please let me know if thats not
correct and I am missing something there.

NOTE2: The selftests/powerpc/.gitignore will be added and will get updated
through a different patch series related to ptrace instead of this one.

Changes in V2:
-------------
- Updated the thread struct DSCR value inside mtspr facility exception path
- Modified the in code documentation to follow the kernel-doc format
- Added seven selftest based DSCR related test cases under powerpc

Original V1:
------------
- Posted here at https://patchwork.ozlabs.org/patch/418583/

Anshuman Khandual (12):
  powerpc: Fix handling of DSCR related facility unavailable exception
  powerpc, process: Remove the unused extern dscr_default
  powerpc, offset: Change PACA_DSCR to PACA_DSCR_DEFAULT
  powerpc, dscr: Added some in-code documentation
  documentation, powerpc: Add documentation for DSCR support
  selftests, powerpc: Add test for system wide DSCR default
  selftests, powerpc: Add test for explicitly changing DSCR value
  selftests, powerpc: Add test for DSCR SPR numbers
  selftests, powerpc: Add test for DSCR value inheritence across fork
  selftests, powerpc: Add test for DSCR inheritence across fork & exec
  selftests, powerpc: Add test for all DSCR sysfs interfaces
  selftests, powerpc: Add thread based stress test for DSCR sysfs interfaces

 Documentation/powerpc/00-INDEX                     |   2 +
 Documentation/powerpc/dscr.txt                     |  83 ++++++++++++++
 arch/powerpc/include/asm/processor.h               |   9 ++
 arch/powerpc/kernel/asm-offsets.c                  |   2 +-
 arch/powerpc/kernel/entry_64.S                     |   2 +-
 arch/powerpc/kernel/process.c                      |   2 -
 arch/powerpc/kernel/sysfs.c                        |  38 +++++++
 arch/powerpc/kernel/tm.S                           |   4 +-
 arch/powerpc/kernel/traps.c                        |  45 +++++++-
 arch/powerpc/kvm/book3s_hv_rmhandlers.S            |   2 +-
 tools/testing/selftests/powerpc/Makefile           |   2 +-
 tools/testing/selftests/powerpc/dscr/Makefile      |  19 ++++
 tools/testing/selftests/powerpc/dscr/dscr.h        | 120 ++++++++++++++++++++
 .../selftests/powerpc/dscr/dscr_default_test.c     | 121 +++++++++++++++++++++
 .../selftests/powerpc/dscr/dscr_explicit_test.c    |  72 ++++++++++++
 .../powerpc/dscr/dscr_inherit_exec_test.c          | 118 ++++++++++++++++++++
 .../selftests/powerpc/dscr/dscr_inherit_test.c     |  96 ++++++++++++++++
 .../selftests/powerpc/dscr/dscr_sysfs_test.c       |  89 +++++++++++++++
 .../powerpc/dscr/dscr_sysfs_thread_test.c          | 114 +++++++++++++++++++
 .../selftests/powerpc/dscr/dscr_user_test.c        |  62 +++++++++++
 20 files changed, 989 insertions(+), 13 deletions(-)
 create mode 100644 Documentation/powerpc/dscr.txt
 create mode 100644 tools/testing/selftests/powerpc/dscr/Makefile
 create mode 100644 tools/testing/selftests/powerpc/dscr/dscr.h
 create mode 100644 tools/testing/selftests/powerpc/dscr/dscr_default_test.c
 create mode 100644 tools/testing/selftests/powerpc/dscr/dscr_explicit_test.c
 create mode 100644 tools/testing/selftests/powerpc/dscr/dscr_inherit_exec_test.c
 create mode 100644 tools/testing/selftests/powerpc/dscr/dscr_inherit_test.c
 create mode 100644 tools/testing/selftests/powerpc/dscr/dscr_sysfs_test.c
 create mode 100644 tools/testing/selftests/powerpc/dscr/dscr_sysfs_thread_test.c
 create mode 100644 tools/testing/selftests/powerpc/dscr/dscr_user_test.c

-- 
1.9.3


^ permalink raw reply	[flat|nested] 28+ messages in thread

* [PATCH V2 01/12] powerpc: Fix handling of DSCR related facility unavailable exception
  2015-01-13 10:22 [PATCH V2 00/12] POWER DSCR fixes, improvements, docs and tests Anshuman Khandual
@ 2015-01-13 10:22 ` Anshuman Khandual
  2015-01-13 10:22 ` [PATCH V2 02/12] powerpc, process: Remove the unused extern dscr_default Anshuman Khandual
                   ` (11 subsequent siblings)
  12 siblings, 0 replies; 28+ messages in thread
From: Anshuman Khandual @ 2015-01-13 10:22 UTC (permalink / raw)
  To: linuxppc-dev, linux-kernel; +Cc: mpe, benh, anton, mikey, shuahkh

Currently DSCR (Data Stream Control Register) can be accessed with
mfspr or mtspr instructions inside a thread via two different SPR
numbers. One being the user accessible problem state SPR number 0x03
and the other being the privilege state SPR number 0x11. All access
through the privilege state SPR number get emulated through illegal
instruction exception. Any access through the problem state SPR number
raises one facility unavailable exception which sets the thread based
dscr_inherit bit and enables DSCR facility through FSCR register thus
allowing direct access to DSCR without going through this exception in
the future. We set the thread.dscr_inherit bit whether the access was
with mfspr or mtspr instruction which is neither correct nor does it
match the behaviour through the instruction emulation code path driven
from privilege state SPR number. User currently observes two different
kind of behaviour when accessing the DSCR through these two SPR numbers.
This problem can be observed through these two test cases by replacing
the privilege state SPR number with the problem state SPR number.

	(1) http://ozlabs.org/~anton/junkcode/dscr_default_test.c
	(2) http://ozlabs.org/~anton/junkcode/dscr_explicit_test.c

This patch fixes the problem by making sure that the behaviour visible
to the user remains the same irrespective of which SPR number is being
used. Inside facility unavailable exception, we check whether it was
cuased by a mfspr or a mtspr isntrucction. In case of mfspr instruction,
just emulate the instruction. In case of mtspr instruction, set the
thread based dscr_inherit bit and also enable the facility through FSCR.
All user SPR based mfspr instruction will be emulated till one user SPR
based mtspr has been executed.

Signed-off-by: Anshuman Khandual <khandual@linux.vnet.ibm.com>
---
 arch/powerpc/kernel/traps.c | 45 ++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 40 insertions(+), 5 deletions(-)

diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c
index e6595b7..cd69340 100644
--- a/arch/powerpc/kernel/traps.c
+++ b/arch/powerpc/kernel/traps.c
@@ -1377,6 +1377,7 @@ void facility_unavailable_exception(struct pt_regs *regs)
 	};
 	char *facility = "unknown";
 	u64 value;
+	u32 instword, rd;
 	u8 status;
 	bool hv;
 
@@ -1388,12 +1389,46 @@ void facility_unavailable_exception(struct pt_regs *regs)
 
 	status = value >> 56;
 	if (status == FSCR_DSCR_LG) {
-		/* User is acessing the DSCR.  Set the inherit bit and allow
-		 * the user to set it directly in future by setting via the
-		 * FSCR DSCR bit.  We always leave HFSCR DSCR set.
+		/*
+		 * User is accessing the DSCR register using the problem
+		 * state only SPR number (0x03) either through a mfspr or
+		 * a mtspr instruction. If it is a write attempt through
+		 * a mtspr, then we set the inherit bit. This also allows
+		 * the user to write or read the register directly in the
+		 * future by setting via the FSCR DSCR bit. But in case it
+		 * is a read DSCR attempt through a mfspr instruction, we
+		 * just emulate the instruction instead. This code path will
+		 * always emulate all the mfspr instructions till the user
+		 * has attempted atleast one mtspr instruction. This way it
+		 * preserves the same behaviour when the user is accessing
+		 * the DSCR through privilege level only SPR number (0x11)
+		 * which is emulated through illegal instruction exception.
+		 * We always leave HFSCR DSCR set.
 		 */
-		current->thread.dscr_inherit = 1;
-		mtspr(SPRN_FSCR, value | FSCR_DSCR);
+		if (get_user(instword, (u32 __user *)(regs->nip))) {
+			pr_err("Failed to fetch the user instruction\n");
+			return;
+		}
+
+		/* Write into DSCR (mtspr 0x03, RS) */
+		if ((instword & PPC_INST_MTSPR_DSCR_USER_MASK)
+				== PPC_INST_MTSPR_DSCR_USER) {
+			rd = (instword >> 21) & 0x1f;
+			current->thread.dscr = regs->gpr[rd];
+			current->thread.dscr_inherit = 1;
+			mtspr(SPRN_FSCR, value | FSCR_DSCR);
+		}
+
+		/* Read from DSCR (mfspr RT, 0x03) */
+		if ((instword & PPC_INST_MFSPR_DSCR_USER_MASK)
+				== PPC_INST_MFSPR_DSCR_USER) {
+			if (emulate_instruction(regs)) {
+				pr_err("DSCR based mfspr emulation failed\n");
+				return;
+			}
+			regs->nip += 4;
+			emulate_single_step(regs);
+		}
 		return;
 	}
 
-- 
1.9.3


^ permalink raw reply	[flat|nested] 28+ messages in thread

* [PATCH V2 02/12] powerpc, process: Remove the unused extern dscr_default
  2015-01-13 10:22 [PATCH V2 00/12] POWER DSCR fixes, improvements, docs and tests Anshuman Khandual
  2015-01-13 10:22 ` [PATCH V2 01/12] powerpc: Fix handling of DSCR related facility unavailable exception Anshuman Khandual
@ 2015-01-13 10:22 ` Anshuman Khandual
  2015-01-13 10:22 ` [PATCH V2 03/12] powerpc, offset: Change PACA_DSCR to PACA_DSCR_DEFAULT Anshuman Khandual
                   ` (10 subsequent siblings)
  12 siblings, 0 replies; 28+ messages in thread
From: Anshuman Khandual @ 2015-01-13 10:22 UTC (permalink / raw)
  To: linuxppc-dev, linux-kernel; +Cc: mpe, benh, anton, mikey, shuahkh

The process context switch code no longer uses dscr_default variable
from the sysfs.c file. The variable became unused when we started
storing the CPU specific DSCR value in the PACA structure instead.
This patch just removes this extern declaration. It was originally
added by the following commit.

efcac658: powerpc: Per process DSCR + some fixes (try#4)

Signed-off-by: Anshuman Khandual <khandual@linux.vnet.ibm.com>
---
 arch/powerpc/kernel/process.c | 2 --
 1 file changed, 2 deletions(-)

diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c
index b4cc7be..fe3f682 100644
--- a/arch/powerpc/kernel/process.c
+++ b/arch/powerpc/kernel/process.c
@@ -1112,8 +1112,6 @@ static void setup_ksp_vsid(struct task_struct *p, unsigned long sp)
 /*
  * Copy a thread..
  */
-extern unsigned long dscr_default; /* defined in arch/powerpc/kernel/sysfs.c */
-
 int copy_thread(unsigned long clone_flags, unsigned long usp,
 		unsigned long arg, struct task_struct *p)
 {
-- 
1.9.3


^ permalink raw reply	[flat|nested] 28+ messages in thread

* [PATCH V2 03/12] powerpc, offset: Change PACA_DSCR to PACA_DSCR_DEFAULT
  2015-01-13 10:22 [PATCH V2 00/12] POWER DSCR fixes, improvements, docs and tests Anshuman Khandual
  2015-01-13 10:22 ` [PATCH V2 01/12] powerpc: Fix handling of DSCR related facility unavailable exception Anshuman Khandual
  2015-01-13 10:22 ` [PATCH V2 02/12] powerpc, process: Remove the unused extern dscr_default Anshuman Khandual
@ 2015-01-13 10:22 ` Anshuman Khandual
  2015-01-13 10:22 ` [PATCH V2 04/12] powerpc, dscr: Added some in-code documentation Anshuman Khandual
                   ` (9 subsequent siblings)
  12 siblings, 0 replies; 28+ messages in thread
From: Anshuman Khandual @ 2015-01-13 10:22 UTC (permalink / raw)
  To: linuxppc-dev, linux-kernel; +Cc: mpe, benh, anton, mikey, shuahkh

PACA_DSCR offset macro tracks dscr_default element in the paca
structure. Better change the name of this macro to match that
of the data element it tracks. Makes the code more readable.

Signed-off-by: Anshuman Khandual <khandual@linux.vnet.ibm.com>
---
 arch/powerpc/kernel/asm-offsets.c       | 2 +-
 arch/powerpc/kernel/entry_64.S          | 2 +-
 arch/powerpc/kernel/tm.S                | 4 ++--
 arch/powerpc/kvm/book3s_hv_rmhandlers.S | 2 +-
 4 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/arch/powerpc/kernel/asm-offsets.c b/arch/powerpc/kernel/asm-offsets.c
index e624f96..dcfffe2 100644
--- a/arch/powerpc/kernel/asm-offsets.c
+++ b/arch/powerpc/kernel/asm-offsets.c
@@ -246,7 +246,7 @@ int main(void)
 #endif
 	DEFINE(PACAHWCPUID, offsetof(struct paca_struct, hw_cpu_id));
 	DEFINE(PACAKEXECSTATE, offsetof(struct paca_struct, kexec_state));
-	DEFINE(PACA_DSCR, offsetof(struct paca_struct, dscr_default));
+	DEFINE(PACA_DSCR_DEFAULT, offsetof(struct paca_struct, dscr_default));
 	DEFINE(PACA_STARTTIME, offsetof(struct paca_struct, starttime));
 	DEFINE(PACA_STARTTIME_USER, offsetof(struct paca_struct, starttime_user));
 	DEFINE(PACA_USER_TIME, offsetof(struct paca_struct, user_time));
diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S
index 194e46d..b5cd2b59 100644
--- a/arch/powerpc/kernel/entry_64.S
+++ b/arch/powerpc/kernel/entry_64.S
@@ -564,7 +564,7 @@ BEGIN_FTR_SECTION
 	ld	r0,THREAD_DSCR(r4)
 	cmpwi	r6,0
 	bne	1f
-	ld	r0,PACA_DSCR(r13)
+	ld	r0,PACA_DSCR_DEFAULT(r13)
 1:
 BEGIN_FTR_SECTION_NESTED(70)
 	mfspr	r8, SPRN_FSCR
diff --git a/arch/powerpc/kernel/tm.S b/arch/powerpc/kernel/tm.S
index 2a324f4..dbd2c18 100644
--- a/arch/powerpc/kernel/tm.S
+++ b/arch/powerpc/kernel/tm.S
@@ -293,7 +293,7 @@ dont_backup_fp:
 	ld	r2, STK_GOT(r1)
 
 	/* Load CPU's default DSCR */
-	ld	r0, PACA_DSCR(r13)
+	ld	r0, PACA_DSCR_DEFAULT(r13)
 	mtspr	SPRN_DSCR, r0
 
 	blr
@@ -473,7 +473,7 @@ restore_gprs:
 	ld	r2, STK_GOT(r1)
 
 	/* Load CPU's default DSCR */
-	ld	r0, PACA_DSCR(r13)
+	ld	r0, PACA_DSCR_DEFAULT(r13)
 	mtspr	SPRN_DSCR, r0
 
 	blr
diff --git a/arch/powerpc/kvm/book3s_hv_rmhandlers.S b/arch/powerpc/kvm/book3s_hv_rmhandlers.S
index 10554df..109794b 100644
--- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S
+++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S
@@ -283,7 +283,7 @@ kvm_start_guest:
 kvm_secondary_got_guest:
 
 	/* Set HSTATE_DSCR(r13) to something sensible */
-	ld	r6, PACA_DSCR(r13)
+	ld	r6, PACA_DSCR_DEFAULT(r13)
 	std	r6, HSTATE_DSCR(r13)
 
 	bl	kvmppc_hv_entry
-- 
1.9.3


^ permalink raw reply	[flat|nested] 28+ messages in thread

* [PATCH V2 04/12] powerpc, dscr: Added some in-code documentation
  2015-01-13 10:22 [PATCH V2 00/12] POWER DSCR fixes, improvements, docs and tests Anshuman Khandual
                   ` (2 preceding siblings ...)
  2015-01-13 10:22 ` [PATCH V2 03/12] powerpc, offset: Change PACA_DSCR to PACA_DSCR_DEFAULT Anshuman Khandual
@ 2015-01-13 10:22 ` Anshuman Khandual
  2015-01-13 10:22 ` [PATCH V2 05/12] documentation, powerpc: Add documentation for DSCR support Anshuman Khandual
                   ` (8 subsequent siblings)
  12 siblings, 0 replies; 28+ messages in thread
From: Anshuman Khandual @ 2015-01-13 10:22 UTC (permalink / raw)
  To: linuxppc-dev, linux-kernel; +Cc: mpe, benh, anton, mikey, shuahkh

This patch adds some in-code documentation to the DSCR related
code to make it more readable without having any functional
change to it.

Signed-off-by: Anshuman Khandual <khandual@linux.vnet.ibm.com>
---
 arch/powerpc/include/asm/processor.h |  9 +++++++++
 arch/powerpc/kernel/sysfs.c          | 38 ++++++++++++++++++++++++++++++++++++
 2 files changed, 47 insertions(+)

diff --git a/arch/powerpc/include/asm/processor.h b/arch/powerpc/include/asm/processor.h
index bf117d8..28ded5d 100644
--- a/arch/powerpc/include/asm/processor.h
+++ b/arch/powerpc/include/asm/processor.h
@@ -295,6 +295,15 @@ struct thread_struct {
 #endif
 #ifdef CONFIG_PPC64
 	unsigned long	dscr;
+	/*
+	 * This member element dscr_inherit indicates that the process
+	 * has explicitly attempted and changed the DSCR register value
+	 * for itself. Hence kernel wont use the default CPU DSCR value
+	 * contained in the PACA structure anymore during process context
+	 * switch. Once this variable is set, this behaviour will also be
+	 * inherited to all the children of this process from that point
+	 * onwards.
+	 */
 	int		dscr_inherit;
 	unsigned long	ppr;	/* used to save/restore SMT priority */
 #endif
diff --git a/arch/powerpc/kernel/sysfs.c b/arch/powerpc/kernel/sysfs.c
index fa1fd8a..692873b 100644
--- a/arch/powerpc/kernel/sysfs.c
+++ b/arch/powerpc/kernel/sysfs.c
@@ -496,13 +496,34 @@ static DEVICE_ATTR(spurr, 0400, show_spurr, NULL);
 static DEVICE_ATTR(purr, 0400, show_purr, store_purr);
 static DEVICE_ATTR(pir, 0400, show_pir, NULL);
 
+/*
+ * This is the system wide DSCR register default value. Any
+ * change to this default value through the sysfs interface
+ * will update all per cpu DSCR default values across the
+ * system stored in their respective PACA structures.
+ */
 static unsigned long dscr_default;
 
+/**
+ * read_dscr() - Fetch the cpu specific DSCR default
+ * @val:	Returned cpu specific DSCR default value
+ *
+ * This function returns the per cpu DSCR default value
+ * for any cpu which is contained in it's PACA structure.
+ */
 static void read_dscr(void *val)
 {
 	*(unsigned long *)val = get_paca()->dscr_default;
 }
 
+
+/**
+ * write_dscr() - Update the cpu specific DSCR default
+ * @val:	New cpu specific DSCR default value to update
+ *
+ * This function updates the per cpu DSCR default value
+ * for any cpu which is contained in it's PACA structure.
+ */
 static void write_dscr(void *val)
 {
 	get_paca()->dscr_default = *(unsigned long *)val;
@@ -520,12 +541,29 @@ static void add_write_permission_dev_attr(struct device_attribute *attr)
 	attr->attr.mode |= 0200;
 }
 
+/**
+ * show_dscr_default() - Fetch the system wide DSCR default
+ * @dev:	Device structure
+ * @attr:	Device attribute structure
+ * @buf:	Interface buffer
+ *
+ * This function returns the system wide DSCR default value.
+ */
 static ssize_t show_dscr_default(struct device *dev,
 		struct device_attribute *attr, char *buf)
 {
 	return sprintf(buf, "%lx\n", dscr_default);
 }
 
+/**
+ * store_dscr_default() - Update the system wide DSCR default
+ * @dev:	Device structure
+ * @attr:	Device attribute structure
+ * @buf:	Interface buffer
+ * @count:	Size of the update
+ *
+ * This function updates the system wide DSCR default value.
+ */
 static ssize_t __used store_dscr_default(struct device *dev,
 		struct device_attribute *attr, const char *buf,
 		size_t count)
-- 
1.9.3


^ permalink raw reply	[flat|nested] 28+ messages in thread

* [PATCH V2 05/12] documentation, powerpc: Add documentation for DSCR support
  2015-01-13 10:22 [PATCH V2 00/12] POWER DSCR fixes, improvements, docs and tests Anshuman Khandual
                   ` (3 preceding siblings ...)
  2015-01-13 10:22 ` [PATCH V2 04/12] powerpc, dscr: Added some in-code documentation Anshuman Khandual
@ 2015-01-13 10:22 ` Anshuman Khandual
  2015-01-13 10:22 ` [PATCH V2 06/12] selftests, powerpc: Add test for system wide DSCR default Anshuman Khandual
                   ` (7 subsequent siblings)
  12 siblings, 0 replies; 28+ messages in thread
From: Anshuman Khandual @ 2015-01-13 10:22 UTC (permalink / raw)
  To: linuxppc-dev, linux-kernel; +Cc: mpe, benh, anton, mikey, shuahkh

This patch adds a new documentation file explaining the DSCR
support on powerpc platforms. This explains DSCR related data
structure, code paths and also available user interfaces. Any
further functional changes to the DSCR support in the kernel
should definitely update the documentation here.

Signed-off-by: Anshuman Khandual <khandual@linux.vnet.ibm.com>
---
 Documentation/powerpc/00-INDEX |  2 +
 Documentation/powerpc/dscr.txt | 83 ++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 85 insertions(+)
 create mode 100644 Documentation/powerpc/dscr.txt

diff --git a/Documentation/powerpc/00-INDEX b/Documentation/powerpc/00-INDEX
index 6fd0e8b..9dc845c 100644
--- a/Documentation/powerpc/00-INDEX
+++ b/Documentation/powerpc/00-INDEX
@@ -30,3 +30,5 @@ ptrace.txt
 	- Information on the ptrace interfaces for hardware debug registers.
 transactional_memory.txt
 	- Overview of the Power8 transactional memory support.
+dscr.txt
+	- Overview DSCR (Data Stream Control Register) support.
diff --git a/Documentation/powerpc/dscr.txt b/Documentation/powerpc/dscr.txt
new file mode 100644
index 0000000..1ff4400
--- /dev/null
+++ b/Documentation/powerpc/dscr.txt
@@ -0,0 +1,83 @@
+			DSCR (Data Stream Control Register)
+		================================================
+
+DSCR register in powerpc allows user to have some control of prefetch of data
+stream in the processor. Please refer to the ISA documents or related manual
+for more detailed information regarding how to use this DSCR to attain this
+control of the pefetches . This document here provides an overview of kernel
+support for DSCR, related kernel objects, it's functionalities and exported
+user interface.
+
+(A) Data Structures:
+
+	(1) thread_struct:
+		dscr		/* Thread DSCR value */
+		dscr_inherit	/* Thread has changed default DSCR */
+
+	(2) PACA:
+		dscr_default	/* per-CPU DSCR default value */
+
+	(3) sysfs.c:
+		dscr_default	/* System DSCR default value */
+
+(B) Scheduler Changes:
+
+	Scheduler will write the per-CPU DSCR default which is stored in the
+	CPU's PACA value into the register if the thread has dscr_inherit value
+	cleared which means that it has not changed the default DSCR till now.
+	If the dscr_inherit value is set which means that it has changed the
+	default DSCR value, scheduler will write the changed value which will
+	now be contained in thread struct's dscr into the register instead of
+	the per-CPU default PACA based DSCR value.
+
+	NOTE: Please note here that the system wide global DSCR value never
+	gets used directly in the scheduler process context switch at all.
+
+(C) SYSFS Interface:
+
+	Global DSCR default:		/sys/devices/system/cpu/dscr_default
+	CPU specific DSCR default:	/sys/devices/system/cpu/cpuN/dscr
+
+	Changing the global DSCR default in the sysfs will change all the CPU
+	specific DSCR defaults immediately in their PACA structures. Again if
+	the current process has the dscr_inherit clear, it also writes the new
+	value into every CPU's DSCR register right away and updates the current
+	thread's DSCR value as well.
+
+	Changing the CPU specif DSCR default value in the sysfs does exactly
+	the same thing as above but unlike the global one above, it just changes
+	stuff for that particular CPU instead for all the CPUs on the system.
+
+(D) User Space Instructions:
+
+	The DSCR register can be accessed in the user space using any of these
+	two SPR numbers available for that purpose.
+
+	(1) Problem state SPR:		0x03	(Un-privileged, POWER8 only)
+	(2) Privileged state SPR:	0x11	(Privileged)
+
+	Accessing DSCR through privileged SPR number (0x11) from user space
+	works, as it is emulated following an illegal instruction exception
+	inside the kernel. Both mfspr and mtspr instructions are emulated.
+
+	Accessing DSCR through user level SPR (0x03) from user space will first
+	create a facility unavailable exception. Inside this exception handler
+	all mfspr isntruction based read attempts will get emulated and returned
+	where as the first mtspr instruction based write attempts will enable
+	the DSCR facility for the next time around (both for read and write) by
+	setting DSCR facility in the FSCR register.
+
+(E) Specifics about 'dscr_inherit':
+
+	The thread struct element 'dscr_inherit' represents whether the thread
+	in question has attempted and changed the DSCR itself using any of the
+	following methods. This element signifies whether the thread wants to
+	use the CPU default DSCR value or its own changed DSCR value in the
+	kernel.
+
+		(1) mtspr instruction	(SPR number 0x03)
+		(2) mtspr instruction	(SPR number 0x11)
+		(3) ptrace interface	(Explicitly set user DSCR value)
+
+	Any child of the process created after this event in the process inherits
+	this same behaviour as well.
-- 
1.9.3


^ permalink raw reply	[flat|nested] 28+ messages in thread

* [PATCH V2 06/12] selftests, powerpc: Add test for system wide DSCR default
  2015-01-13 10:22 [PATCH V2 00/12] POWER DSCR fixes, improvements, docs and tests Anshuman Khandual
                   ` (4 preceding siblings ...)
  2015-01-13 10:22 ` [PATCH V2 05/12] documentation, powerpc: Add documentation for DSCR support Anshuman Khandual
@ 2015-01-13 10:22 ` Anshuman Khandual
  2015-01-13 15:22   ` Shuah Khan
  2015-03-27 12:01   ` [V2,06/12] " Michael Ellerman
  2015-01-13 10:22 ` [PATCH V2 07/12] selftests, powerpc: Add test for explicitly changing DSCR value Anshuman Khandual
                   ` (6 subsequent siblings)
  12 siblings, 2 replies; 28+ messages in thread
From: Anshuman Khandual @ 2015-01-13 10:22 UTC (permalink / raw)
  To: linuxppc-dev, linux-kernel; +Cc: mpe, benh, anton, mikey, shuahkh

This patch adds a test case for the system wide DSCR default
value, which when changed through it's sysfs interface must
be visible to all threads reading DSCR either through the
privilege state SPR or the problem state SPR. The DSCR value
change should be immediate as well.

Signed-off-by: Anshuman Khandual <khandual@linux.vnet.ibm.com>
---
 tools/testing/selftests/powerpc/Makefile           |   2 +-
 tools/testing/selftests/powerpc/dscr/Makefile      |  17 +++
 tools/testing/selftests/powerpc/dscr/dscr.h        | 120 ++++++++++++++++++++
 .../selftests/powerpc/dscr/dscr_default_test.c     | 121 +++++++++++++++++++++
 4 files changed, 259 insertions(+), 1 deletion(-)
 create mode 100644 tools/testing/selftests/powerpc/dscr/Makefile
 create mode 100644 tools/testing/selftests/powerpc/dscr/dscr.h
 create mode 100644 tools/testing/selftests/powerpc/dscr/dscr_default_test.c

diff --git a/tools/testing/selftests/powerpc/Makefile b/tools/testing/selftests/powerpc/Makefile
index f6ff90a..1318883 100644
--- a/tools/testing/selftests/powerpc/Makefile
+++ b/tools/testing/selftests/powerpc/Makefile
@@ -13,7 +13,7 @@ CFLAGS := -Wall -O2 -flto -Wall -Werror -DGIT_VERSION='"$(GIT_VERSION)"' -I$(CUR
 
 export CC CFLAGS
 
-TARGETS = pmu copyloops mm tm primitives
+TARGETS = pmu copyloops mm tm primitives dscr
 
 endif
 
diff --git a/tools/testing/selftests/powerpc/dscr/Makefile b/tools/testing/selftests/powerpc/dscr/Makefile
new file mode 100644
index 0000000..0aa90ab
--- /dev/null
+++ b/tools/testing/selftests/powerpc/dscr/Makefile
@@ -0,0 +1,17 @@
+PROGS := dscr_default_test
+
+CFLAGS := $(CFLAGS) -lpthread
+
+all: $(PROGS)
+
+$(PROGS): ../harness.c
+
+run_tests: all
+	@-for PROG in $(PROGS); do \
+		./$$PROG; \
+	done;
+
+clean:
+	rm -f $(PROGS) *.o
+
+.PHONY: all run_tests clean
diff --git a/tools/testing/selftests/powerpc/dscr/dscr.h b/tools/testing/selftests/powerpc/dscr/dscr.h
new file mode 100644
index 0000000..2e6535b
--- /dev/null
+++ b/tools/testing/selftests/powerpc/dscr/dscr.h
@@ -0,0 +1,120 @@
+/*
+ * POWER Data Stream Control Register (DSCR)
+ *
+ * This header file contains helper functions and macros
+ * required for all the DSCR related test cases.
+ *
+ * Copyright (C) 2012 Anton Blanchard <anton@au.ibm.com>, IBM
+ * 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.
+ */
+#ifndef _SELFTESTS_POWERPC_DSCR_DSCR_H
+#define _SELFTESTS_POWERPC_DSCR_DSCR_H
+
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <dirent.h>
+#include <pthread.h>
+#include <sched.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+
+#include "utils.h"
+
+#define SPRN_DSCR	0x11	/* Privilege state SPR */
+#define SPRN_DSCR_USR	0x03	/* Problem state SPR */
+#define THREADS		100	/* Max threads */
+#define COUNT		100	/* Max iterations */
+#define DSCR_MAX	16	/* Max DSCR value */
+#define LEN_MAX		100	/* Max name length */
+
+#define DSCR_DEFAULT	"/sys/devices/system/cpu/dscr_default"
+#define CPU_PATH	"/sys/devices/system/cpu/"
+
+#define rmb()  asm volatile("lwsync":::"memory")
+#define wmb()  asm volatile("lwsync":::"memory")
+
+#define ACCESS_ONCE(x) (*(volatile typeof(x) *)&(x))
+
+/* Prilvilege state DSCR access */
+inline unsigned long get_dscr(void)
+{
+	unsigned long ret;
+
+	asm volatile("mfspr %0,%1" : "=r" (ret): "i" (SPRN_DSCR));
+
+	return ret;
+}
+
+inline void set_dscr(unsigned long val)
+{
+	asm volatile("mtspr %1,%0" : : "r" (val), "i" (SPRN_DSCR));
+}
+
+/* Problem state DSCR access */
+inline unsigned long get_dscr_usr(void)
+{
+	unsigned long ret;
+
+	asm volatile("mfspr %0,%1" : "=r" (ret): "i" (SPRN_DSCR_USR));
+
+	return ret;
+}
+
+inline void set_dscr_usr(unsigned long val)
+{
+	asm volatile("mtspr %1,%0" : : "r" (val), "i" (SPRN_DSCR_USR));
+}
+
+/* Default DSCR access */
+unsigned long get_default_dscr(void)
+{
+	int fd = -1;
+	char buf[16];
+	unsigned long val;
+
+	if (fd == -1) {
+		fd = open(DSCR_DEFAULT, O_RDONLY);
+		if (fd == -1) {
+			perror("open() failed\n");
+			exit(1);
+		}
+	}
+	memset(buf, 0, sizeof(buf));
+	lseek(fd, 0, SEEK_SET);
+	read(fd, buf, sizeof(buf));
+	sscanf(buf, "%lx", &val);
+	close(fd);
+	return val;
+}
+
+void set_default_dscr(unsigned long val)
+{
+	int fd = -1;
+	char buf[16];
+
+	if (fd == -1) {
+		fd = open(DSCR_DEFAULT, O_RDWR);
+		if (fd == -1) {
+			perror("open() failed\n");
+			exit(1);
+		}
+	}
+	sprintf(buf, "%lx\n", val);
+	write(fd, buf, strlen(buf));
+	close(fd);
+}
+
+double uniform_deviate(int seed)
+{
+	return seed * (1.0 / (RAND_MAX + 1.0));
+}
+#endif	/* _SELFTESTS_POWERPC_DSCR_DSCR_H */
diff --git a/tools/testing/selftests/powerpc/dscr/dscr_default_test.c b/tools/testing/selftests/powerpc/dscr/dscr_default_test.c
new file mode 100644
index 0000000..fd8b7b9
--- /dev/null
+++ b/tools/testing/selftests/powerpc/dscr/dscr_default_test.c
@@ -0,0 +1,121 @@
+/*
+ * POWER Data Stream Control Register (DSCR) default test
+ *
+ * This test modifies the system wide default DSCR through
+ * it's sysfs interface and then verifies that all threads
+ * see the correct changed DSCR value immediately.
+ *
+ * Copyright (C) 2012 Anton Blanchard <anton@au.ibm.com>, IBM
+ * 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.
+ */
+#include "dscr.h"
+
+static unsigned long dscr;		/* System DSCR default */
+static unsigned long sequence;
+static unsigned long result[THREADS];
+
+static void *do_test(void *in)
+{
+	unsigned long thread = (unsigned long)in;
+	unsigned long i;
+
+	for (i = 0; i < COUNT; i++) {
+		unsigned long d, cur_dscr, cur_dscr_usr;
+		unsigned long s1, s2;
+
+		s1 = ACCESS_ONCE(sequence);
+		if (s1 & 1)
+			continue;
+		rmb();
+
+		d = dscr;
+		cur_dscr = get_dscr();
+		cur_dscr_usr = get_dscr_usr();
+
+		rmb();
+		s2 = sequence;
+
+		if (s1 != s2)
+			continue;
+
+		if (cur_dscr != d) {
+			fprintf(stderr, "thread %ld kernel DSCR should be %ld "
+				"but is %ld\n", thread, d, cur_dscr);
+			result[thread] = 1;
+			pthread_exit(&result[thread]);
+		}
+
+		if (cur_dscr_usr != d) {
+			fprintf(stderr, "thread %ld user DSCR should be %ld "
+				"but is %ld\n", thread, d, cur_dscr_usr);
+			result[thread] = 1;
+			pthread_exit(&result[thread]);
+		}
+	}
+	result[thread] = 0;
+	pthread_exit(&result[thread]);
+}
+
+int test_body(void)
+{
+	pthread_t threads[THREADS];
+	unsigned long i, *status[THREADS];
+
+	/* Initial DSCR default */
+	dscr = 1;
+	set_default_dscr(dscr);
+
+	/* Spawn all testing threads */
+	for (i = 0; i < THREADS; i++) {
+		if (pthread_create(&threads[i], NULL, do_test, (void *)i)) {
+			perror("pthread_create() failed\n");
+			exit(1);
+		}
+	}
+
+	srand(getpid());
+
+	/* Keep changing the DSCR default */
+	for (i = 0; i < COUNT; i++) {
+		double ret = uniform_deviate(rand());
+
+		if (ret < 0.0001) {
+			sequence++;
+			wmb();
+
+			dscr++;
+			if (dscr > DSCR_MAX)
+				dscr = 0;
+
+			set_default_dscr(dscr);
+
+			wmb();
+			sequence++;
+		}
+	}
+
+	/* Individual testing thread exit status */
+	for (i = 0; i < THREADS; i++) {
+		if (pthread_join(threads[i], (void **)&(status[i]))) {
+			perror("pthread_join() failed\n");
+			exit(1);
+		}
+
+		if (*status[i]) {
+			printf("%ldth thread failed to join with %ld status\n",
+								i, *status[i]);
+			return 1;
+		}
+	}
+	return 0;
+}
+
+int main(int argc, char *argv[])
+{
+	return test_harness(test_body, "dscr_default_test");
+}
-- 
1.9.3


^ permalink raw reply	[flat|nested] 28+ messages in thread

* [PATCH V2 07/12] selftests, powerpc: Add test for explicitly changing DSCR value
  2015-01-13 10:22 [PATCH V2 00/12] POWER DSCR fixes, improvements, docs and tests Anshuman Khandual
                   ` (5 preceding siblings ...)
  2015-01-13 10:22 ` [PATCH V2 06/12] selftests, powerpc: Add test for system wide DSCR default Anshuman Khandual
@ 2015-01-13 10:22 ` Anshuman Khandual
  2015-01-13 15:23   ` Shuah Khan
  2015-01-13 10:22 ` [PATCH V2 08/12] selftests, powerpc: Add test for DSCR SPR numbers Anshuman Khandual
                   ` (5 subsequent siblings)
  12 siblings, 1 reply; 28+ messages in thread
From: Anshuman Khandual @ 2015-01-13 10:22 UTC (permalink / raw)
  To: linuxppc-dev, linux-kernel; +Cc: mpe, benh, anton, mikey, shuahkh

This patch adds a test which modifies the DSCR using mtspr instruction
and verifies the change using mfspr instruction. It uses both the
privilege state SPR as well as the problem state SPR for the purpose.

Signed-off-by: Anshuman Khandual <khandual@linux.vnet.ibm.com>
---
 tools/testing/selftests/powerpc/dscr/Makefile      |  2 +-
 .../selftests/powerpc/dscr/dscr_explicit_test.c    | 72 ++++++++++++++++++++++
 2 files changed, 73 insertions(+), 1 deletion(-)
 create mode 100644 tools/testing/selftests/powerpc/dscr/dscr_explicit_test.c

diff --git a/tools/testing/selftests/powerpc/dscr/Makefile b/tools/testing/selftests/powerpc/dscr/Makefile
index 0aa90ab..aede453 100644
--- a/tools/testing/selftests/powerpc/dscr/Makefile
+++ b/tools/testing/selftests/powerpc/dscr/Makefile
@@ -1,4 +1,4 @@
-PROGS := dscr_default_test
+PROGS := dscr_default_test dscr_explicit_test
 
 CFLAGS := $(CFLAGS) -lpthread
 
diff --git a/tools/testing/selftests/powerpc/dscr/dscr_explicit_test.c b/tools/testing/selftests/powerpc/dscr/dscr_explicit_test.c
new file mode 100644
index 0000000..5c0b7c1
--- /dev/null
+++ b/tools/testing/selftests/powerpc/dscr/dscr_explicit_test.c
@@ -0,0 +1,72 @@
+/*
+ * POWER Data Stream Control Register (DSCR) explicit test
+ *
+ * This test modifies the DSCR value using mtspr instruction and
+ * verifies the change with mfspr instruction. It uses both the
+ * privilege state SPR and the problem state SPR for this purpose.
+ *
+ * When using the privilege state SPR, the instructions such as
+ * mfspr or mtspr are priviledged and the kernel emulates them
+ * for us. Instructions using problem state SPR can be exuecuted
+ * directly without any emulation if the HW supports them. Else
+ * they also get emulated by the kernel.
+ *
+ * Copyright (C) 2012 Anton Blanchard <anton@au.ibm.com>, IBM
+ * 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.
+ */
+#include "dscr.h"
+
+int test_body(void)
+{
+	unsigned long i, dscr = 0;
+
+	srand(getpid());
+	set_dscr(dscr);
+
+	for (i = 0; i < COUNT; i++) {
+		unsigned long cur_dscr, cur_dscr_usr;
+		double ret = uniform_deviate(rand());
+
+		if (ret < 0.001) {
+			dscr++;
+			if (dscr > DSCR_MAX)
+				dscr = 0;
+
+			set_dscr(dscr);
+		}
+
+		cur_dscr = get_dscr();
+		if (cur_dscr != dscr) {
+			fprintf(stderr, "Kernel DSCR should be %ld but "
+					"is %ld\n", dscr, cur_dscr);
+			return 1;
+		}
+
+		ret = uniform_deviate(rand());
+		if (ret < 0.001) {
+			dscr++;
+			if (dscr > DSCR_MAX)
+				dscr = 0;
+
+			set_dscr_usr(dscr);
+		}
+
+		cur_dscr_usr = get_dscr_usr();
+		if (cur_dscr_usr != dscr) {
+			fprintf(stderr, "User DSCR should be %ld but "
+					"is %ld\n", dscr, cur_dscr_usr);
+			return 1;
+		}
+	}
+	return 0;
+}
+
+int main(int argc, char *argv[])
+{
+	return test_harness(test_body, "dscr_explicit_test");
+}
-- 
1.9.3


^ permalink raw reply	[flat|nested] 28+ messages in thread

* [PATCH V2 08/12] selftests, powerpc: Add test for DSCR SPR numbers
  2015-01-13 10:22 [PATCH V2 00/12] POWER DSCR fixes, improvements, docs and tests Anshuman Khandual
                   ` (6 preceding siblings ...)
  2015-01-13 10:22 ` [PATCH V2 07/12] selftests, powerpc: Add test for explicitly changing DSCR value Anshuman Khandual
@ 2015-01-13 10:22 ` Anshuman Khandual
  2015-01-13 15:23   ` Shuah Khan
  2015-01-13 10:22 ` [PATCH V2 09/12] selftests, powerpc: Add test for DSCR value inheritence across fork Anshuman Khandual
                   ` (4 subsequent siblings)
  12 siblings, 1 reply; 28+ messages in thread
From: Anshuman Khandual @ 2015-01-13 10:22 UTC (permalink / raw)
  To: linuxppc-dev, linux-kernel; +Cc: mpe, benh, anton, mikey, shuahkh

This patch adds a test which verifies that the DSCR privilege and
problem state SPR read & write accesses while making sure that the
results are always the same irrespective of which SPR number is
being used.

Signed-off-by: Anshuman Khandual <khandual@linux.vnet.ibm.com>
---
 tools/testing/selftests/powerpc/dscr/Makefile      |  2 +-
 .../selftests/powerpc/dscr/dscr_user_test.c        | 62 ++++++++++++++++++++++
 2 files changed, 63 insertions(+), 1 deletion(-)
 create mode 100644 tools/testing/selftests/powerpc/dscr/dscr_user_test.c

diff --git a/tools/testing/selftests/powerpc/dscr/Makefile b/tools/testing/selftests/powerpc/dscr/Makefile
index aede453..ae865d8 100644
--- a/tools/testing/selftests/powerpc/dscr/Makefile
+++ b/tools/testing/selftests/powerpc/dscr/Makefile
@@ -1,4 +1,4 @@
-PROGS := dscr_default_test dscr_explicit_test
+PROGS := dscr_default_test dscr_explicit_test dscr_user_test
 
 CFLAGS := $(CFLAGS) -lpthread
 
diff --git a/tools/testing/selftests/powerpc/dscr/dscr_user_test.c b/tools/testing/selftests/powerpc/dscr/dscr_user_test.c
new file mode 100644
index 0000000..f25d68e
--- /dev/null
+++ b/tools/testing/selftests/powerpc/dscr/dscr_user_test.c
@@ -0,0 +1,62 @@
+/*
+ * POWER Data Stream Control Register (DSCR) SPR test
+ *
+ * This test modifies the DSCR value through both the SPR number
+ * based mtspr instruction and then makes sure that the same is
+ * reflected through mfspr instruction using either of the SPR
+ * numbers.
+ *
+ * When using the privilege state SPR, the instructions such as
+ * mfspr or mtspr are priviledged and the kernel emulates them
+ * for us. Instructions using problem state SPR can be exuecuted
+ * directly without any emulation if the HW supports them. Else
+ * they also get emulated by the kernel.
+ *
+ * Copyright (C) 2013 Anton Blanchard <anton@au.ibm.com>, IBM
+ * 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.
+ */
+#include "dscr.h"
+
+static int check_dscr(char *str)
+{
+	unsigned long cur_dscr, cur_dscr_usr;
+
+	cur_dscr = get_dscr();
+	cur_dscr_usr = get_dscr_usr();
+	if (cur_dscr != cur_dscr_usr) {
+		printf("%s set, kernel get %lx != user get %lx\n",
+					str, cur_dscr, cur_dscr_usr);
+		return 1;
+	}
+	return 0;
+}
+
+int test_body(void)
+{
+	int i;
+
+	check_dscr("");
+
+	for (i = 0; i < COUNT; i++) {
+		set_dscr(i);
+		if (check_dscr("kernel"))
+			return 1;
+	}
+
+	for (i = 0; i < COUNT; i++) {
+		set_dscr_usr(i);
+		if (check_dscr("user"))
+			return 1;
+	}
+	return 0;
+}
+
+int main(int argc, char *argv[])
+{
+	return test_harness(test_body, "dscr_user_test");
+}
-- 
1.9.3


^ permalink raw reply	[flat|nested] 28+ messages in thread

* [PATCH V2 09/12] selftests, powerpc: Add test for DSCR value inheritence across fork
  2015-01-13 10:22 [PATCH V2 00/12] POWER DSCR fixes, improvements, docs and tests Anshuman Khandual
                   ` (7 preceding siblings ...)
  2015-01-13 10:22 ` [PATCH V2 08/12] selftests, powerpc: Add test for DSCR SPR numbers Anshuman Khandual
@ 2015-01-13 10:22 ` Anshuman Khandual
  2015-01-13 15:24   ` Shuah Khan
  2015-01-13 10:22 ` [PATCH V2 10/12] selftests, powerpc: Add test for DSCR inheritence across fork & exec Anshuman Khandual
                   ` (3 subsequent siblings)
  12 siblings, 1 reply; 28+ messages in thread
From: Anshuman Khandual @ 2015-01-13 10:22 UTC (permalink / raw)
  To: linuxppc-dev, linux-kernel; +Cc: mpe, benh, anton, mikey, shuahkh

This patch adds a test to verify that the changed DSCR value inside
any process would be inherited to it's child process across the fork
system call.

Signed-off-by: Anshuman Khandual <khandual@linux.vnet.ibm.com>
---
 tools/testing/selftests/powerpc/dscr/Makefile      |  3 +-
 .../selftests/powerpc/dscr/dscr_inherit_test.c     | 96 ++++++++++++++++++++++
 2 files changed, 98 insertions(+), 1 deletion(-)
 create mode 100644 tools/testing/selftests/powerpc/dscr/dscr_inherit_test.c

diff --git a/tools/testing/selftests/powerpc/dscr/Makefile b/tools/testing/selftests/powerpc/dscr/Makefile
index ae865d8..81239e2 100644
--- a/tools/testing/selftests/powerpc/dscr/Makefile
+++ b/tools/testing/selftests/powerpc/dscr/Makefile
@@ -1,4 +1,5 @@
-PROGS := dscr_default_test dscr_explicit_test dscr_user_test
+PROGS := dscr_default_test dscr_explicit_test dscr_user_test	\
+	 dscr_inherit_test
 
 CFLAGS := $(CFLAGS) -lpthread
 
diff --git a/tools/testing/selftests/powerpc/dscr/dscr_inherit_test.c b/tools/testing/selftests/powerpc/dscr/dscr_inherit_test.c
new file mode 100644
index 0000000..f1add77
--- /dev/null
+++ b/tools/testing/selftests/powerpc/dscr/dscr_inherit_test.c
@@ -0,0 +1,96 @@
+/*
+ * POWER Data Stream Control Register (DSCR) fork test
+ *
+ * This testcase modifies the DSCR using mtspr, forks and then
+ * verifies that the child process has the correct changed DSCR
+ * value using mfspr.
+ *
+ * When using the privilege state SPR, the instructions such as
+ * mfspr or mtspr are priviledged and the kernel emulates them
+ * for us. Instructions using problem state SPR can be exuecuted
+ * directly without any emulation if the HW supports them. Else
+ * they also get emulated by the kernel.
+ *
+ * Copyright (C) 2012 Anton Blanchard <anton@au.ibm.com>, IBM
+ * 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.
+ */
+#include "dscr.h"
+
+int test_body(void)
+{
+	unsigned long i, dscr = 0;
+	pid_t pid;
+
+	srand(getpid());
+	set_dscr(dscr);
+
+	for (i = 0; i < COUNT; i++) {
+		unsigned long cur_dscr, cur_dscr_usr;
+
+		dscr++;
+		if (dscr > DSCR_MAX)
+			dscr = 0;
+
+		if (i % 2 == 0)
+			set_dscr_usr(dscr);
+		else
+			set_dscr(dscr);
+
+		/*
+		 * XXX: Force a context switch out so that DSCR
+		 * current value is copied into the thread struct
+		 * which is required for the child to inherit the
+		 * changed value.
+		 */
+		sleep(1);
+
+		pid = fork();
+		if (pid == -1) {
+			perror("fork() failed\n");
+			exit(1);
+		} else if (pid) {
+			int status;
+
+			if (waitpid(pid, &status, 0) == -1) {
+				perror("waitpid() failed\n");
+				exit(1);
+			}
+
+			if (!WIFEXITED(status)) {
+				fprintf(stderr, "Child didn't exit cleanly\n");
+				exit(1);
+			}
+
+			if (WEXITSTATUS(status) != 0) {
+				fprintf(stderr, "Child didn't exit cleanly\n");
+				return 1;
+			}
+		} else {
+			cur_dscr = get_dscr();
+			if (cur_dscr != dscr) {
+				fprintf(stderr, "Kernel DSCR should be %ld "
+					"but is %ld\n", dscr, cur_dscr);
+				exit(1);
+			}
+
+			cur_dscr_usr = get_dscr_usr();
+			if (cur_dscr_usr != dscr) {
+				fprintf(stderr, "User DSCR should be %ld "
+					"but is %ld\n", dscr, cur_dscr_usr);
+				exit(1);
+			}
+			exit(0);
+		}
+	}
+	return 0;
+}
+
+int main(int argc, char *argv[])
+{
+	return test_harness(test_body, "dscr_inherit_test");
+}
-- 
1.9.3


^ permalink raw reply	[flat|nested] 28+ messages in thread

* [PATCH V2 10/12] selftests, powerpc: Add test for DSCR inheritence across fork & exec
  2015-01-13 10:22 [PATCH V2 00/12] POWER DSCR fixes, improvements, docs and tests Anshuman Khandual
                   ` (8 preceding siblings ...)
  2015-01-13 10:22 ` [PATCH V2 09/12] selftests, powerpc: Add test for DSCR value inheritence across fork Anshuman Khandual
@ 2015-01-13 10:22 ` Anshuman Khandual
  2015-01-13 15:24   ` Shuah Khan
  2015-01-13 10:22 ` [PATCH V2 11/12] selftests, powerpc: Add test for all DSCR sysfs interfaces Anshuman Khandual
                   ` (2 subsequent siblings)
  12 siblings, 1 reply; 28+ messages in thread
From: Anshuman Khandual @ 2015-01-13 10:22 UTC (permalink / raw)
  To: linuxppc-dev, linux-kernel; +Cc: mpe, benh, anton, mikey, shuahkh

This patch adds a test case to verify that the changed DSCR value
inside any process would be inherited to it's child across the fork
and exec system call.

Signed-off-by: Anshuman Khandual <khandual@linux.vnet.ibm.com>
---
 tools/testing/selftests/powerpc/dscr/Makefile      |   2 +-
 .../powerpc/dscr/dscr_inherit_exec_test.c          | 118 +++++++++++++++++++++
 2 files changed, 119 insertions(+), 1 deletion(-)
 create mode 100644 tools/testing/selftests/powerpc/dscr/dscr_inherit_exec_test.c

diff --git a/tools/testing/selftests/powerpc/dscr/Makefile b/tools/testing/selftests/powerpc/dscr/Makefile
index 81239e2..4e84309 100644
--- a/tools/testing/selftests/powerpc/dscr/Makefile
+++ b/tools/testing/selftests/powerpc/dscr/Makefile
@@ -1,5 +1,5 @@
 PROGS := dscr_default_test dscr_explicit_test dscr_user_test	\
-	 dscr_inherit_test
+	 dscr_inherit_test dscr_inherit_exec_test
 
 CFLAGS := $(CFLAGS) -lpthread
 
diff --git a/tools/testing/selftests/powerpc/dscr/dscr_inherit_exec_test.c b/tools/testing/selftests/powerpc/dscr/dscr_inherit_exec_test.c
new file mode 100644
index 0000000..5ff3849
--- /dev/null
+++ b/tools/testing/selftests/powerpc/dscr/dscr_inherit_exec_test.c
@@ -0,0 +1,118 @@
+/*
+ * POWER Data Stream Control Register (DSCR) fork exec test
+ *
+ * This testcase modifies the DSCR using mtspr, forks & execs and
+ * verifies that the child is using the changed DSCR using mfspr.
+ *
+ * When using the privilege state SPR, the instructions such as
+ * mfspr or mtspr are priviledged and the kernel emulates them
+ * for us. Instructions using problem state SPR can be exuecuted
+ * directly without any emulation if the HW supports them. Else
+ * they also get emulated by the kernel.
+ *
+ * Copyright (C) 2012 Anton Blanchard <anton@au.ibm.com>, IBM
+ * 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.
+ */
+#include "dscr.h"
+
+static char prog[LEN_MAX];
+
+static void do_exec(unsigned long parent_dscr)
+{
+	unsigned long cur_dscr, cur_dscr_usr;
+
+	cur_dscr = get_dscr();
+	cur_dscr_usr = get_dscr_usr();
+
+	if (cur_dscr != parent_dscr) {
+		fprintf(stderr, "Parent DSCR %ld was not inherited "
+				"over exec (kernel value)\n", parent_dscr);
+		exit(1);
+	}
+
+	if (cur_dscr_usr != parent_dscr) {
+		fprintf(stderr, "Parent DSCR %ld was not inherited "
+				"over exec (user value)\n", parent_dscr);
+		exit(1);
+	}
+	exit(0);
+}
+
+int test_body(void)
+{
+	unsigned long i, dscr = 0;
+	pid_t pid;
+
+	for (i = 0; i < COUNT; i++) {
+		dscr++;
+		if (dscr > DSCR_MAX)
+			dscr = 0;
+
+		if (dscr == get_default_dscr())
+			continue;
+
+		if (i % 2 == 0)
+			set_dscr_usr(dscr);
+		else
+			set_dscr(dscr);
+
+		/*
+		 * XXX: Force a context switch out so that DSCR
+		 * current value is copied into the thread struct
+		 * which is required for the child to inherit the
+		 * changed value.
+		 */
+		sleep(1);
+
+		pid = fork();
+		if (pid == -1) {
+			perror("fork() failed\n");
+			exit(1);
+		} else if (pid) {
+			int status;
+
+			if (waitpid(pid, &status, 0) == -1) {
+				perror("waitpid() failed\n");
+				exit(1);
+			}
+
+			if (!WIFEXITED(status)) {
+				fprintf(stderr, "Child didn't exit cleanly\n");
+				exit(1);
+			}
+
+			if (WEXITSTATUS(status) != 0) {
+				fprintf(stderr, "Child didn't exit cleanly\n");
+				return 1;
+			}
+		} else {
+			char dscr_str[16];
+
+			sprintf(dscr_str, "%ld", dscr);
+			execlp(prog, prog, "exec", dscr_str, NULL);
+			exit(1);
+		}
+	}
+	return 0;
+}
+
+int main(int argc, char *argv[])
+{
+	if (argc == 3 && !strcmp(argv[1], "exec")) {
+		unsigned long parent_dscr;
+
+		parent_dscr = atoi(argv[2]);
+		do_exec(parent_dscr);
+	} else if (argc != 1) {
+		fprintf(stderr, "Usage: %s\n", argv[0]);
+		exit(1);
+	}
+
+	strncpy(prog, argv[0], strlen(argv[0]));
+	return test_harness(test_body, "dscr_inherit_exec_test");
+}
-- 
1.9.3


^ permalink raw reply	[flat|nested] 28+ messages in thread

* [PATCH V2 11/12] selftests, powerpc: Add test for all DSCR sysfs interfaces
  2015-01-13 10:22 [PATCH V2 00/12] POWER DSCR fixes, improvements, docs and tests Anshuman Khandual
                   ` (9 preceding siblings ...)
  2015-01-13 10:22 ` [PATCH V2 10/12] selftests, powerpc: Add test for DSCR inheritence across fork & exec Anshuman Khandual
@ 2015-01-13 10:22 ` Anshuman Khandual
  2015-01-13 15:24   ` Shuah Khan
  2015-01-13 10:22 ` [PATCH V2 12/12] selftests, powerpc: Add thread based stress test for " Anshuman Khandual
  2015-02-04  8:21 ` [PATCH V2 00/12] POWER DSCR fixes, improvements, docs and tests Anshuman Khandual
  12 siblings, 1 reply; 28+ messages in thread
From: Anshuman Khandual @ 2015-01-13 10:22 UTC (permalink / raw)
  To: linuxppc-dev, linux-kernel; +Cc: mpe, benh, anton, mikey, shuahkh

This test continuously updates the system wide DSCR default value
in the sysfs interface and makes sure that the same is reflected
across all the sysfs interfaces for each individual CPUs present
on the system.

Signed-off-by: Anshuman Khandual <khandual@linux.vnet.ibm.com>
---
 tools/testing/selftests/powerpc/dscr/Makefile      |  3 +-
 .../selftests/powerpc/dscr/dscr_sysfs_test.c       | 89 ++++++++++++++++++++++
 2 files changed, 91 insertions(+), 1 deletion(-)
 create mode 100644 tools/testing/selftests/powerpc/dscr/dscr_sysfs_test.c

diff --git a/tools/testing/selftests/powerpc/dscr/Makefile b/tools/testing/selftests/powerpc/dscr/Makefile
index 4e84309..fada526 100644
--- a/tools/testing/selftests/powerpc/dscr/Makefile
+++ b/tools/testing/selftests/powerpc/dscr/Makefile
@@ -1,5 +1,6 @@
 PROGS := dscr_default_test dscr_explicit_test dscr_user_test	\
-	 dscr_inherit_test dscr_inherit_exec_test
+	 dscr_inherit_test dscr_inherit_exec_test		\
+	 dscr_sysfs_test
 
 CFLAGS := $(CFLAGS) -lpthread
 
diff --git a/tools/testing/selftests/powerpc/dscr/dscr_sysfs_test.c b/tools/testing/selftests/powerpc/dscr/dscr_sysfs_test.c
new file mode 100644
index 0000000..3d11439
--- /dev/null
+++ b/tools/testing/selftests/powerpc/dscr/dscr_sysfs_test.c
@@ -0,0 +1,89 @@
+/*
+ * POWER Data Stream Control Register (DSCR) sysfs interface test
+ *
+ * This test updates to system wide DSCR default through the sysfs interface
+ * and then verifies that all the CPU specific DSCR defaults are updated as
+ * well verified from their sysfs interfaces.
+ *
+ * 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.
+ */
+#include "dscr.h"
+
+static int check_cpu_dscr_default(char *file, unsigned long val)
+{
+	char buf[10];
+	int fd, rc;
+
+	fd = open(file, O_RDWR);
+	if (fd == -1) {
+		perror("open() failed\n");
+		return 1;
+	}
+
+	rc = read(fd, buf, sizeof(buf));
+	if (rc == -1) {
+		perror("read() failed\n");
+		return 1;
+	}
+	close(fd);
+
+	buf[rc] = '\0';
+	if (strtol(buf, NULL, 16) != val) {
+		printf("DSCR match failed: %ld (system) %ld (cpu)\n",
+					val, strtol(buf, NULL, 16));
+		return 1;
+	}
+	return 0;
+}
+
+static int check_all_cpu_dscr_defaults(unsigned long val)
+{
+	DIR *sysfs;
+	struct dirent *dp;
+	char file[LEN_MAX];
+
+	sysfs = opendir(CPU_PATH);
+	if (!sysfs) {
+		perror("opendir() failed\n");
+		return 1;
+	}
+
+	while ((dp = readdir(sysfs))) {
+		if (!(dp->d_type & DT_DIR))
+			continue;
+		if (!strcmp(dp->d_name, "cpuidle"))
+			continue;
+		if (!strstr(dp->d_name, "cpu"))
+			continue;
+
+		sprintf(file, "%s%s/dscr", CPU_PATH, dp->d_name);
+		if (check_cpu_dscr_default(file, val))
+			return 1;
+	}
+	closedir(sysfs);
+	return 0;
+}
+
+int test_body(void)
+{
+	int i, j;
+
+	for (i = 0; i < COUNT; i++) {
+		for (j = 0; j < DSCR_MAX; j++) {
+			set_default_dscr(j);
+			if (check_all_cpu_dscr_defaults(j))
+				return 1;
+		}
+	}
+	return 0;
+}
+
+int main(int argc, char *argv[])
+{
+	return test_harness(test_body, "dscr_sysfs_test");
+}
-- 
1.9.3


^ permalink raw reply	[flat|nested] 28+ messages in thread

* [PATCH V2 12/12] selftests, powerpc: Add thread based stress test for DSCR sysfs interfaces
  2015-01-13 10:22 [PATCH V2 00/12] POWER DSCR fixes, improvements, docs and tests Anshuman Khandual
                   ` (10 preceding siblings ...)
  2015-01-13 10:22 ` [PATCH V2 11/12] selftests, powerpc: Add test for all DSCR sysfs interfaces Anshuman Khandual
@ 2015-01-13 10:22 ` Anshuman Khandual
  2015-01-13 15:24   ` Shuah Khan
  2015-02-04  8:21 ` [PATCH V2 00/12] POWER DSCR fixes, improvements, docs and tests Anshuman Khandual
  12 siblings, 1 reply; 28+ messages in thread
From: Anshuman Khandual @ 2015-01-13 10:22 UTC (permalink / raw)
  To: linuxppc-dev, linux-kernel; +Cc: mpe, benh, anton, mikey, shuahkh

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.

Signed-off-by: Anshuman Khandual <khandual@linux.vnet.ibm.com>
---
 tools/testing/selftests/powerpc/dscr/Makefile      |   2 +-
 .../powerpc/dscr/dscr_sysfs_thread_test.c          | 114 +++++++++++++++++++++
 2 files changed, 115 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..95a4304
--- /dev/null
+++ b/tools/testing/selftests/powerpc/dscr/dscr_sysfs_thread_test.c
@@ -0,0 +1,114 @@
+/*
+ * 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 */
+
+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 == sysconf(_SC_NPROCESSORS_ONLN))
+		target =  0;
+	CPU_ZERO(&cpuset);
+	CPU_SET(target, &cpuset);
+
+	if (sched_setaffinity(0, sizeof(cpuset), &cpuset)) {
+		perror("sched_settarget_cpu() failed\n");
+		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[sysconf(_SC_NPROCESSORS_ONLN)];
+	unsigned long *status[sysconf(_SC_NPROCESSORS_ONLN)];
+	unsigned long i;
+
+	for (i = 0; i < sysconf(_SC_NPROCESSORS_ONLN); i++) {
+		if (pthread_create(&threads[i], NULL,
+				test_thread_dscr, (void *)val)) {
+			perror("pthread_create() failed\n");
+			return 1;
+		}
+	}
+
+	for (i = 0; i < sysconf(_SC_NPROCESSORS_ONLN); i++) {
+		if (pthread_join(threads[i], (void **)&(status[i]))) {
+			perror("pthread_join() failed\n");
+			return 1;
+		}
+
+		if (*status[i]) {
+			printf(" %ldth thread join failed with %ld\n",
+							i, *status[i]);
+			return 1;
+		}
+	}
+	return 0;
+}
+
+int test_body(void)
+{
+	int i, j;
+
+	result = malloc(sizeof(unsigned long) * sysconf(_SC_NPROCESSORS_ONLN));
+	pthread_mutex_init(&lock, NULL);
+	target = 0;
+	for (i = 0; i < COUNT; i++) {
+		for (j = 0; j < DSCR_MAX; j++) {
+			set_default_dscr(j);
+			if (check_cpu_dscr_thread(j))
+				return 1;
+		}
+	}
+	free(result);
+	return 0;
+}
+
+int main(int argc, char *argv[])
+{
+	return test_harness(test_body, "dscr_sysfs_thread_test");
+}
-- 
1.9.3


^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [PATCH V2 06/12] selftests, powerpc: Add test for system wide DSCR default
  2015-01-13 10:22 ` [PATCH V2 06/12] selftests, powerpc: Add test for system wide DSCR default Anshuman Khandual
@ 2015-01-13 15:22   ` Shuah Khan
  2015-01-13 23:44     ` Michael Ellerman
  2015-03-27 12:01   ` [V2,06/12] " Michael Ellerman
  1 sibling, 1 reply; 28+ messages in thread
From: Shuah Khan @ 2015-01-13 15:22 UTC (permalink / raw)
  To: Anshuman Khandual, linuxppc-dev, linux-kernel; +Cc: mpe, benh, anton, mikey

On 01/13/2015 03:22 AM, Anshuman Khandual wrote:
> This patch adds a test case for the system wide DSCR default
> value, which when changed through it's sysfs interface must
> be visible to all threads reading DSCR either through the
> privilege state SPR or the problem state SPR. The DSCR value
> change should be immediate as well.
> 
> Signed-off-by: Anshuman Khandual <khandual@linux.vnet.ibm.com>
> ---
>  tools/testing/selftests/powerpc/Makefile           |   2 +-
>  tools/testing/selftests/powerpc/dscr/Makefile      |  17 +++
>  tools/testing/selftests/powerpc/dscr/dscr.h        | 120 ++++++++++++++++++++
>  .../selftests/powerpc/dscr/dscr_default_test.c     | 121 +++++++++++++++++++++
>  4 files changed, 259 insertions(+), 1 deletion(-)
>  create mode 100644 tools/testing/selftests/powerpc/dscr/Makefile
>  create mode 100644 tools/testing/selftests/powerpc/dscr/dscr.h
>  create mode 100644 tools/testing/selftests/powerpc/dscr/dscr_default_test.c
> 
> diff --git a/tools/testing/selftests/powerpc/Makefile b/tools/testing/selftests/powerpc/Makefile
> index f6ff90a..1318883 100644
> --- a/tools/testing/selftests/powerpc/Makefile
> +++ b/tools/testing/selftests/powerpc/Makefile
> @@ -13,7 +13,7 @@ CFLAGS := -Wall -O2 -flto -Wall -Werror -DGIT_VERSION='"$(GIT_VERSION)"' -I$(CUR
>  
>  export CC CFLAGS
>  
> -TARGETS = pmu copyloops mm tm primitives
> +TARGETS = pmu copyloops mm tm primitives dscr
>  
>  endif
>  
> diff --git a/tools/testing/selftests/powerpc/dscr/Makefile b/tools/testing/selftests/powerpc/dscr/Makefile
> new file mode 100644
> index 0000000..0aa90ab
> --- /dev/null
> +++ b/tools/testing/selftests/powerpc/dscr/Makefile
> @@ -0,0 +1,17 @@
> +PROGS := dscr_default_test
> +
> +CFLAGS := $(CFLAGS) -lpthread
> +
> +all: $(PROGS)
> +
> +$(PROGS): ../harness.c
> +
> +run_tests: all
> +	@-for PROG in $(PROGS); do \
> +		./$$PROG; \
> +	done;
> +
> +clean:
> +	rm -f $(PROGS) *.o
> +
> +.PHONY: all run_tests clean
> diff --git a/tools/testing/selftests/powerpc/dscr/dscr.h b/tools/testing/selftests/powerpc/dscr/dscr.h
> new file mode 100644
> index 0000000..2e6535b
> --- /dev/null
> +++ b/tools/testing/selftests/powerpc/dscr/dscr.h
> @@ -0,0 +1,120 @@
> +/*
> + * POWER Data Stream Control Register (DSCR)
> + *
> + * This header file contains helper functions and macros
> + * required for all the DSCR related test cases.
> + *
> + * Copyright (C) 2012 Anton Blanchard <anton@au.ibm.com>, IBM
> + * 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.
> + */
> +#ifndef _SELFTESTS_POWERPC_DSCR_DSCR_H
> +#define _SELFTESTS_POWERPC_DSCR_DSCR_H
> +
> +#include <unistd.h>
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <string.h>
> +#include <fcntl.h>
> +#include <dirent.h>
> +#include <pthread.h>
> +#include <sched.h>
> +#include <sys/types.h>
> +#include <sys/stat.h>
> +#include <sys/wait.h>
> +
> +#include "utils.h"
> +
> +#define SPRN_DSCR	0x11	/* Privilege state SPR */
> +#define SPRN_DSCR_USR	0x03	/* Problem state SPR */
> +#define THREADS		100	/* Max threads */
> +#define COUNT		100	/* Max iterations */
> +#define DSCR_MAX	16	/* Max DSCR value */
> +#define LEN_MAX		100	/* Max name length */
> +
> +#define DSCR_DEFAULT	"/sys/devices/system/cpu/dscr_default"
> +#define CPU_PATH	"/sys/devices/system/cpu/"
> +
> +#define rmb()  asm volatile("lwsync":::"memory")
> +#define wmb()  asm volatile("lwsync":::"memory")
> +
> +#define ACCESS_ONCE(x) (*(volatile typeof(x) *)&(x))
> +
> +/* Prilvilege state DSCR access */
> +inline unsigned long get_dscr(void)
> +{
> +	unsigned long ret;
> +
> +	asm volatile("mfspr %0,%1" : "=r" (ret): "i" (SPRN_DSCR));
> +
> +	return ret;
> +}
> +
> +inline void set_dscr(unsigned long val)
> +{
> +	asm volatile("mtspr %1,%0" : : "r" (val), "i" (SPRN_DSCR));
> +}
> +
> +/* Problem state DSCR access */
> +inline unsigned long get_dscr_usr(void)
> +{
> +	unsigned long ret;
> +
> +	asm volatile("mfspr %0,%1" : "=r" (ret): "i" (SPRN_DSCR_USR));
> +
> +	return ret;
> +}
> +
> +inline void set_dscr_usr(unsigned long val)
> +{
> +	asm volatile("mtspr %1,%0" : : "r" (val), "i" (SPRN_DSCR_USR));
> +}
> +
> +/* Default DSCR access */
> +unsigned long get_default_dscr(void)
> +{
> +	int fd = -1;
> +	char buf[16];
> +	unsigned long val;
> +
> +	if (fd == -1) {
> +		fd = open(DSCR_DEFAULT, O_RDONLY);
> +		if (fd == -1) {
> +			perror("open() failed\n");
> +			exit(1);
> +		}
> +	}
> +	memset(buf, 0, sizeof(buf));
> +	lseek(fd, 0, SEEK_SET);
> +	read(fd, buf, sizeof(buf));
> +	sscanf(buf, "%lx", &val);
> +	close(fd);
> +	return val;
> +}
> +
> +void set_default_dscr(unsigned long val)
> +{
> +	int fd = -1;
> +	char buf[16];
> +
> +	if (fd == -1) {
> +		fd = open(DSCR_DEFAULT, O_RDWR);
> +		if (fd == -1) {
> +			perror("open() failed\n");
> +			exit(1);
> +		}
> +	}
> +	sprintf(buf, "%lx\n", val);
> +	write(fd, buf, strlen(buf));
> +	close(fd);
> +}
> +
> +double uniform_deviate(int seed)
> +{
> +	return seed * (1.0 / (RAND_MAX + 1.0));
> +}
> +#endif	/* _SELFTESTS_POWERPC_DSCR_DSCR_H */
> diff --git a/tools/testing/selftests/powerpc/dscr/dscr_default_test.c b/tools/testing/selftests/powerpc/dscr/dscr_default_test.c
> new file mode 100644
> index 0000000..fd8b7b9
> --- /dev/null
> +++ b/tools/testing/selftests/powerpc/dscr/dscr_default_test.c
> @@ -0,0 +1,121 @@
> +/*
> + * POWER Data Stream Control Register (DSCR) default test
> + *
> + * This test modifies the system wide default DSCR through
> + * it's sysfs interface and then verifies that all threads
> + * see the correct changed DSCR value immediately.
> + *
> + * Copyright (C) 2012 Anton Blanchard <anton@au.ibm.com>, IBM
> + * 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.
> + */
> +#include "dscr.h"
> +
> +static unsigned long dscr;		/* System DSCR default */
> +static unsigned long sequence;
> +static unsigned long result[THREADS];
> +
> +static void *do_test(void *in)
> +{
> +	unsigned long thread = (unsigned long)in;
> +	unsigned long i;
> +
> +	for (i = 0; i < COUNT; i++) {
> +		unsigned long d, cur_dscr, cur_dscr_usr;
> +		unsigned long s1, s2;
> +
> +		s1 = ACCESS_ONCE(sequence);
> +		if (s1 & 1)
> +			continue;
> +		rmb();
> +
> +		d = dscr;
> +		cur_dscr = get_dscr();
> +		cur_dscr_usr = get_dscr_usr();
> +
> +		rmb();
> +		s2 = sequence;
> +
> +		if (s1 != s2)
> +			continue;
> +
> +		if (cur_dscr != d) {
> +			fprintf(stderr, "thread %ld kernel DSCR should be %ld "
> +				"but is %ld\n", thread, d, cur_dscr);
> +			result[thread] = 1;
> +			pthread_exit(&result[thread]);
> +		}
> +
> +		if (cur_dscr_usr != d) {
> +			fprintf(stderr, "thread %ld user DSCR should be %ld "
> +				"but is %ld\n", thread, d, cur_dscr_usr);
> +			result[thread] = 1;
> +			pthread_exit(&result[thread]);
> +		}
> +	}
> +	result[thread] = 0;
> +	pthread_exit(&result[thread]);
> +}
> +
> +int test_body(void)
> +{
> +	pthread_t threads[THREADS];
> +	unsigned long i, *status[THREADS];
> +
> +	/* Initial DSCR default */
> +	dscr = 1;
> +	set_default_dscr(dscr);
> +
> +	/* Spawn all testing threads */
> +	for (i = 0; i < THREADS; i++) {
> +		if (pthread_create(&threads[i], NULL, do_test, (void *)i)) {
> +			perror("pthread_create() failed\n");
> +			exit(1);
> +		}
> +	}
> +
> +	srand(getpid());
> +
> +	/* Keep changing the DSCR default */
> +	for (i = 0; i < COUNT; i++) {
> +		double ret = uniform_deviate(rand());
> +
> +		if (ret < 0.0001) {
> +			sequence++;
> +			wmb();
> +
> +			dscr++;
> +			if (dscr > DSCR_MAX)
> +				dscr = 0;
> +
> +			set_default_dscr(dscr);
> +
> +			wmb();
> +			sequence++;
> +		}
> +	}
> +
> +	/* Individual testing thread exit status */
> +	for (i = 0; i < THREADS; i++) {
> +		if (pthread_join(threads[i], (void **)&(status[i]))) {
> +			perror("pthread_join() failed\n");
> +			exit(1);
> +		}
> +
> +		if (*status[i]) {
> +			printf("%ldth thread failed to join with %ld status\n",
> +								i, *status[i]);
> +			return 1;
> +		}
> +	}
> +	return 0;
> +}
> +
> +int main(int argc, char *argv[])
> +{
> +	return test_harness(test_body, "dscr_default_test");
> +}
> 

Could you please add a .gitignore for powerpc targets as we
discussed earlier. It can be separate patch.

Also, I would like to see the test results reports using
kselftest.h - it can be separate patch in the interest of
getting tests in.

Acked-by: Shuah Khan <shuahkh@osg.samsung.com>

Please take this through powerpc maintainer git.

thanks,
-- Shuah

-- 
Shuah Khan
Sr. Linux Kernel Developer
Open Source Innovation Group
Samsung Research America (Silicon Valley)
shuahkh@osg.samsung.com | (970) 217-8978

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [PATCH V2 07/12] selftests, powerpc: Add test for explicitly changing DSCR value
  2015-01-13 10:22 ` [PATCH V2 07/12] selftests, powerpc: Add test for explicitly changing DSCR value Anshuman Khandual
@ 2015-01-13 15:23   ` Shuah Khan
  0 siblings, 0 replies; 28+ messages in thread
From: Shuah Khan @ 2015-01-13 15:23 UTC (permalink / raw)
  To: Anshuman Khandual, linuxppc-dev, linux-kernel; +Cc: mpe, benh, anton, mikey

On 01/13/2015 03:22 AM, Anshuman Khandual wrote:
> This patch adds a test which modifies the DSCR using mtspr instruction
> and verifies the change using mfspr instruction. It uses both the
> privilege state SPR as well as the problem state SPR for the purpose.
> 
> Signed-off-by: Anshuman Khandual <khandual@linux.vnet.ibm.com>
> ---
>  tools/testing/selftests/powerpc/dscr/Makefile      |  2 +-
>  .../selftests/powerpc/dscr/dscr_explicit_test.c    | 72 ++++++++++++++++++++++
>  2 files changed, 73 insertions(+), 1 deletion(-)
>  create mode 100644 tools/testing/selftests/powerpc/dscr/dscr_explicit_test.c
> 
> diff --git a/tools/testing/selftests/powerpc/dscr/Makefile b/tools/testing/selftests/powerpc/dscr/Makefile
> index 0aa90ab..aede453 100644
> --- a/tools/testing/selftests/powerpc/dscr/Makefile
> +++ b/tools/testing/selftests/powerpc/dscr/Makefile
> @@ -1,4 +1,4 @@
> -PROGS := dscr_default_test
> +PROGS := dscr_default_test dscr_explicit_test
>  
>  CFLAGS := $(CFLAGS) -lpthread
>  
> diff --git a/tools/testing/selftests/powerpc/dscr/dscr_explicit_test.c b/tools/testing/selftests/powerpc/dscr/dscr_explicit_test.c
> new file mode 100644
> index 0000000..5c0b7c1
> --- /dev/null
> +++ b/tools/testing/selftests/powerpc/dscr/dscr_explicit_test.c
> @@ -0,0 +1,72 @@
> +/*
> + * POWER Data Stream Control Register (DSCR) explicit test
> + *
> + * This test modifies the DSCR value using mtspr instruction and
> + * verifies the change with mfspr instruction. It uses both the
> + * privilege state SPR and the problem state SPR for this purpose.
> + *
> + * When using the privilege state SPR, the instructions such as
> + * mfspr or mtspr are priviledged and the kernel emulates them
> + * for us. Instructions using problem state SPR can be exuecuted
> + * directly without any emulation if the HW supports them. Else
> + * they also get emulated by the kernel.
> + *
> + * Copyright (C) 2012 Anton Blanchard <anton@au.ibm.com>, IBM
> + * 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.
> + */
> +#include "dscr.h"
> +
> +int test_body(void)
> +{
> +	unsigned long i, dscr = 0;
> +
> +	srand(getpid());
> +	set_dscr(dscr);
> +
> +	for (i = 0; i < COUNT; i++) {
> +		unsigned long cur_dscr, cur_dscr_usr;
> +		double ret = uniform_deviate(rand());
> +
> +		if (ret < 0.001) {
> +			dscr++;
> +			if (dscr > DSCR_MAX)
> +				dscr = 0;
> +
> +			set_dscr(dscr);
> +		}
> +
> +		cur_dscr = get_dscr();
> +		if (cur_dscr != dscr) {
> +			fprintf(stderr, "Kernel DSCR should be %ld but "
> +					"is %ld\n", dscr, cur_dscr);
> +			return 1;
> +		}
> +
> +		ret = uniform_deviate(rand());
> +		if (ret < 0.001) {
> +			dscr++;
> +			if (dscr > DSCR_MAX)
> +				dscr = 0;
> +
> +			set_dscr_usr(dscr);
> +		}
> +
> +		cur_dscr_usr = get_dscr_usr();
> +		if (cur_dscr_usr != dscr) {
> +			fprintf(stderr, "User DSCR should be %ld but "
> +					"is %ld\n", dscr, cur_dscr_usr);
> +			return 1;
> +		}
> +	}
> +	return 0;
> +}
> +
> +int main(int argc, char *argv[])
> +{
> +	return test_harness(test_body, "dscr_explicit_test");
> +}
> 

Could you please add a .gitignore for powerpc targets as we
discussed earlier. It can be separate patch.

Also, I would like to see the test results reports using
kselftest.h - it can be separate patch in the interest of
getting tests in.

Acked-by: Shuah Khan <shuahkh@osg.samsung.com>

Please take this through powerpc maintainer git.

thanks,
-- Shuah


-- 
Shuah Khan
Sr. Linux Kernel Developer
Open Source Innovation Group
Samsung Research America (Silicon Valley)
shuahkh@osg.samsung.com | (970) 217-8978

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [PATCH V2 08/12] selftests, powerpc: Add test for DSCR SPR numbers
  2015-01-13 10:22 ` [PATCH V2 08/12] selftests, powerpc: Add test for DSCR SPR numbers Anshuman Khandual
@ 2015-01-13 15:23   ` Shuah Khan
  0 siblings, 0 replies; 28+ messages in thread
From: Shuah Khan @ 2015-01-13 15:23 UTC (permalink / raw)
  To: Anshuman Khandual, linuxppc-dev, linux-kernel; +Cc: mpe, benh, anton, mikey

On 01/13/2015 03:22 AM, Anshuman Khandual wrote:
> This patch adds a test which verifies that the DSCR privilege and
> problem state SPR read & write accesses while making sure that the
> results are always the same irrespective of which SPR number is
> being used.
> 
> Signed-off-by: Anshuman Khandual <khandual@linux.vnet.ibm.com>
> ---
>  tools/testing/selftests/powerpc/dscr/Makefile      |  2 +-
>  .../selftests/powerpc/dscr/dscr_user_test.c        | 62 ++++++++++++++++++++++
>  2 files changed, 63 insertions(+), 1 deletion(-)
>  create mode 100644 tools/testing/selftests/powerpc/dscr/dscr_user_test.c
> 
> diff --git a/tools/testing/selftests/powerpc/dscr/Makefile b/tools/testing/selftests/powerpc/dscr/Makefile
> index aede453..ae865d8 100644
> --- a/tools/testing/selftests/powerpc/dscr/Makefile
> +++ b/tools/testing/selftests/powerpc/dscr/Makefile
> @@ -1,4 +1,4 @@
> -PROGS := dscr_default_test dscr_explicit_test
> +PROGS := dscr_default_test dscr_explicit_test dscr_user_test
>  
>  CFLAGS := $(CFLAGS) -lpthread
>  
> diff --git a/tools/testing/selftests/powerpc/dscr/dscr_user_test.c b/tools/testing/selftests/powerpc/dscr/dscr_user_test.c
> new file mode 100644
> index 0000000..f25d68e
> --- /dev/null
> +++ b/tools/testing/selftests/powerpc/dscr/dscr_user_test.c
> @@ -0,0 +1,62 @@
> +/*
> + * POWER Data Stream Control Register (DSCR) SPR test
> + *
> + * This test modifies the DSCR value through both the SPR number
> + * based mtspr instruction and then makes sure that the same is
> + * reflected through mfspr instruction using either of the SPR
> + * numbers.
> + *
> + * When using the privilege state SPR, the instructions such as
> + * mfspr or mtspr are priviledged and the kernel emulates them
> + * for us. Instructions using problem state SPR can be exuecuted
> + * directly without any emulation if the HW supports them. Else
> + * they also get emulated by the kernel.
> + *
> + * Copyright (C) 2013 Anton Blanchard <anton@au.ibm.com>, IBM
> + * 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.
> + */
> +#include "dscr.h"
> +
> +static int check_dscr(char *str)
> +{
> +	unsigned long cur_dscr, cur_dscr_usr;
> +
> +	cur_dscr = get_dscr();
> +	cur_dscr_usr = get_dscr_usr();
> +	if (cur_dscr != cur_dscr_usr) {
> +		printf("%s set, kernel get %lx != user get %lx\n",
> +					str, cur_dscr, cur_dscr_usr);
> +		return 1;
> +	}
> +	return 0;
> +}
> +
> +int test_body(void)
> +{
> +	int i;
> +
> +	check_dscr("");
> +
> +	for (i = 0; i < COUNT; i++) {
> +		set_dscr(i);
> +		if (check_dscr("kernel"))
> +			return 1;
> +	}
> +
> +	for (i = 0; i < COUNT; i++) {
> +		set_dscr_usr(i);
> +		if (check_dscr("user"))
> +			return 1;
> +	}
> +	return 0;
> +}
> +
> +int main(int argc, char *argv[])
> +{
> +	return test_harness(test_body, "dscr_user_test");
> +}
> 

Could you please add a .gitignore for powerpc targets as we
discussed earlier. It can be separate patch.

Also, I would like to see the test results reports using
kselftest.h - it can be separate patch in the interest of
getting tests in.

Acked-by: Shuah Khan <shuahkh@osg.samsung.com>

Please take this through powerpc maintainer git.

thanks,
-- Shuah

-- 
Shuah Khan
Sr. Linux Kernel Developer
Open Source Innovation Group
Samsung Research America (Silicon Valley)
shuahkh@osg.samsung.com | (970) 217-8978

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [PATCH V2 09/12] selftests, powerpc: Add test for DSCR value inheritence across fork
  2015-01-13 10:22 ` [PATCH V2 09/12] selftests, powerpc: Add test for DSCR value inheritence across fork Anshuman Khandual
@ 2015-01-13 15:24   ` Shuah Khan
  0 siblings, 0 replies; 28+ messages in thread
From: Shuah Khan @ 2015-01-13 15:24 UTC (permalink / raw)
  To: Anshuman Khandual, linuxppc-dev, linux-kernel; +Cc: mpe, benh, anton, mikey

On 01/13/2015 03:22 AM, Anshuman Khandual wrote:
> This patch adds a test to verify that the changed DSCR value inside
> any process would be inherited to it's child process across the fork
> system call.
> 
> Signed-off-by: Anshuman Khandual <khandual@linux.vnet.ibm.com>
> ---
>  tools/testing/selftests/powerpc/dscr/Makefile      |  3 +-
>  .../selftests/powerpc/dscr/dscr_inherit_test.c     | 96 ++++++++++++++++++++++
>  2 files changed, 98 insertions(+), 1 deletion(-)
>  create mode 100644 tools/testing/selftests/powerpc/dscr/dscr_inherit_test.c
> 
> diff --git a/tools/testing/selftests/powerpc/dscr/Makefile b/tools/testing/selftests/powerpc/dscr/Makefile
> index ae865d8..81239e2 100644
> --- a/tools/testing/selftests/powerpc/dscr/Makefile
> +++ b/tools/testing/selftests/powerpc/dscr/Makefile
> @@ -1,4 +1,5 @@
> -PROGS := dscr_default_test dscr_explicit_test dscr_user_test
> +PROGS := dscr_default_test dscr_explicit_test dscr_user_test	\
> +	 dscr_inherit_test
>  
>  CFLAGS := $(CFLAGS) -lpthread
>  
> diff --git a/tools/testing/selftests/powerpc/dscr/dscr_inherit_test.c b/tools/testing/selftests/powerpc/dscr/dscr_inherit_test.c
> new file mode 100644
> index 0000000..f1add77
> --- /dev/null
> +++ b/tools/testing/selftests/powerpc/dscr/dscr_inherit_test.c
> @@ -0,0 +1,96 @@
> +/*
> + * POWER Data Stream Control Register (DSCR) fork test
> + *
> + * This testcase modifies the DSCR using mtspr, forks and then
> + * verifies that the child process has the correct changed DSCR
> + * value using mfspr.
> + *
> + * When using the privilege state SPR, the instructions such as
> + * mfspr or mtspr are priviledged and the kernel emulates them
> + * for us. Instructions using problem state SPR can be exuecuted
> + * directly without any emulation if the HW supports them. Else
> + * they also get emulated by the kernel.
> + *
> + * Copyright (C) 2012 Anton Blanchard <anton@au.ibm.com>, IBM
> + * 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.
> + */
> +#include "dscr.h"
> +
> +int test_body(void)
> +{
> +	unsigned long i, dscr = 0;
> +	pid_t pid;
> +
> +	srand(getpid());
> +	set_dscr(dscr);
> +
> +	for (i = 0; i < COUNT; i++) {
> +		unsigned long cur_dscr, cur_dscr_usr;
> +
> +		dscr++;
> +		if (dscr > DSCR_MAX)
> +			dscr = 0;
> +
> +		if (i % 2 == 0)
> +			set_dscr_usr(dscr);
> +		else
> +			set_dscr(dscr);
> +
> +		/*
> +		 * XXX: Force a context switch out so that DSCR
> +		 * current value is copied into the thread struct
> +		 * which is required for the child to inherit the
> +		 * changed value.
> +		 */
> +		sleep(1);
> +
> +		pid = fork();
> +		if (pid == -1) {
> +			perror("fork() failed\n");
> +			exit(1);
> +		} else if (pid) {
> +			int status;
> +
> +			if (waitpid(pid, &status, 0) == -1) {
> +				perror("waitpid() failed\n");
> +				exit(1);
> +			}
> +
> +			if (!WIFEXITED(status)) {
> +				fprintf(stderr, "Child didn't exit cleanly\n");
> +				exit(1);
> +			}
> +
> +			if (WEXITSTATUS(status) != 0) {
> +				fprintf(stderr, "Child didn't exit cleanly\n");
> +				return 1;
> +			}
> +		} else {
> +			cur_dscr = get_dscr();
> +			if (cur_dscr != dscr) {
> +				fprintf(stderr, "Kernel DSCR should be %ld "
> +					"but is %ld\n", dscr, cur_dscr);
> +				exit(1);
> +			}
> +
> +			cur_dscr_usr = get_dscr_usr();
> +			if (cur_dscr_usr != dscr) {
> +				fprintf(stderr, "User DSCR should be %ld "
> +					"but is %ld\n", dscr, cur_dscr_usr);
> +				exit(1);
> +			}
> +			exit(0);
> +		}
> +	}
> +	return 0;
> +}
> +
> +int main(int argc, char *argv[])
> +{
> +	return test_harness(test_body, "dscr_inherit_test");
> +}
> 

Could you please add a .gitignore for powerpc targets as we
discussed earlier. It can be separate patch.

Also, I would like to see the test results reports using
kselftest.h - it can be separate patch in the interest of
getting tests in.

Acked-by: Shuah Khan <shuahkh@osg.samsung.com>

Please take this through powerpc maintainer git.

thanks,
-- Shuah

-- 
Shuah Khan
Sr. Linux Kernel Developer
Open Source Innovation Group
Samsung Research America (Silicon Valley)
shuahkh@osg.samsung.com | (970) 217-8978

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [PATCH V2 10/12] selftests, powerpc: Add test for DSCR inheritence across fork & exec
  2015-01-13 10:22 ` [PATCH V2 10/12] selftests, powerpc: Add test for DSCR inheritence across fork & exec Anshuman Khandual
@ 2015-01-13 15:24   ` Shuah Khan
  0 siblings, 0 replies; 28+ messages in thread
From: Shuah Khan @ 2015-01-13 15:24 UTC (permalink / raw)
  To: Anshuman Khandual, linuxppc-dev, linux-kernel; +Cc: mpe, benh, anton, mikey

On 01/13/2015 03:22 AM, Anshuman Khandual wrote:
> This patch adds a test case to verify that the changed DSCR value
> inside any process would be inherited to it's child across the fork
> and exec system call.
> 
> Signed-off-by: Anshuman Khandual <khandual@linux.vnet.ibm.com>
> ---
>  tools/testing/selftests/powerpc/dscr/Makefile      |   2 +-
>  .../powerpc/dscr/dscr_inherit_exec_test.c          | 118 +++++++++++++++++++++
>  2 files changed, 119 insertions(+), 1 deletion(-)
>  create mode 100644 tools/testing/selftests/powerpc/dscr/dscr_inherit_exec_test.c
> 
> diff --git a/tools/testing/selftests/powerpc/dscr/Makefile b/tools/testing/selftests/powerpc/dscr/Makefile
> index 81239e2..4e84309 100644
> --- a/tools/testing/selftests/powerpc/dscr/Makefile
> +++ b/tools/testing/selftests/powerpc/dscr/Makefile
> @@ -1,5 +1,5 @@
>  PROGS := dscr_default_test dscr_explicit_test dscr_user_test	\
> -	 dscr_inherit_test
> +	 dscr_inherit_test dscr_inherit_exec_test
>  
>  CFLAGS := $(CFLAGS) -lpthread
>  
> diff --git a/tools/testing/selftests/powerpc/dscr/dscr_inherit_exec_test.c b/tools/testing/selftests/powerpc/dscr/dscr_inherit_exec_test.c
> new file mode 100644
> index 0000000..5ff3849
> --- /dev/null
> +++ b/tools/testing/selftests/powerpc/dscr/dscr_inherit_exec_test.c
> @@ -0,0 +1,118 @@
> +/*
> + * POWER Data Stream Control Register (DSCR) fork exec test
> + *
> + * This testcase modifies the DSCR using mtspr, forks & execs and
> + * verifies that the child is using the changed DSCR using mfspr.
> + *
> + * When using the privilege state SPR, the instructions such as
> + * mfspr or mtspr are priviledged and the kernel emulates them
> + * for us. Instructions using problem state SPR can be exuecuted
> + * directly without any emulation if the HW supports them. Else
> + * they also get emulated by the kernel.
> + *
> + * Copyright (C) 2012 Anton Blanchard <anton@au.ibm.com>, IBM
> + * 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.
> + */
> +#include "dscr.h"
> +
> +static char prog[LEN_MAX];
> +
> +static void do_exec(unsigned long parent_dscr)
> +{
> +	unsigned long cur_dscr, cur_dscr_usr;
> +
> +	cur_dscr = get_dscr();
> +	cur_dscr_usr = get_dscr_usr();
> +
> +	if (cur_dscr != parent_dscr) {
> +		fprintf(stderr, "Parent DSCR %ld was not inherited "
> +				"over exec (kernel value)\n", parent_dscr);
> +		exit(1);
> +	}
> +
> +	if (cur_dscr_usr != parent_dscr) {
> +		fprintf(stderr, "Parent DSCR %ld was not inherited "
> +				"over exec (user value)\n", parent_dscr);
> +		exit(1);
> +	}
> +	exit(0);
> +}
> +
> +int test_body(void)
> +{
> +	unsigned long i, dscr = 0;
> +	pid_t pid;
> +
> +	for (i = 0; i < COUNT; i++) {
> +		dscr++;
> +		if (dscr > DSCR_MAX)
> +			dscr = 0;
> +
> +		if (dscr == get_default_dscr())
> +			continue;
> +
> +		if (i % 2 == 0)
> +			set_dscr_usr(dscr);
> +		else
> +			set_dscr(dscr);
> +
> +		/*
> +		 * XXX: Force a context switch out so that DSCR
> +		 * current value is copied into the thread struct
> +		 * which is required for the child to inherit the
> +		 * changed value.
> +		 */
> +		sleep(1);
> +
> +		pid = fork();
> +		if (pid == -1) {
> +			perror("fork() failed\n");
> +			exit(1);
> +		} else if (pid) {
> +			int status;
> +
> +			if (waitpid(pid, &status, 0) == -1) {
> +				perror("waitpid() failed\n");
> +				exit(1);
> +			}
> +
> +			if (!WIFEXITED(status)) {
> +				fprintf(stderr, "Child didn't exit cleanly\n");
> +				exit(1);
> +			}
> +
> +			if (WEXITSTATUS(status) != 0) {
> +				fprintf(stderr, "Child didn't exit cleanly\n");
> +				return 1;
> +			}
> +		} else {
> +			char dscr_str[16];
> +
> +			sprintf(dscr_str, "%ld", dscr);
> +			execlp(prog, prog, "exec", dscr_str, NULL);
> +			exit(1);
> +		}
> +	}
> +	return 0;
> +}
> +
> +int main(int argc, char *argv[])
> +{
> +	if (argc == 3 && !strcmp(argv[1], "exec")) {
> +		unsigned long parent_dscr;
> +
> +		parent_dscr = atoi(argv[2]);
> +		do_exec(parent_dscr);
> +	} else if (argc != 1) {
> +		fprintf(stderr, "Usage: %s\n", argv[0]);
> +		exit(1);
> +	}
> +
> +	strncpy(prog, argv[0], strlen(argv[0]));
> +	return test_harness(test_body, "dscr_inherit_exec_test");
> +}
> 

Could you please add a .gitignore for powerpc targets as we
discussed earlier. It can be separate patch.

Also, I would like to see the test results reports using
kselftest.h - it can be separate patch in the interest of
getting tests in.

Acked-by: Shuah Khan <shuahkh@osg.samsung.com>

Please take this through powerpc maintainer git.

thanks,
-- Shuah

-- 
Shuah Khan
Sr. Linux Kernel Developer
Open Source Innovation Group
Samsung Research America (Silicon Valley)
shuahkh@osg.samsung.com | (970) 217-8978

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [PATCH V2 11/12] selftests, powerpc: Add test for all DSCR sysfs interfaces
  2015-01-13 10:22 ` [PATCH V2 11/12] selftests, powerpc: Add test for all DSCR sysfs interfaces Anshuman Khandual
@ 2015-01-13 15:24   ` Shuah Khan
  0 siblings, 0 replies; 28+ messages in thread
From: Shuah Khan @ 2015-01-13 15:24 UTC (permalink / raw)
  To: Anshuman Khandual, linuxppc-dev, linux-kernel; +Cc: mpe, benh, anton, mikey

On 01/13/2015 03:22 AM, Anshuman Khandual wrote:
> This test continuously updates the system wide DSCR default value
> in the sysfs interface and makes sure that the same is reflected
> across all the sysfs interfaces for each individual CPUs present
> on the system.
> 
> Signed-off-by: Anshuman Khandual <khandual@linux.vnet.ibm.com>
> ---
>  tools/testing/selftests/powerpc/dscr/Makefile      |  3 +-
>  .../selftests/powerpc/dscr/dscr_sysfs_test.c       | 89 ++++++++++++++++++++++
>  2 files changed, 91 insertions(+), 1 deletion(-)
>  create mode 100644 tools/testing/selftests/powerpc/dscr/dscr_sysfs_test.c
> 
> diff --git a/tools/testing/selftests/powerpc/dscr/Makefile b/tools/testing/selftests/powerpc/dscr/Makefile
> index 4e84309..fada526 100644
> --- a/tools/testing/selftests/powerpc/dscr/Makefile
> +++ b/tools/testing/selftests/powerpc/dscr/Makefile
> @@ -1,5 +1,6 @@
>  PROGS := dscr_default_test dscr_explicit_test dscr_user_test	\
> -	 dscr_inherit_test dscr_inherit_exec_test
> +	 dscr_inherit_test dscr_inherit_exec_test		\
> +	 dscr_sysfs_test
>  
>  CFLAGS := $(CFLAGS) -lpthread
>  
> diff --git a/tools/testing/selftests/powerpc/dscr/dscr_sysfs_test.c b/tools/testing/selftests/powerpc/dscr/dscr_sysfs_test.c
> new file mode 100644
> index 0000000..3d11439
> --- /dev/null
> +++ b/tools/testing/selftests/powerpc/dscr/dscr_sysfs_test.c
> @@ -0,0 +1,89 @@
> +/*
> + * POWER Data Stream Control Register (DSCR) sysfs interface test
> + *
> + * This test updates to system wide DSCR default through the sysfs interface
> + * and then verifies that all the CPU specific DSCR defaults are updated as
> + * well verified from their sysfs interfaces.
> + *
> + * 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.
> + */
> +#include "dscr.h"
> +
> +static int check_cpu_dscr_default(char *file, unsigned long val)
> +{
> +	char buf[10];
> +	int fd, rc;
> +
> +	fd = open(file, O_RDWR);
> +	if (fd == -1) {
> +		perror("open() failed\n");
> +		return 1;
> +	}
> +
> +	rc = read(fd, buf, sizeof(buf));
> +	if (rc == -1) {
> +		perror("read() failed\n");
> +		return 1;
> +	}
> +	close(fd);
> +
> +	buf[rc] = '\0';
> +	if (strtol(buf, NULL, 16) != val) {
> +		printf("DSCR match failed: %ld (system) %ld (cpu)\n",
> +					val, strtol(buf, NULL, 16));
> +		return 1;
> +	}
> +	return 0;
> +}
> +
> +static int check_all_cpu_dscr_defaults(unsigned long val)
> +{
> +	DIR *sysfs;
> +	struct dirent *dp;
> +	char file[LEN_MAX];
> +
> +	sysfs = opendir(CPU_PATH);
> +	if (!sysfs) {
> +		perror("opendir() failed\n");
> +		return 1;
> +	}
> +
> +	while ((dp = readdir(sysfs))) {
> +		if (!(dp->d_type & DT_DIR))
> +			continue;
> +		if (!strcmp(dp->d_name, "cpuidle"))
> +			continue;
> +		if (!strstr(dp->d_name, "cpu"))
> +			continue;
> +
> +		sprintf(file, "%s%s/dscr", CPU_PATH, dp->d_name);
> +		if (check_cpu_dscr_default(file, val))
> +			return 1;
> +	}
> +	closedir(sysfs);
> +	return 0;
> +}
> +
> +int test_body(void)
> +{
> +	int i, j;
> +
> +	for (i = 0; i < COUNT; i++) {
> +		for (j = 0; j < DSCR_MAX; j++) {
> +			set_default_dscr(j);
> +			if (check_all_cpu_dscr_defaults(j))
> +				return 1;
> +		}
> +	}
> +	return 0;
> +}
> +
> +int main(int argc, char *argv[])
> +{
> +	return test_harness(test_body, "dscr_sysfs_test");
> +}
> 
Could you please add a .gitignore for powerpc targets as we
discussed earlier. It can be separate patch.

Also, I would like to see the test results reports using
kselftest.h - it can be separate patch in the interest of
getting tests in.

Acked-by: Shuah Khan <shuahkh@osg.samsung.com>

Please take this through powerpc maintainer git.

thanks,
-- Shuah


-- 
Shuah Khan
Sr. Linux Kernel Developer
Open Source Innovation Group
Samsung Research America (Silicon Valley)
shuahkh@osg.samsung.com | (970) 217-8978

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [PATCH V2 12/12] selftests, powerpc: Add thread based stress test for DSCR sysfs interfaces
  2015-01-13 10:22 ` [PATCH V2 12/12] selftests, powerpc: Add thread based stress test for " Anshuman Khandual
@ 2015-01-13 15:24   ` Shuah Khan
  0 siblings, 0 replies; 28+ messages in thread
From: Shuah Khan @ 2015-01-13 15:24 UTC (permalink / raw)
  To: Anshuman Khandual, linuxppc-dev, linux-kernel; +Cc: mpe, benh, anton, mikey

On 01/13/2015 03:22 AM, Anshuman Khandual wrote:
> 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.
> 
> Signed-off-by: Anshuman Khandual <khandual@linux.vnet.ibm.com>
> ---
>  tools/testing/selftests/powerpc/dscr/Makefile      |   2 +-
>  .../powerpc/dscr/dscr_sysfs_thread_test.c          | 114 +++++++++++++++++++++
>  2 files changed, 115 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..95a4304
> --- /dev/null
> +++ b/tools/testing/selftests/powerpc/dscr/dscr_sysfs_thread_test.c
> @@ -0,0 +1,114 @@
> +/*
> + * 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 */
> +
> +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 == sysconf(_SC_NPROCESSORS_ONLN))
> +		target =  0;
> +	CPU_ZERO(&cpuset);
> +	CPU_SET(target, &cpuset);
> +
> +	if (sched_setaffinity(0, sizeof(cpuset), &cpuset)) {
> +		perror("sched_settarget_cpu() failed\n");
> +		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[sysconf(_SC_NPROCESSORS_ONLN)];
> +	unsigned long *status[sysconf(_SC_NPROCESSORS_ONLN)];
> +	unsigned long i;
> +
> +	for (i = 0; i < sysconf(_SC_NPROCESSORS_ONLN); i++) {
> +		if (pthread_create(&threads[i], NULL,
> +				test_thread_dscr, (void *)val)) {
> +			perror("pthread_create() failed\n");
> +			return 1;
> +		}
> +	}
> +
> +	for (i = 0; i < sysconf(_SC_NPROCESSORS_ONLN); i++) {
> +		if (pthread_join(threads[i], (void **)&(status[i]))) {
> +			perror("pthread_join() failed\n");
> +			return 1;
> +		}
> +
> +		if (*status[i]) {
> +			printf(" %ldth thread join failed with %ld\n",
> +							i, *status[i]);
> +			return 1;
> +		}
> +	}
> +	return 0;
> +}
> +
> +int test_body(void)
> +{
> +	int i, j;
> +
> +	result = malloc(sizeof(unsigned long) * sysconf(_SC_NPROCESSORS_ONLN));
> +	pthread_mutex_init(&lock, NULL);
> +	target = 0;
> +	for (i = 0; i < COUNT; i++) {
> +		for (j = 0; j < DSCR_MAX; j++) {
> +			set_default_dscr(j);
> +			if (check_cpu_dscr_thread(j))
> +				return 1;
> +		}
> +	}
> +	free(result);
> +	return 0;
> +}
> +
> +int main(int argc, char *argv[])
> +{
> +	return test_harness(test_body, "dscr_sysfs_thread_test");
> +}
> 

Could you please add a .gitignore for powerpc targets as we
discussed earlier. It can be separate patch.

Also, I would like to see the test results reports using
kselftest.h - it can be separate patch in the interest of
getting tests in.

Acked-by: Shuah Khan <shuahkh@osg.samsung.com>

Please take this through powerpc maintainer git.

thanks,
-- Shuah

-- 
Shuah Khan
Sr. Linux Kernel Developer
Open Source Innovation Group
Samsung Research America (Silicon Valley)
shuahkh@osg.samsung.com | (970) 217-8978

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [PATCH V2 06/12] selftests, powerpc: Add test for system wide DSCR default
  2015-01-13 15:22   ` Shuah Khan
@ 2015-01-13 23:44     ` Michael Ellerman
  2015-01-20 21:40       ` Dave Jones
  0 siblings, 1 reply; 28+ messages in thread
From: Michael Ellerman @ 2015-01-13 23:44 UTC (permalink / raw)
  To: Shuah Khan
  Cc: Anshuman Khandual, linuxppc-dev, linux-kernel, benh, anton, mikey

On Tue, 2015-01-13 at 08:22 -0700, Shuah Khan wrote:
> On 01/13/2015 03:22 AM, Anshuman Khandual wrote:
> > This patch adds a test case for the system wide DSCR default
> > value, which when changed through it's sysfs interface must
> > be visible to all threads reading DSCR either through the
> > privilege state SPR or the problem state SPR. The DSCR value
> > change should be immediate as well.
> > 
> > Signed-off-by: Anshuman Khandual <khandual@linux.vnet.ibm.com>
> > ---
> >  tools/testing/selftests/powerpc/Makefile           |   2 +-
> >  tools/testing/selftests/powerpc/dscr/Makefile      |  17 +++
> >  tools/testing/selftests/powerpc/dscr/dscr.h        | 120 ++++++++++++++++++++
> >  .../selftests/powerpc/dscr/dscr_default_test.c     | 121 +++++++++++++++++++++
> >  4 files changed, 259 insertions(+), 1 deletion(-)
> >  create mode 100644 tools/testing/selftests/powerpc/dscr/Makefile
> >  create mode 100644 tools/testing/selftests/powerpc/dscr/dscr.h
> >  create mode 100644 tools/testing/selftests/powerpc/dscr/dscr_default_test.c
> 
> Could you please add a .gitignore for powerpc targets as we
> discussed earlier. It can be separate patch.

I can do that.
 
> Also, I would like to see the test results reports using
> kselftest.h - it can be separate patch in the interest of
> getting tests in.

Sorry but kselftest.h doesn't do anything useful for us.

We have existing test reporting that uses the subunit protocol.

I'm happy to convert that to TAP, or some other well defined output format, but
not to something ad-hoc like kselftest.h currently provides.

cheers



^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [PATCH V2 06/12] selftests, powerpc: Add test for system wide DSCR default
  2015-01-13 23:44     ` Michael Ellerman
@ 2015-01-20 21:40       ` Dave Jones
  2015-01-21  6:51         ` Michael Ellerman
  0 siblings, 1 reply; 28+ messages in thread
From: Dave Jones @ 2015-01-20 21:40 UTC (permalink / raw)
  To: Michael Ellerman
  Cc: Shuah Khan, Anshuman Khandual, linuxppc-dev, linux-kernel, benh,
	anton, mikey

On Wed, Jan 14, 2015 at 10:44:31AM +1100, Michael Ellerman wrote:

 > > Also, I would like to see the test results reports using
 > > kselftest.h - it can be separate patch in the interest of
 > > getting tests in.
 > 
 > Sorry but kselftest.h doesn't do anything useful for us.
 > 
 > We have existing test reporting that uses the subunit protocol.
 > 
 > I'm happy to convert that to TAP, or some other well defined output format, but
 > not to something ad-hoc like kselftest.h currently provides.

Something TAP-alike would also help reduce some of the spew from
tests that are going to fail.

eg, running execveat tests on a kernel that doesn't implement that
syscall currently spews around 20 lines of [FAIL].  Adding something
to the beginning of the test to set plan() accordingly if it detects
-ENOSYS could make that output a little cleaner.

That other projects (like jenkins, bug trackers etc) could consume
the output of the test runs would be a nice bonus.  I only recently
started looking at kselftests and was surprised at the amount
of variance we have in the way of printing 'Ok' '[OK]' 'ok...' etc.

	Dave


^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [PATCH V2 06/12] selftests, powerpc: Add test for system wide DSCR default
  2015-01-20 21:40       ` Dave Jones
@ 2015-01-21  6:51         ` Michael Ellerman
  0 siblings, 0 replies; 28+ messages in thread
From: Michael Ellerman @ 2015-01-21  6:51 UTC (permalink / raw)
  To: Dave Jones
  Cc: Shuah Khan, Anshuman Khandual, linuxppc-dev, linux-kernel, benh,
	anton, mikey

On Tue, 2015-01-20 at 16:40 -0500, Dave Jones wrote:
> On Wed, Jan 14, 2015 at 10:44:31AM +1100, Michael Ellerman wrote:
> 
>  > > Also, I would like to see the test results reports using
>  > > kselftest.h - it can be separate patch in the interest of
>  > > getting tests in.
>  > 
>  > Sorry but kselftest.h doesn't do anything useful for us.
>  > 
>  > We have existing test reporting that uses the subunit protocol.
>  > 
>  > I'm happy to convert that to TAP, or some other well defined output format, but
>  > not to something ad-hoc like kselftest.h currently provides.
> 
> Something TAP-alike would also help reduce some of the spew from
> tests that are going to fail.

Possibly :)
 
> eg, running execveat tests on a kernel that doesn't implement that
> syscall currently spews around 20 lines of [FAIL].  Adding something
> to the beginning of the test to set plan() accordingly if it detects
> -ENOSYS could make that output a little cleaner.

Yeah I'm a bit dubious about plan, it often ends up being a pain to calculate
correctly and so it's either missing or wrong.

The execveat test probably just needs an initial test that looks for ENOSYS and
bails entirely. I'll write a patch.

> That other projects (like jenkins, bug trackers etc) could consume
> the output of the test runs would be a nice bonus.  I only recently
> started looking at kselftests and was surprised at the amount
> of variance we have in the way of printing 'Ok' '[OK]' 'ok...' etc.

Variance in output is annoying, but putting up too many barriers to entry for
new tests is even less desirable IMHO. Our preference should always be for more
tests in the tree, and we can clean up the output/reporting later.

cheers



^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [PATCH V2 00/12] POWER DSCR fixes, improvements, docs and tests
  2015-01-13 10:22 [PATCH V2 00/12] POWER DSCR fixes, improvements, docs and tests Anshuman Khandual
                   ` (11 preceding siblings ...)
  2015-01-13 10:22 ` [PATCH V2 12/12] selftests, powerpc: Add thread based stress test for " Anshuman Khandual
@ 2015-02-04  8:21 ` Anshuman Khandual
  2015-02-04  8:36   ` Anshuman Khandual
  12 siblings, 1 reply; 28+ messages in thread
From: Anshuman Khandual @ 2015-02-04  8:21 UTC (permalink / raw)
  To: linuxppc-dev, linux-kernel; +Cc: mikey, shuahkh, anton

On 01/13/2015 03:52 PM, Anshuman Khandual wrote:
> 	This patch series has patches for POWER DSCR fixes, improvements,
> in code documentaion, kernel support user documentation and selftest based
> test cases. It has got five test cases which are derived from Anton's DSCR
> test bucket which can be listed as follows.
> 
> (1) http://ozlabs.org/~anton/junkcode/dscr_default_test.c
> (2) http://ozlabs.org/~anton/junkcode/dscr_explicit_test.c
> (3) http://ozlabs.org/~anton/junkcode/dscr_inherit_exec_test.c
> (4) http://ozlabs.org/~anton/junkcode/dscr_inherit_test.c
> (5) http://ozlabs.org/~anton/junkcode/user_dscr_test.c
> 
> So the derivied test cases have Anton's copyright along with mine but the
> commit message as of now has only my signed-off-by statement. As Anton
> mentioned before he would put his signed-off-by after reviewing these
> modified test cases.
> 
> NOTE1: Anton's original inherit exec test expected the child to have system
> default DSCR value instead of the inherited DSCR value from it's parent.
> But looks like thats not the case when we execute the test, it always
> inherits it's parent's DSCR value over the exec call as well. So I have
> changed the test program assuming its correct to have the inherited DSCR
> value in the fork/execed child program. Please let me know if thats not
> correct and I am missing something there.
> 
> NOTE2: The selftests/powerpc/.gitignore will be added and will get updated
> through a different patch series related to ptrace instead of this one.
> 
> Changes in V2:
> -------------
> - Updated the thread struct DSCR value inside mtspr facility exception path
> - Modified the in code documentation to follow the kernel-doc format
> - Added seven selftest based DSCR related test cases under powerpc

Hey Michael,

Did you get a chance to look into these patches ? After going through the
discussions regarding all the selftest test cases, seems like they are good
to go unless you disagree.


^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [PATCH V2 00/12] POWER DSCR fixes, improvements, docs and tests
  2015-02-04  8:21 ` [PATCH V2 00/12] POWER DSCR fixes, improvements, docs and tests Anshuman Khandual
@ 2015-02-04  8:36   ` Anshuman Khandual
  0 siblings, 0 replies; 28+ messages in thread
From: Anshuman Khandual @ 2015-02-04  8:36 UTC (permalink / raw)
  To: linuxppc-dev, linux-kernel, anton; +Cc: mikey, shuahkh

On 02/04/2015 01:51 PM, Anshuman Khandual wrote:
> On 01/13/2015 03:52 PM, Anshuman Khandual wrote:
>> > 	This patch series has patches for POWER DSCR fixes, improvements,
>> > in code documentaion, kernel support user documentation and selftest based
>> > test cases. It has got five test cases which are derived from Anton's DSCR
>> > test bucket which can be listed as follows.
>> > 
>> > (1) http://ozlabs.org/~anton/junkcode/dscr_default_test.c
>> > (2) http://ozlabs.org/~anton/junkcode/dscr_explicit_test.c
>> > (3) http://ozlabs.org/~anton/junkcode/dscr_inherit_exec_test.c
>> > (4) http://ozlabs.org/~anton/junkcode/dscr_inherit_test.c
>> > (5) http://ozlabs.org/~anton/junkcode/user_dscr_test.c
>> > 
>> > So the derivied test cases have Anton's copyright along with mine but the
>> > commit message as of now has only my signed-off-by statement. As Anton
>> > mentioned before he would put his signed-off-by after reviewing these
>> > modified test cases.
>> > 
>> > NOTE1: Anton's original inherit exec test expected the child to have system
>> > default DSCR value instead of the inherited DSCR value from it's parent.
>> > But looks like thats not the case when we execute the test, it always
>> > inherits it's parent's DSCR value over the exec call as well. So I have
>> > changed the test program assuming its correct to have the inherited DSCR
>> > value in the fork/execed child program. Please let me know if thats not
>> > correct and I am missing something there.
>> > 
>> > NOTE2: The selftests/powerpc/.gitignore will be added and will get updated
>> > through a different patch series related to ptrace instead of this one.
>> > 
>> > Changes in V2:
>> > -------------
>> > - Updated the thread struct DSCR value inside mtspr facility exception path
>> > - Modified the in code documentation to follow the kernel-doc format
>> > - Added seven selftest based DSCR related test cases under powerpc
> Hey Michael,
> 
> Did you get a chance to look into these patches ? After going through the
> discussions regarding all the selftest test cases, seems like they are good
> to go unless you disagree.

Hey Anton,

As discussed before (https://patchwork.ozlabs.org/patch/418583/), could you please
review the first five selftest test cases [patch 6, 7, 8, 9, 10] which are derived
from your DSCR test bucket and also consider acking them which will enable me to add
your Signed-off-by in the next version of the patch series. Thank you.

(1) http://ozlabs.org/~anton/junkcode/dscr_default_test.c
(2) http://ozlabs.org/~anton/junkcode/dscr_explicit_test.c
(3) http://ozlabs.org/~anton/junkcode/dscr_inherit_exec_test.c
(4) http://ozlabs.org/~anton/junkcode/dscr_inherit_test.c
(5) http://ozlabs.org/~anton/junkcode/user_dscr_test.c

Regards
Anshuman


^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [V2,06/12] selftests, powerpc: Add test for system wide DSCR default
  2015-01-13 10:22 ` [PATCH V2 06/12] selftests, powerpc: Add test for system wide DSCR default Anshuman Khandual
  2015-01-13 15:22   ` Shuah Khan
@ 2015-03-27 12:01   ` Michael Ellerman
  2015-04-09 10:31     ` [V2, 06/12] " Anshuman Khandual
  1 sibling, 1 reply; 28+ messages in thread
From: Michael Ellerman @ 2015-03-27 12:01 UTC (permalink / raw)
  To: Anshuman Khandual, linuxppc-dev, linux-kernel; +Cc: mikey, anton

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 1333 bytes --]

On Tue, 2015-13-01 at 10:22:34 UTC, Anshuman Khandual wrote:
> This patch adds a test case for the system wide DSCR default
> value, which when changed through it's sysfs interface must
> be visible to all threads reading DSCR either through the
> privilege state SPR or the problem state SPR. The DSCR value
> change should be immediate as well.
 
...

> +
> +/* Default DSCR access */
> +unsigned long get_default_dscr(void)
> +{
> +	int fd = -1;
> +	char buf[16];
> +	unsigned long val;
> +
> +	if (fd == -1) {
> +		fd = open(DSCR_DEFAULT, O_RDONLY);
> +		if (fd == -1) {
> +			perror("open() failed\n");
> +			exit(1);
> +		}
> +	}
> +	memset(buf, 0, sizeof(buf));
> +	lseek(fd, 0, SEEK_SET);
> +	read(fd, buf, sizeof(buf));


This and the other tests are failing to build:

    In file included from dscr_default_test.c:16:0:
    dscr.h: In function ‘get_default_dscr’:
    dscr.h:93:6: error: ignoring return value of ‘read’, declared with attribute warn_unused_result [-Werror=unused-result]
      read(fd, buf, sizeof(buf));
          ^
    dscr.h: In function ‘set_default_dscr’:
    dscr.h:112:7: error: ignoring return value of ‘write’, declared with attribute warn_unused_result [-Werror=unused-result]
      write(fd, buf, strlen(buf));
           ^
    cc1: all warnings being treated as errors

cheers

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [V2, 06/12] selftests, powerpc: Add test for system wide DSCR default
  2015-03-27 12:01   ` [V2,06/12] " Michael Ellerman
@ 2015-04-09 10:31     ` Anshuman Khandual
  2015-04-09 12:38       ` Anshuman Khandual
  0 siblings, 1 reply; 28+ messages in thread
From: Anshuman Khandual @ 2015-04-09 10:31 UTC (permalink / raw)
  To: Michael Ellerman, linuxppc-dev, linux-kernel; +Cc: mikey, anton

On 03/27/2015 05:31 PM, Michael Ellerman wrote:
> On Tue, 2015-13-01 at 10:22:34 UTC, Anshuman Khandual wrote:
>> This patch adds a test case for the system wide DSCR default
>> value, which when changed through it's sysfs interface must
>> be visible to all threads reading DSCR either through the
>> privilege state SPR or the problem state SPR. The DSCR value
>> change should be immediate as well.
> 
> ...
> 
>> +
>> +/* Default DSCR access */
>> +unsigned long get_default_dscr(void)
>> +{
>> +	int fd = -1;
>> +	char buf[16];
>> +	unsigned long val;
>> +
>> +	if (fd == -1) {
>> +		fd = open(DSCR_DEFAULT, O_RDONLY);
>> +		if (fd == -1) {
>> +			perror("open() failed\n");
>> +			exit(1);
>> +		}
>> +	}
>> +	memset(buf, 0, sizeof(buf));
>> +	lseek(fd, 0, SEEK_SET);
>> +	read(fd, buf, sizeof(buf));
> 

Normally, I build the test cases like

$cd tools/testing/selftests/powerpc/
$make dscr

with these compiler flags "-Wall -O2 -flto -Wall -Werror" which
is still working for me. Then I figured out that the read and
write declaration in unistd.h header file has "_wur" in it.

extern ssize_t read (int __fd, void *__buf, size_t __nbytes) __wur;
extern ssize_t write (int __fd, const void *__buf, size_t __n) __wur;

Then some how the compiler (GCC 4.8.3) is not complaining about it.

> 
> This and the other tests are failing to build:
> 
>     In file included from dscr_default_test.c:16:0:
>     dscr.h: In function ‘get_default_dscr’:
>     dscr.h:93:6: error: ignoring return value of ‘read’, declared with attribute warn_unused_result [-Werror=unused-result]
>       read(fd, buf, sizeof(buf));
>           ^
>     dscr.h: In function ‘set_default_dscr’:
>     dscr.h:112:7: error: ignoring return value of ‘write’, declared with attribute warn_unused_result [-Werror=unused-result]
>       write(fd, buf, strlen(buf));
>            ^
>     cc1: all warnings being treated as errors

Anyways, I can change the header file helper functions if you would like.
BTW, the patch series does not apply as it is and requires rebasing. Would
send out a new version of it.


^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [V2, 06/12] selftests, powerpc: Add test for system wide DSCR default
  2015-04-09 10:31     ` [V2, 06/12] " Anshuman Khandual
@ 2015-04-09 12:38       ` Anshuman Khandual
  0 siblings, 0 replies; 28+ messages in thread
From: Anshuman Khandual @ 2015-04-09 12:38 UTC (permalink / raw)
  To: Michael Ellerman, linuxppc-dev, linux-kernel; +Cc: mikey, anton

On 04/09/2015 04:01 PM, Anshuman Khandual wrote:
> On 03/27/2015 05:31 PM, Michael Ellerman wrote:
>> On Tue, 2015-13-01 at 10:22:34 UTC, Anshuman Khandual wrote:
>>> This patch adds a test case for the system wide DSCR default
>>> value, which when changed through it's sysfs interface must
>>> be visible to all threads reading DSCR either through the
>>> privilege state SPR or the problem state SPR. The DSCR value
>>> change should be immediate as well.
>>
>> ...
>>
>>> +
>>> +/* Default DSCR access */
>>> +unsigned long get_default_dscr(void)
>>> +{
>>> +	int fd = -1;
>>> +	char buf[16];
>>> +	unsigned long val;
>>> +
>>> +	if (fd == -1) {
>>> +		fd = open(DSCR_DEFAULT, O_RDONLY);
>>> +		if (fd == -1) {
>>> +			perror("open() failed\n");
>>> +			exit(1);
>>> +		}
>>> +	}
>>> +	memset(buf, 0, sizeof(buf));
>>> +	lseek(fd, 0, SEEK_SET);
>>> +	read(fd, buf, sizeof(buf));
>>
> 
> Normally, I build the test cases like
> 
> $cd tools/testing/selftests/powerpc/
> $make dscr
> 
> with these compiler flags "-Wall -O2 -flto -Wall -Werror" which
> is still working for me. Then I figured out that the read and
> write declaration in unistd.h header file has "_wur" in it.
> 
> extern ssize_t read (int __fd, void *__buf, size_t __nbytes) __wur;
> extern ssize_t write (int __fd, const void *__buf, size_t __n) __wur;
> 
> Then some how the compiler (GCC 4.8.3) is not complaining about it.
> 
>>
>> This and the other tests are failing to build:
>>
>>     In file included from dscr_default_test.c:16:0:
>>     dscr.h: In function ‘get_default_dscr’:
>>     dscr.h:93:6: error: ignoring return value of ‘read’, declared with attribute warn_unused_result [-Werror=unused-result]
>>       read(fd, buf, sizeof(buf));
>>           ^
>>     dscr.h: In function ‘set_default_dscr’:
>>     dscr.h:112:7: error: ignoring return value of ‘write’, declared with attribute warn_unused_result [-Werror=unused-result]
>>       write(fd, buf, strlen(buf));
>>            ^
>>     cc1: all warnings being treated as errors
> 
> Anyways, I can change the header file helper functions if you would like.
> BTW, the patch series does not apply as it is and requires rebasing. Would
> send out a new version of it.

The rebased patch series works as expected like this version and all the tests
pass. I would add a  .gitignore file for this new test directory. Please let me
know if there are other changes which need to be done. Thanks !!


^ permalink raw reply	[flat|nested] 28+ messages in thread

end of thread, other threads:[~2015-04-09 12:38 UTC | newest]

Thread overview: 28+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-01-13 10:22 [PATCH V2 00/12] POWER DSCR fixes, improvements, docs and tests Anshuman Khandual
2015-01-13 10:22 ` [PATCH V2 01/12] powerpc: Fix handling of DSCR related facility unavailable exception Anshuman Khandual
2015-01-13 10:22 ` [PATCH V2 02/12] powerpc, process: Remove the unused extern dscr_default Anshuman Khandual
2015-01-13 10:22 ` [PATCH V2 03/12] powerpc, offset: Change PACA_DSCR to PACA_DSCR_DEFAULT Anshuman Khandual
2015-01-13 10:22 ` [PATCH V2 04/12] powerpc, dscr: Added some in-code documentation Anshuman Khandual
2015-01-13 10:22 ` [PATCH V2 05/12] documentation, powerpc: Add documentation for DSCR support Anshuman Khandual
2015-01-13 10:22 ` [PATCH V2 06/12] selftests, powerpc: Add test for system wide DSCR default Anshuman Khandual
2015-01-13 15:22   ` Shuah Khan
2015-01-13 23:44     ` Michael Ellerman
2015-01-20 21:40       ` Dave Jones
2015-01-21  6:51         ` Michael Ellerman
2015-03-27 12:01   ` [V2,06/12] " Michael Ellerman
2015-04-09 10:31     ` [V2, 06/12] " Anshuman Khandual
2015-04-09 12:38       ` Anshuman Khandual
2015-01-13 10:22 ` [PATCH V2 07/12] selftests, powerpc: Add test for explicitly changing DSCR value Anshuman Khandual
2015-01-13 15:23   ` Shuah Khan
2015-01-13 10:22 ` [PATCH V2 08/12] selftests, powerpc: Add test for DSCR SPR numbers Anshuman Khandual
2015-01-13 15:23   ` Shuah Khan
2015-01-13 10:22 ` [PATCH V2 09/12] selftests, powerpc: Add test for DSCR value inheritence across fork Anshuman Khandual
2015-01-13 15:24   ` Shuah Khan
2015-01-13 10:22 ` [PATCH V2 10/12] selftests, powerpc: Add test for DSCR inheritence across fork & exec Anshuman Khandual
2015-01-13 15:24   ` Shuah Khan
2015-01-13 10:22 ` [PATCH V2 11/12] selftests, powerpc: Add test for all DSCR sysfs interfaces Anshuman Khandual
2015-01-13 15:24   ` Shuah Khan
2015-01-13 10:22 ` [PATCH V2 12/12] selftests, powerpc: Add thread based stress test for " Anshuman Khandual
2015-01-13 15:24   ` Shuah Khan
2015-02-04  8:21 ` [PATCH V2 00/12] POWER DSCR fixes, improvements, docs and tests Anshuman Khandual
2015-02-04  8:36   ` Anshuman Khandual

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).