Commit d8c391a5 authored by Jake Moilanen's avatar Jake Moilanen Committed by Paul Mackerras

[POWERPC] Donate idle CPU cycles on dedicated partitions

A Power6 can give up CPU cycles on a dedicated CPU (as opposed to a
shared CPU) to other shared processors if the administrator asks for it
(via the HMC).

This enables that to work properly on P6.

This just involves setting a bit in the CAS structure as well as the
VPA.  To donate cycles, a CPU has to have all SMT threads idle and
have the donate bit set in the VPA.  Then call H_CEDE.

The reason why shared processors just aren't used is because dedicated
CPUs are guaranteed an actual processor, yet the system is still able to
increase the capacity of the shared CPU pool.

Also rename the VPA's cpuctls_task_attrs field to a more accurate name.
Signed-off-by: default avatarJake Moilanen <moilanen@austin.ibm.com>
Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
parent 2f97cd39
...@@ -635,6 +635,7 @@ static void __init early_cmdline_parse(void) ...@@ -635,6 +635,7 @@ static void __init early_cmdline_parse(void)
/* ibm,dynamic-reconfiguration-memory property supported */ /* ibm,dynamic-reconfiguration-memory property supported */
#define OV5_DRCONF_MEMORY 0x20 #define OV5_DRCONF_MEMORY 0x20
#define OV5_LARGE_PAGES 0x10 /* large pages supported */ #define OV5_LARGE_PAGES 0x10 /* large pages supported */
#define OV5_DONATE_DEDICATE_CPU 0x02 /* donate dedicated CPU support */
/* PCIe/MSI support. Without MSI full PCIe is not supported */ /* PCIe/MSI support. Without MSI full PCIe is not supported */
#ifdef CONFIG_PCI_MSI #ifdef CONFIG_PCI_MSI
#define OV5_MSI 0x01 /* PCIe/MSI support */ #define OV5_MSI 0x01 /* PCIe/MSI support */
...@@ -685,7 +686,8 @@ static unsigned char ibm_architecture_vec[] = { ...@@ -685,7 +686,8 @@ static unsigned char ibm_architecture_vec[] = {
/* option vector 5: PAPR/OF options */ /* option vector 5: PAPR/OF options */
3 - 2, /* length */ 3 - 2, /* length */
0, /* don't ignore, don't halt */ 0, /* don't ignore, don't halt */
OV5_LPAR | OV5_SPLPAR | OV5_LARGE_PAGES | OV5_DRCONF_MEMORY | OV5_MSI, OV5_LPAR | OV5_SPLPAR | OV5_LARGE_PAGES | OV5_DRCONF_MEMORY |
OV5_DONATE_DEDICATE_CPU | OV5_MSI,
}; };
/* Old method - ELF header with PT_NOTE sections */ /* Old method - ELF header with PT_NOTE sections */
......
...@@ -399,6 +399,7 @@ static void pseries_dedicated_idle_sleep(void) ...@@ -399,6 +399,7 @@ static void pseries_dedicated_idle_sleep(void)
* a good time to find other work to dispatch. * a good time to find other work to dispatch.
*/ */
get_lppaca()->idle = 1; get_lppaca()->idle = 1;
get_lppaca()->donate_dedicated_cpu = 1;
/* /*
* We come in with interrupts disabled, and need_resched() * We come in with interrupts disabled, and need_resched()
...@@ -431,6 +432,7 @@ static void pseries_dedicated_idle_sleep(void) ...@@ -431,6 +432,7 @@ static void pseries_dedicated_idle_sleep(void)
out: out:
HMT_medium(); HMT_medium();
get_lppaca()->donate_dedicated_cpu = 0;
get_lppaca()->idle = 0; get_lppaca()->idle = 0;
} }
......
...@@ -98,7 +98,7 @@ struct lppaca { ...@@ -98,7 +98,7 @@ struct lppaca {
u64 saved_gpr5; // Saved GPR5 x30-x37 u64 saved_gpr5; // Saved GPR5 x30-x37
u8 reserved4; // Reserved x38-x38 u8 reserved4; // Reserved x38-x38
u8 cpuctls_task_attrs; // Task attributes for cpuctls x39-x39 u8 donate_dedicated_cpu; // Donate dedicated CPU cycles x39-x39
u8 fpregs_in_use; // FP regs in use x3A-x3A u8 fpregs_in_use; // FP regs in use x3A-x3A
u8 pmcregs_in_use; // PMC regs in use x3B-x3B u8 pmcregs_in_use; // PMC regs in use x3B-x3B
volatile u32 saved_decr; // Saved Decr Value x3C-x3F volatile u32 saved_decr; // Saved Decr Value x3C-x3F
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment