All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/3] powerpc: fix regression of per-CPU DSCR setting
@ 2014-05-21  6:32 Sam Bobroff
  2014-05-21  6:32 ` [PATCH 1/3] powerpc: Split __SYSFS_SPRSETUP macro Sam Bobroff
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Sam Bobroff @ 2014-05-21  6:32 UTC (permalink / raw)
  To: benh; +Cc: aik, mikey, linuxppc-dev

Hello,

This patch corrects a regression on PowerPC CPUs that causes their
per-CPU DSCR SPR value (exposed via /sys/devices/system/cpuN/dscr) to
be quickly lost during context switching, effectively meaning that the
DSCR can no longer be set on a per-CPU basis.

My intent is to restore the functionality of the per-CPU value in a
way that is compatible with the newer global default and task-specific
DSCR setting system.  Users of either the old or new systems should
now get pretty much what they expect.

A couple of notes:

I've split an existing "ifdef CONFIG_PPC_STD_MMU_64" block in
paca_struct into two parts because it allows dscr_default to be placed
into a cache line hole. (This seems be the case even without
CONFIG_PPC_STD_MMU_64 being defined.) Comments or ideas on alternative
placements are welcome.

PowerPC context switching is touched but there should not be any
performance cost; if anything it should get slightly faster due to the
per-CPU value being easier to access than the old global default.

Sam Bobroff (3):
  powerpc: Split __SYSFS_SPRSETUP macro
  powerpc: fix regression of per-CPU DSCR setting
  powerpc: Document sysfs DSCR interface

 Documentation/ABI/stable/sysfs-devices-system-cpu |   25 ++++++++++
 arch/powerpc/include/asm/paca.h                   |    3 ++
 arch/powerpc/kernel/asm-offsets.c                 |    1 +
 arch/powerpc/kernel/entry_64.S                    |    9 +---
 arch/powerpc/kernel/sysfs.c                       |   51 +++++++++++++--------
 arch/powerpc/kernel/tm.S                          |   16 ++-----
 arch/powerpc/kvm/book3s_hv_rmhandlers.S           |    3 +-
 7 files changed, 67 insertions(+), 41 deletions(-)
 create mode 100644 Documentation/ABI/stable/sysfs-devices-system-cpu

-- 
1.7.10.4

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

* [PATCH 1/3] powerpc: Split __SYSFS_SPRSETUP macro
  2014-05-21  6:32 [PATCH 0/3] powerpc: fix regression of per-CPU DSCR setting Sam Bobroff
@ 2014-05-21  6:32 ` Sam Bobroff
  2014-06-02  9:09   ` Madhavan Srinivasan
  2014-05-21  6:32 ` [PATCH 2/3] powerpc: fix regression of per-CPU DSCR setting Sam Bobroff
  2014-05-21  6:32 ` [PATCH 3/3] powerpc: Document sysfs DSCR interface Sam Bobroff
  2 siblings, 1 reply; 6+ messages in thread
From: Sam Bobroff @ 2014-05-21  6:32 UTC (permalink / raw)
  To: benh; +Cc: aik, mikey, linuxppc-dev

Split the __SYSFS_SPRSETUP macro into two parts so that registers requiring
custom read and write functions can use common code for their show and store
functions.

Signed-off-by: Sam Bobroff <sam.bobroff@au1.ibm.com>
---
 arch/powerpc/kernel/sysfs.c |   19 +++++++++++++------
 1 file changed, 13 insertions(+), 6 deletions(-)

diff --git a/arch/powerpc/kernel/sysfs.c b/arch/powerpc/kernel/sysfs.c
index d90d4b7..e2a1d6f 100644
--- a/arch/powerpc/kernel/sysfs.c
+++ b/arch/powerpc/kernel/sysfs.c
@@ -404,7 +404,7 @@ void ppc_enable_pmcs(void)
 }
 EXPORT_SYMBOL(ppc_enable_pmcs);
 
-#define __SYSFS_SPRSETUP(NAME, ADDRESS, EXTRA) \
+#define __SYSFS_SPRSETUP_READ_WRITE(NAME, ADDRESS, EXTRA) \
 static void read_##NAME(void *val) \
 { \
 	*(unsigned long *)val = mfspr(ADDRESS);	\
@@ -413,7 +413,9 @@ static void write_##NAME(void *val) \
 { \
 	EXTRA; \
 	mtspr(ADDRESS, *(unsigned long *)val);	\
-} \
+}
+
+#define __SYSFS_SPRSETUP_SHOW_STORE(NAME) \
 static ssize_t show_##NAME(struct device *dev, \
 			struct device_attribute *attr, \
 			char *buf) \
@@ -436,10 +438,15 @@ static ssize_t __used \
 	return count; \
 }
 
-#define SYSFS_PMCSETUP(NAME, ADDRESS)	\
-	__SYSFS_SPRSETUP(NAME, ADDRESS, ppc_enable_pmcs())
-#define SYSFS_SPRSETUP(NAME, ADDRESS)	\
-	__SYSFS_SPRSETUP(NAME, ADDRESS, )
+#define SYSFS_PMCSETUP(NAME, ADDRESS) \
+	__SYSFS_SPRSETUP_READ_WRITE(NAME, ADDRESS, ppc_enable_pmcs()) \
+	__SYSFS_SPRSETUP_SHOW_STORE(NAME)
+#define SYSFS_SPRSETUP(NAME, ADDRESS) \
+	__SYSFS_SPRSETUP_READ_WRITE(NAME, ADDRESS, ) \
+	__SYSFS_SPRSETUP_SHOW_STORE(NAME)
+
+#define SYSFS_SPRSETUP_SHOW_STORE(NAME) \
+	__SYSFS_SPRSETUP_SHOW_STORE(NAME)
 
 /* Let's define all possible registers, we'll only hook up the ones
  * that are implemented on the current processor
-- 
1.7.10.4

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

* [PATCH 2/3] powerpc: fix regression of per-CPU DSCR setting
  2014-05-21  6:32 [PATCH 0/3] powerpc: fix regression of per-CPU DSCR setting Sam Bobroff
  2014-05-21  6:32 ` [PATCH 1/3] powerpc: Split __SYSFS_SPRSETUP macro Sam Bobroff
@ 2014-05-21  6:32 ` Sam Bobroff
  2014-06-02  9:27   ` Madhavan Srinivasan
  2014-05-21  6:32 ` [PATCH 3/3] powerpc: Document sysfs DSCR interface Sam Bobroff
  2 siblings, 1 reply; 6+ messages in thread
From: Sam Bobroff @ 2014-05-21  6:32 UTC (permalink / raw)
  To: benh; +Cc: aik, mikey, linuxppc-dev

Since commit "efcac65 powerpc: Per process DSCR + some fixes (try#4)"
it is no longer possible to set the DSCR on a per-CPU basis.

The old behaviour was to minipulate the DSCR SPR directly but this is no
longer sufficient: the value is quickly overwritten by context switching.

This patch stores the per-CPU DSCR value in a kernel variable rather than
directly in the SPR and it is used whenever a process has not set the DSCR
itself. The sysfs interface (/sys/devices/system/cpu/cpuN/dscr) is unchanged.

Writes to the old global default (/sys/devices/system/cpu/dscr_default)
now set all of the per-CPU values and reads return the last written value.

The new per-CPU default is added to the paca_struct and is used everywhere
outside of sysfs.c instead of the old global default.

Signed-off-by: Sam Bobroff <sam.bobroff@au1.ibm.com>
---
 arch/powerpc/include/asm/paca.h         |    3 +++
 arch/powerpc/kernel/asm-offsets.c       |    1 +
 arch/powerpc/kernel/entry_64.S          |    9 +--------
 arch/powerpc/kernel/sysfs.c             |   32 ++++++++++++++++++-------------
 arch/powerpc/kernel/tm.S                |   16 ++++------------
 arch/powerpc/kvm/book3s_hv_rmhandlers.S |    3 +--
 6 files changed, 29 insertions(+), 35 deletions(-)

diff --git a/arch/powerpc/include/asm/paca.h b/arch/powerpc/include/asm/paca.h
index 8e956a0..bb0bd25 100644
--- a/arch/powerpc/include/asm/paca.h
+++ b/arch/powerpc/include/asm/paca.h
@@ -92,7 +92,10 @@ struct paca_struct {
 	struct slb_shadow *slb_shadow_ptr;
 	struct dtl_entry *dispatch_log;
 	struct dtl_entry *dispatch_log_end;
+#endif /* CONFIG_PPC_STD_MMU_64 */
+	u64 dscr_default;		/* per-CPU default DSCR */
 
+#ifdef CONFIG_PPC_STD_MMU_64
 	/*
 	 * Now, starting in cacheline 2, the exception save areas
 	 */
diff --git a/arch/powerpc/kernel/asm-offsets.c b/arch/powerpc/kernel/asm-offsets.c
index dba8140..cba2697 100644
--- a/arch/powerpc/kernel/asm-offsets.c
+++ b/arch/powerpc/kernel/asm-offsets.c
@@ -247,6 +247,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_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 9fde8a1..911d453 100644
--- a/arch/powerpc/kernel/entry_64.S
+++ b/arch/powerpc/kernel/entry_64.S
@@ -387,12 +387,6 @@ _GLOBAL(ret_from_kernel_thread)
 	li	r3,0
 	b	syscall_exit
 
-	.section	".toc","aw"
-DSCR_DEFAULT:
-	.tc dscr_default[TC],dscr_default
-
-	.section	".text"
-
 /*
  * This routine switches between two different tasks.  The process
  * state of one is saved on its kernel stack.  Then the state
@@ -577,11 +571,10 @@ END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
 #ifdef CONFIG_PPC64
 BEGIN_FTR_SECTION
 	lwz	r6,THREAD_DSCR_INHERIT(r4)
-	ld	r7,DSCR_DEFAULT@toc(2)
 	ld	r0,THREAD_DSCR(r4)
 	cmpwi	r6,0
 	bne	1f
-	ld	r0,0(r7)
+	ld	r0,PACA_DSCR(r13)
 1:
 BEGIN_FTR_SECTION_NESTED(70)
 	mfspr	r8, SPRN_FSCR
diff --git a/arch/powerpc/kernel/sysfs.c b/arch/powerpc/kernel/sysfs.c
index e2a1d6f..67fd2fd 100644
--- a/arch/powerpc/kernel/sysfs.c
+++ b/arch/powerpc/kernel/sysfs.c
@@ -484,7 +484,6 @@ SYSFS_PMCSETUP(pmc8, SPRN_PMC8);
 SYSFS_PMCSETUP(mmcra, SPRN_MMCRA);
 SYSFS_SPRSETUP(purr, SPRN_PURR);
 SYSFS_SPRSETUP(spurr, SPRN_SPURR);
-SYSFS_SPRSETUP(dscr, SPRN_DSCR);
 SYSFS_SPRSETUP(pir, SPRN_PIR);
 
 /*
@@ -494,12 +493,27 @@ SYSFS_SPRSETUP(pir, SPRN_PIR);
 */
 static DEVICE_ATTR(mmcra, 0600, show_mmcra, store_mmcra);
 static DEVICE_ATTR(spurr, 0400, show_spurr, NULL);
-static DEVICE_ATTR(dscr, 0600, show_dscr, store_dscr);
 static DEVICE_ATTR(purr, 0400, show_purr, store_purr);
 static DEVICE_ATTR(pir, 0400, show_pir, NULL);
 
-unsigned long dscr_default = 0;
-EXPORT_SYMBOL(dscr_default);
+static unsigned long dscr_default;
+
+static void read_dscr(void *val)
+{
+	*(unsigned long *)val = get_paca()->dscr_default;
+}
+
+static void write_dscr(void *val)
+{
+	get_paca()->dscr_default = *(unsigned long *)val;
+	if (!current->thread.dscr_inherit) {
+		current->thread.dscr = *(unsigned long *)val;
+		mtspr(SPRN_DSCR, *(unsigned long *)val);
+	}
+}
+
+SYSFS_SPRSETUP_SHOW_STORE(dscr);
+static DEVICE_ATTR(dscr, 0600, show_dscr, store_dscr);
 
 static void add_write_permission_dev_attr(struct device_attribute *attr)
 {
@@ -512,14 +526,6 @@ static ssize_t show_dscr_default(struct device *dev,
 	return sprintf(buf, "%lx\n", dscr_default);
 }
 
-static void update_dscr(void *dummy)
-{
-	if (!current->thread.dscr_inherit) {
-		current->thread.dscr = dscr_default;
-		mtspr(SPRN_DSCR, dscr_default);
-	}
-}
-
 static ssize_t __used store_dscr_default(struct device *dev,
 		struct device_attribute *attr, const char *buf,
 		size_t count)
@@ -532,7 +538,7 @@ static ssize_t __used store_dscr_default(struct device *dev,
 		return -EINVAL;
 	dscr_default = val;
 
-	on_each_cpu(update_dscr, NULL, 1);
+	on_each_cpu(write_dscr, &val, 1);
 
 	return count;
 }
diff --git a/arch/powerpc/kernel/tm.S b/arch/powerpc/kernel/tm.S
index ee061c3..2a324f4 100644
--- a/arch/powerpc/kernel/tm.S
+++ b/arch/powerpc/kernel/tm.S
@@ -78,12 +78,6 @@ _GLOBAL(tm_abort)
 	TABORT(R3)
 	blr
 
-	.section	".toc","aw"
-DSCR_DEFAULT:
-	.tc dscr_default[TC],dscr_default
-
-	.section	".text"
-
 /* void tm_reclaim(struct thread_struct *thread,
  *                 unsigned long orig_msr,
  *		   uint8_t cause)
@@ -298,9 +292,8 @@ dont_backup_fp:
 	mtlr	r0
 	ld	r2, STK_GOT(r1)
 
-	/* Load system default DSCR */
-	ld	r4, DSCR_DEFAULT@toc(r2)
-	ld	r0, 0(r4)
+	/* Load CPU's default DSCR */
+	ld	r0, PACA_DSCR(r13)
 	mtspr	SPRN_DSCR, r0
 
 	blr
@@ -479,9 +472,8 @@ restore_gprs:
 	mtlr	r0
 	ld	r2, STK_GOT(r1)
 
-	/* Load system default DSCR */
-	ld	r4, DSCR_DEFAULT@toc(r2)
-	ld	r0, 0(r4)
+	/* Load CPU's default DSCR */
+	ld	r0, PACA_DSCR(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 9f0ad71..12f4ce5 100644
--- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S
+++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S
@@ -286,8 +286,7 @@ kvm_start_guest:
 	beq	kvm_no_guest
 
 	/* Set HSTATE_DSCR(r13) to something sensible */
-	LOAD_REG_ADDR(r6, dscr_default)
-	ld	r6, 0(r6)
+	ld	r6, PACA_DSCR(r13)
 	std	r6, HSTATE_DSCR(r13)
 
 	bl	kvmppc_hv_entry
-- 
1.7.10.4

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

* [PATCH 3/3] powerpc: Document sysfs DSCR interface
  2014-05-21  6:32 [PATCH 0/3] powerpc: fix regression of per-CPU DSCR setting Sam Bobroff
  2014-05-21  6:32 ` [PATCH 1/3] powerpc: Split __SYSFS_SPRSETUP macro Sam Bobroff
  2014-05-21  6:32 ` [PATCH 2/3] powerpc: fix regression of per-CPU DSCR setting Sam Bobroff
@ 2014-05-21  6:32 ` Sam Bobroff
  2 siblings, 0 replies; 6+ messages in thread
