From: Dave.Martin@arm.com (Dave Martin)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 01/13] ARM: suspend: use hash of cpu_logical_map value to index into save array
Date: Wed, 24 Jul 2013 17:47:22 +0100 [thread overview]
Message-ID: <20130724164717.GA4610@localhost.localdomain> (raw)
In-Reply-To: <1374550289-25305-2-git-send-email-nicolas.pitre@linaro.org>
On Mon, Jul 22, 2013 at 11:31:17PM -0400, Nicolas Pitre wrote:
> Currently we hash the MPIDR of the CPU being suspended to determine which
> entry in the sleep_save_sp array to use. In some situations, such as when
> we want to resume on another physical CPU, the MPIDR of another CPU should
> be used instead.
>
> So let's use the value of cpu_logical_map(smp_processor_id()) in place
> of the MPIDR in the suspend path. This will result in the same index
> being used as with the previous code unless the caller has modified
> cpu_logical_map() beforehand.
This only works because we happen to swap MPIDRs in cpu_logical_map
before we get here, so that cpu_logical_map(smp_processor_id())
described the post-resume situation for this logical CPU, not the
current situation.
We have to swizzle cpu_logical_map() somewhere, and the suspend path is
just as good as the resume path for that. But this patch commits us to
requiring that on the suspend path specifically -- I think that ought to
be mentioned somewhere. A comment in the preamble for __cpu_suspend
would be enough, I think.
Looks like the patch should work though, and it does remove the need to
read the MPIDR, which is slightly nicer for the non-switcher case.
Cheers
---Dave
>
> The register allocation in __cpu_suspend is reworked in order to better
> accommodate the additional argument.
>
> Signed-off-by: Nicolas Pitre <nico@linaro.org>
> ---
> arch/arm/kernel/sleep.S | 25 +++++++++++--------------
> arch/arm/kernel/suspend.c | 8 +++++---
> 2 files changed, 16 insertions(+), 17 deletions(-)
>
> diff --git a/arch/arm/kernel/sleep.S b/arch/arm/kernel/sleep.S
> index db1536b8b3..836d10e698 100644
> --- a/arch/arm/kernel/sleep.S
> +++ b/arch/arm/kernel/sleep.S
> @@ -55,6 +55,7 @@
> * specific registers and some other data for resume.
> * r0 = suspend function arg0
> * r1 = suspend function
> + * r2 = MPIDR value used to index into sleep_save_sp
> */
> ENTRY(__cpu_suspend)
> stmfd sp!, {r4 - r11, lr}
> @@ -67,23 +68,19 @@ ENTRY(__cpu_suspend)
> mov r5, sp @ current virtual SP
> add r4, r4, #12 @ Space for pgd, virt sp, phys resume fn
> sub sp, sp, r4 @ allocate CPU state on stack
> - stmfd sp!, {r0, r1} @ save suspend func arg and pointer
> - add r0, sp, #8 @ save pointer to save block
> - mov r1, r4 @ size of save block
> - mov r2, r5 @ virtual SP
> ldr r3, =sleep_save_sp
> + stmfd sp!, {r0, r1} @ save suspend func arg and pointer
> ldr r3, [r3, #SLEEP_SAVE_SP_VIRT]
> - ALT_SMP(mrc p15, 0, r9, c0, c0, 5)
> - ALT_UP_B(1f)
> - ldr r8, =mpidr_hash
> - /*
> - * This ldmia relies on the memory layout of the mpidr_hash
> - * struct mpidr_hash.
> - */
> - ldmia r8, {r4-r7} @ r4 = mpidr mask (r5,r6,r7) = l[0,1,2] shifts
> - compute_mpidr_hash lr, r5, r6, r7, r9, r4
> - add r3, r3, lr, lsl #2
> + ALT_SMP(ldr r0, =mpidr_hash)
> + ALT_UP_B(1f)
> + /* This ldmia relies on the memory layout of the mpidr_hash struct */
> + ldmia r0, {r1, r6-r8} @ r1 = mpidr mask (r6,r7,r8) = l[0,1,2] shifts
> + compute_mpidr_hash r0, r6, r7, r8, r2, r1
> + add r3, r3, r0, lsl #2
> 1:
> + mov r2, r5 @ virtual SP
> + mov r1, r4 @ size of save block
> + add r0, sp, #8 @ pointer to save block
> bl __cpu_suspend_save
> adr lr, BSYM(cpu_suspend_abort)
> ldmfd sp!, {r0, pc} @ call suspend fn
> diff --git a/arch/arm/kernel/suspend.c b/arch/arm/kernel/suspend.c
> index 41cf3cbf75..2835d35234 100644
> --- a/arch/arm/kernel/suspend.c
> +++ b/arch/arm/kernel/suspend.c
> @@ -10,7 +10,7 @@
> #include <asm/suspend.h>
> #include <asm/tlbflush.h>
>
> -extern int __cpu_suspend(unsigned long, int (*)(unsigned long));
> +extern int __cpu_suspend(unsigned long, int (*)(unsigned long), u32 cpuid);
> extern void cpu_resume_mmu(void);
>
> #ifdef CONFIG_MMU
> @@ -21,6 +21,7 @@ extern void cpu_resume_mmu(void);
> int cpu_suspend(unsigned long arg, int (*fn)(unsigned long))
> {
> struct mm_struct *mm = current->active_mm;
> + u32 __mpidr = cpu_logical_map(smp_processor_id());
> int ret;
>
> if (!idmap_pgd)
> @@ -32,7 +33,7 @@ int cpu_suspend(unsigned long arg, int (*fn)(unsigned long))
> * resume (indicated by a zero return code), we need to switch
> * back to the correct page tables.
> */
> - ret = __cpu_suspend(arg, fn);
> + ret = __cpu_suspend(arg, fn, __mpidr);
> if (ret == 0) {
> cpu_switch_mm(mm->pgd, mm);
> local_flush_bp_all();
> @@ -44,7 +45,8 @@ int cpu_suspend(unsigned long arg, int (*fn)(unsigned long))
> #else
> int cpu_suspend(unsigned long arg, int (*fn)(unsigned long))
> {
> - return __cpu_suspend(arg, fn);
> + u32 __mpidr = cpu_logical_map(smp_processor_id());
> + return __cpu_suspend(arg, fn, __mpidr);
> }
> #define idmap_pgd NULL
> #endif
> --
> 1.8.1.2
>
next prev parent reply other threads:[~2013-07-24 16:47 UTC|newest]
Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-07-23 3:31 [PATCH 00/13] The big.LITTLE In-Kernel Switcher (IKS), part 1 Nicolas Pitre
2013-07-23 3:31 ` [PATCH 01/13] ARM: suspend: use hash of cpu_logical_map value to index into save array Nicolas Pitre
2013-07-24 16:47 ` Dave Martin [this message]
2013-07-24 18:55 ` Nicolas Pitre
2013-07-25 10:55 ` Dave Martin
2013-07-25 16:06 ` Nicolas Pitre
2013-07-26 11:31 ` Lorenzo Pieralisi
2013-07-26 14:41 ` Nicolas Pitre
2013-07-26 15:34 ` Dave Martin
2013-07-26 15:43 ` Nicolas Pitre
2013-07-26 15:45 ` Dave Martin
2013-07-26 17:04 ` Lorenzo Pieralisi
2013-07-26 19:19 ` Nicolas Pitre
2013-07-29 11:50 ` Lorenzo Pieralisi
2013-07-30 2:08 ` Nicolas Pitre
2013-07-30 9:15 ` Dave Martin
2013-07-23 3:31 ` [PATCH 02/13] ARM: gic: add CPU migration support Nicolas Pitre
2013-07-25 11:44 ` Jonathan Austin
2013-07-25 19:11 ` Nicolas Pitre
2013-07-23 3:31 ` [PATCH 03/13] ARM: b.L: core switcher code Nicolas Pitre
2013-07-25 17:15 ` Jonathan Austin
2013-07-25 20:20 ` Nicolas Pitre
2013-07-26 10:45 ` Lorenzo Pieralisi
2013-07-26 14:29 ` Nicolas Pitre
2013-07-26 14:53 ` Russell King - ARM Linux
2013-07-26 15:10 ` Nicolas Pitre
2013-07-23 3:31 ` [PATCH 04/13] ARM: bL_switcher: add clockevent save/restore support Nicolas Pitre
2013-07-23 3:31 ` [PATCH 05/13] ARM: bL_switcher: move to dedicated threads rather than workqueues Nicolas Pitre
2013-07-26 15:18 ` Lorenzo Pieralisi
2013-07-26 15:39 ` Nicolas Pitre
2013-07-23 3:31 ` [PATCH 06/13] ARM: bL_switcher: simplify stack isolation Nicolas Pitre
2013-07-23 3:31 ` [PATCH 07/13] ARM: bL_switcher: hot-unplug half of the available CPUs Nicolas Pitre
2013-07-23 3:31 ` [PATCH 08/13] ARM: bL_switcher: do not hardcode GIC IDs in the code Nicolas Pitre
2013-07-23 3:31 ` [PATCH 09/13] ARM: bL_switcher: ability to enable and disable the switcher via sysfs Nicolas Pitre
2013-07-23 3:31 ` [PATCH 10/13] ARM: bL_switcher: add kernel cmdline param to disable the switcher on boot Nicolas Pitre
2013-07-23 3:31 ` [PATCH 11/13] ARM: bL_switcher: veto CPU hotplug requests when the switcher is active Nicolas Pitre
2013-07-31 10:30 ` Lorenzo Pieralisi
2013-08-05 4:25 ` Nicolas Pitre
2013-07-23 3:31 ` [PATCH 12/13] ARM: bL_switcher: remove assumptions between logical and physical CPUs Nicolas Pitre
2013-07-30 16:30 ` Lorenzo Pieralisi
2013-07-30 19:15 ` Nicolas Pitre
2013-07-31 9:41 ` Lorenzo Pieralisi
2013-07-23 3:31 ` [PATCH 13/13] ARM: bL_switcher: add a simple /dev user interface for debugging purposes Nicolas Pitre
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20130724164717.GA4610@localhost.localdomain \
--to=dave.martin@arm.com \
--cc=linux-arm-kernel@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is 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.