From: Sam Bobroff @ 2014-05-21  6:32 UTC (permalink / raw)
  To: benh; +Cc: aik, mikey, linuxppc-dev

Add some documentation about ...

/sys/devices/system/cpu/dscr_default
/sys/devices/system/cpu/cpuN/dscr

... to Documentation/ABI/stable.

Signed-off-by: Sam Bobroff <sam.bobroff@au1.ibm.com>
---
 Documentation/ABI/stable/sysfs-devices-system-cpu |   25 +++++++++++++++++++++
 1 file changed, 25 insertions(+)
 create mode 100644 Documentation/ABI/stable/sysfs-devices-system-cpu

diff --git a/Documentation/ABI/stable/sysfs-devices-system-cpu b/Documentation/ABI/stable/sysfs-devices-system-cpu
new file mode 100644
index 0000000..33c133e
--- /dev/null
+++ b/Documentation/ABI/stable/sysfs-devices-system-cpu
@@ -0,0 +1,25 @@
+What: 		/sys/devices/system/cpu/dscr_default
+Date:		13-May-2014
+KernelVersion:	v3.15.0
+Contact:
+Description:	Writes are equivalent to writing to
+		/sys/devices/system/cpu/cpuN/dscr on all CPUs.
+		Reads return the last written value or 0.
+		This value is not a global default: it is a way to set
+		all per-CPU defaults at the same time.
+Values:		64 bit unsigned integer (bit field)
+
+What: 		/sys/devices/system/cpu/cpu[0-9]+/dscr
+Date:		13-May-2014
+KernelVersion:	v3.15.0
+Contact:
+Description:	Default value for the Data Stream Control Register (DSCR) on
+		a CPU.
+		This default value is used when the kernel is executing and
+		for any process that has not set the DSCR itself.
+		If a process ever sets the DSCR (via direct access to the
+		SPR) that value will be persisted for that process and used
+		on any CPU where it executes (overriding the value described
+		here).
+		If set by a process it will be inherited by child processes.
+Values:		64 bit unsigned integer (bit field)
-- 
1.7.10.4

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

* Re: [PATCH 1/3] powerpc: Split __SYSFS_SPRSETUP macro
  2014-05-21  6:32 ` [PATCH 1/3] powerpc: Split __SYSFS_SPRSETUP macro Sam Bobroff
@ 2014-06-02  9:09   ` Madhavan Srinivasan
  0 siblings, 0 replies; 6+ messages in thread
From: Madhavan Srinivasan @ 2014-06-02  9:09 UTC (permalink / raw)
  To: linuxppc-dev

On Wednesday 21 May 2014 12:02 PM, Sam Bobroff wrote:
> Split the __SYSFS_SPRSETUP macro into two parts so that registers requiring
> custom read and write functions can use common code for their show and store
> functions.
> 
> Signed-off-by: Sam Bobroff <sam.bobroff@au1.ibm.com>
> ---
>  arch/powerpc/kernel/sysfs.c |   19 +++++++++++++------
>  1 file changed, 13 insertions(+), 6 deletions(-)
> 
> diff --git a/arch/powerpc/kernel/sysfs.c b/arch/powerpc/kernel/sysfs.c
> index d90d4b7..e2a1d6f 100644
> --- a/arch/powerpc/kernel/sysfs.c
> +++ b/arch/powerpc/kernel/sysfs.c
> @@ -404,7 +404,7 @@ void ppc_enable_pmcs(void)
>  }
>  EXPORT_SYMBOL(ppc_enable_pmcs);
>  
> -#define __SYSFS_SPRSETUP(NAME, ADDRESS, EXTRA) \
> +#define __SYSFS_SPRSETUP_READ_WRITE(NAME, ADDRESS, EXTRA) \
>  static void read_##NAME(void *val) \
>  { \
>  	*(unsigned long *)val = mfspr(ADDRESS);	\
> @@ -413,7 +413,9 @@ static void write_##NAME(void *val) \
>  { \
>  	EXTRA; \
>  	mtspr(ADDRESS, *(unsigned long *)val);	\
> -} \
> +}
> +
> +#define __SYSFS_SPRSETUP_SHOW_STORE(NAME) \
>  static ssize_t show_##NAME(struct device *dev, \
>  			struct device_attribute *attr, \
>  			char *buf) \
> @@ -436,10 +438,15 @@ static ssize_t __used \
>  	return count; \
>  }
>  
> -#define SYSFS_PMCSETUP(NAME, ADDRESS)	\
> -	__SYSFS_SPRSETUP(NAME, ADDRESS, ppc_enable_pmcs())
> -#define SYSFS_SPRSETUP(NAME, ADDRESS)	\
> -	__SYSFS_SPRSETUP(NAME, ADDRESS, )
> +#define SYSFS_PMCSETUP(NAME, ADDRESS) \
> +	__SYSFS_SPRSETUP_READ_WRITE(NAME, ADDRESS, ppc_enable_pmcs()) \
> +	__SYSFS_SPRSETUP_SHOW_STORE(NAME)
> +#define SYSFS_SPRSETUP(NAME, ADDRESS) \
> +	__SYSFS_SPRSETUP_READ_WRITE(NAME, ADDRESS, ) \
> +	__SYSFS_SPRSETUP_SHOW_STORE(NAME)
> +
> +#define SYSFS_SPRSETUP_SHOW_STORE(NAME) \
> +	__SYSFS_SPRSETUP_SHOW_STORE(NAME)
>  
>  /* Let's define all possible registers, we'll only hook up the ones
>   * that are implemented on the current processor
> 

Acked-by: Madhavan Srinivasan <maddy@linux.vnet.ibm.com>

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

* Re: [PATCH 2/3] powerpc: fix regression of per-CPU DSCR setting
  2014-05-21  6:32 ` [PATCH 2/3] powerpc: fix regression of per-CPU DSCR setting Sam Bobroff
@ 2014-06-02  9:27   ` Madhavan Srinivasan
  0 siblings, 0 replies; 6+ messages in thread
From: Madhavan Srinivasan @ 2014-06-02  9:27 UTC (permalink / raw)
  To: linuxppc-dev

On Wednesday 21 May 2014 12:02 PM, Sam Bobroff wrote:
> Since commit "efcac65 powerpc: Per process DSCR + some fixes (try#4)"
> it is no longer possible to set the DSCR on a per-CPU basis.
> 
> The old behaviour was to minipulate the DSCR SPR directly but this is no
> longer sufficient: the value is quickly overwritten by context switching.
> 
> This patch stores the per-CPU DSCR value in a kernel variable rather than
> directly in the SPR and it is used whenever a process has not set the DSCR
> itself. The sysfs interface (/sys/devices/system/cpu/cpuN/dscr) is unchanged.
> 
> Writes to the old global default (/sys/devices/system/cpu/dscr_default)
> now set all of the per-CPU values and reads return the last written value.
> 
> The new per-CPU default is added to the paca_struct and is used everywhere
> outside of sysfs.c instead of the old global default.
> 
> Signed-off-by: Sam Bobroff <sam.bobroff@au1.ibm.com>
> ---
>  arch/powerpc/include/asm/paca.h         |    3 +++
>  arch/powerpc/kernel/asm-offsets.c       |    1 +
>  arch/powerpc/kernel/entry_64.S          |    9 +--------
>  arch/powerpc/kernel/sysfs.c             |   32 ++++++++++++++++++-------------
>  arch/powerpc/kernel/tm.S                |   16 ++++------------
>  arch/powerpc/kvm/book3s_hv_rmhandlers.S |    3 +--
>  6 files changed, 29 insertions(+), 35 deletions(-)
> 
> diff --git a/arch/powerpc/include/asm/paca.h b/arch/powerpc/include/asm/paca.h
> index 8e956a0..bb0bd25 100644
> --- a/arch/powerpc/include/asm/paca.h
> +++ b/arch/powerpc/include/asm/paca.h
> @@ -92,7 +92,10 @@ struct paca_struct {
>  	struct slb_shadow *slb_shadow_ptr;
>  	struct dtl_entry *dispatch_log;
>  	struct dtl_entry *dispatch_log_end;
> +#endif /* CONFIG_PPC_STD_MMU_64 */
> +	u64 dscr_default;		/* per-CPU default DSCR */
>  
> +#ifdef CONFIG_PPC_STD_MMU_64
>  	/*
>  	 * Now, starting in cacheline 2, the exception save areas
>  	 */
> diff --git a/arch/powerpc/kernel/asm-offsets.c b/arch/powerpc/kernel/asm-offsets.c
> index dba8140..cba2697 100644
> --- a/arch/powerpc/kernel/asm-offsets.c
> +++ b/arch/powerpc/kernel/asm-offsets.c
> @@ -247,6 +247,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_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 9fde8a1..911d453 100644
> --- a/arch/powerpc/kernel/entry_64.S
> +++ b/arch/powerpc/kernel/entry_64.S
> @@ -387,12 +387,6 @@ _GLOBAL(ret_from_kernel_thread)
>  	li	r3,0
>  	b	syscall_exit
>  
> -	.section	".toc","aw"
> -DSCR_DEFAULT:
> -	.tc dscr_default[TC],dscr_default
> -
> -	.section	".text"
> -
>  /*
>   * This routine switches between two different tasks.  The process
>   * state of one is saved on its kernel stack.  Then the state
> @@ -577,11 +571,10 @@ END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
>  #ifdef CONFIG_PPC64
>  BEGIN_FTR_SECTION
>  	lwz	r6,THREAD_DSCR_INHERIT(r4)
> -	ld	r7,DSCR_DEFAULT@toc(2)
>  	ld	r0,THREAD_DSCR(r4)
>  	cmpwi	r6,0
>  	bne	1f
> -	ld	r0,0(r7)
> +	ld	r0,PACA_DSCR(r13)
>  1:
>  BEGIN_FTR_SECTION_NESTED(70)
>  	mfspr	r8, SPRN_FSCR
> diff --git a/arch/powerpc/kernel/sysfs.c b/arch/powerpc/kernel/sysfs.c
> index e2a1d6f..67fd2fd 100644
> --- a/arch/powerpc/kernel/sysfs.c
> +++ b/arch/powerpc/kernel/sysfs.c
> @@ -484,7 +484,6 @@ SYSFS_PMCSETUP(pmc8, SPRN_PMC8);
>  SYSFS_PMCSETUP(mmcra, SPRN_MMCRA);
>  SYSFS_SPRSETUP(purr, SPRN_PURR);
>  SYSFS_SPRSETUP(spurr, SPRN_SPURR);
> -SYSFS_SPRSETUP(dscr, SPRN_DSCR);
>  SYSFS_SPRSETUP(pir, SPRN_PIR);
>  
>  /*
> @@ -494,12 +493,27 @@ SYSFS_SPRSETUP(pir, SPRN_PIR);
>  */
>  static DEVICE_ATTR(mmcra, 0600, show_mmcra, store_mmcra);
>  static DEVICE_ATTR(spurr, 0400, show_spurr, NULL);
> -static DEVICE_ATTR(dscr, 0600, show_dscr, store_dscr);
>  static DEVICE_ATTR(purr, 0400, show_purr, store_purr);
>  static DEVICE_ATTR(pir, 0400, show_pir, NULL);
>  
> -unsigned long dscr_default = 0;
> -EXPORT_SYMBOL(dscr_default);
> +static unsigned long dscr_default;
> +
> +static void read_dscr(void *val)
> +{
> +	*(unsigned long *)val = get_paca()->dscr_default;
> +}
> +
> +static void write_dscr(void *val)
> +{
> +	get_paca()->dscr_default = *(unsigned long *)val;
> +	if (!current->thread.dscr_inherit) {
> +		current->thread.dscr = *(unsigned long *)val;
> +		mtspr(SPRN_DSCR, *(unsigned long *)val);
> +	}
> +}
> +
> +SYSFS_SPRSETUP_SHOW_STORE(dscr);
> +static DEVICE_ATTR(dscr, 0600, show_dscr, store_dscr);
>  
>  static void add_write_permission_dev_attr(struct device_attribute *attr)
>  {
> @@ -512,14 +526,6 @@ static ssize_t show_dscr_default(struct device *dev,
>  	return sprintf(buf, "%lx\n", dscr_default);
>  }
>  
> -static void update_dscr(void *dummy)
> -{
> -	if (!current->thread.dscr_inherit) {
> -		current->thread.dscr = dscr_default;
> -		mtspr(SPRN_DSCR, dscr_default);
> -	}
> -}
> -
>  static ssize_t __used store_dscr_default(struct device *dev,
>  		struct device_attribute *attr, const char *buf,
>  		size_t count)
> @@ -532,7 +538,7 @@ static ssize_t __used store_dscr_default(struct device *dev,
>  		return -EINVAL;
>  	dscr_default = val;
>  
> -	on_each_cpu(update_dscr, NULL, 1);
> +	on_each_cpu(write_dscr, &val, 1);
>  
>  	return count;
>  }

Acked-by: Madhavan Srinivasan <maddy@linux.vnet.ibm.com>

> diff --git a/arch/powerpc/kernel/tm.S b/arch/powerpc/kernel/tm.S
> index ee061c3..2a324f4 100644
> --- a/arch/powerpc/kernel/tm.S
> +++ b/arch/powerpc/kernel/tm.S
> @@ -78,12 +78,6 @@ _GLOBAL(tm_abort)
>  	TABORT(R3)
>  	blr
>  
> -	.section	".toc","aw"
> -DSCR_DEFAULT:
> -	.tc dscr_default[TC],dscr_default
> -
> -	.section	".text"
> -
>  /* void tm_reclaim(struct thread_struct *thread,
>   *                 unsigned long orig_msr,
>   *		   uint8_t cause)
> @@ -298,9 +292,8 @@ dont_backup_fp:
>  	mtlr	r0
>  	ld	r2, STK_GOT(r1)
>  
> -	/* Load system default DSCR */
> -	ld	r4, DSCR_DEFAULT@toc(r2)
> -	ld	r0, 0(r4)
> +	/* Load CPU's default DSCR */
> +	ld	r0, PACA_DSCR(r13)
>  	mtspr	SPRN_DSCR, r0
>  
>  	blr
> @@ -479,9 +472,8 @@ restore_gprs:
>  	mtlr	r0
>  	ld	r2, STK_GOT(r1)
>  
> -	/* Load system default DSCR */
> -	ld	r4, DSCR_DEFAULT@toc(r2)
> -	ld	r0, 0(r4)
> +	/* Load CPU's default DSCR */
> +	ld	r0, PACA_DSCR(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 9f0ad71..12f4ce5 100644
> --- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S
> +++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S
> @@ -286,8 +286,7 @@ kvm_start_guest:
>  	beq	kvm_no_guest
>  
>  	/* Set HSTATE_DSCR(r13) to something sensible */
> -	LOAD_REG_ADDR(r6, dscr_default)
> -	ld	r6, 0(r6)
> +	ld	r6, PACA_DSCR(r13)
>  	std	r6, HSTATE_DSCR(r13)
>  
>  	bl	kvmppc_hv_entry
> 

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

end of thread, other threads:[~2014-06-02  9:27 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-05-21  6:32 [PATCH 0/3] powerpc: fix regression of per-CPU DSCR setting Sam Bobroff
2014-05-21  6:32 ` [PATCH 1/3] powerpc: Split __SYSFS_SPRSETUP macro Sam Bobroff
2014-06-02  9:09   ` Madhavan Srinivasan
2014-05-21  6:32 ` [PATCH 2/3] powerpc: fix regression of per-CPU DSCR setting Sam Bobroff
2014-06-02  9:27   ` Madhavan Srinivasan
2014-05-21  6:32 ` [PATCH 3/3] powerpc: Document sysfs DSCR interface Sam Bobroff

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.