Help! Need to add a flag to ia64 thread flags
Stephane:
I need to add a flag to the ia64 thread info flags to support my automigration work. I was using TIF_NOTIFY_RESUME which you removed. I didn't notice that happening, but even if I did, I couldn't/wouldn't have objected because my patches are still [maybe always?] out of tree.
Now, I've tried to add an automigration-specific flag, called TIF_MIGRATION_WORK--to the flags to trigger entry to do_notify_resume() to handle auto-migration. However, I'm getting errors from the assembler in arch/ia64/kernel/fsys.S where ever the instruction:
and r?=TIF_ALLWORK_MASK,r?
occurs, complaining that "Operand 2 of 'and' should be an 8-bit integer (-128-127)". This is worrisome to begin with, as thread information flags comment says that "pending work-to-be-done flags are in least-significant 16 bits", while the code currently only supports "8-bits". What's more interesting is that I've used bit '7' for the TIF_MIGRATION_WORK flag. That should fit in the range (-128 - 127), right? Maybe the assembler is confused by sign extension of the signed 8-bit int?
For my testing, I can probably use your 'PERFMON_WORK flag, but that's probably not a good long term solution. Any ideas how to proceed longer term to support >7 pending work flags?
Lee
Hello Lee,
Quoted 7 lines · Lee Schermerhorn
Stephane:
I need to add a flag to the ia64 thread info flags to support my automigration work. I was using
TIF_NOTIFY_RESUMEwhich you removed. I didn't notice that happening, but even if I did, I couldn't/wouldn't have objected because my patches are still [maybe always?] out of tree.
Welcome to my world!
I remove TIF_NOTIFY_RESUME because it was unused on all but IA-64. And there it was used by perfmon (v2.0) which I replace by a more explicit TIF flag.
Quoted 7 lines
Now, I've tried to add an automigration-specific flag, called TIF_MIGRATION_WORK--to the flags to trigger entry to
do_notify_resume()to handle auto-migration. However, I'm getting errors from the assembler inarch/ia64/kernel/fsys.Swhere ever the instruction:and r?=TIF_ALLWORK_MASK,r?
Quoted 9 lines
occurs, complaining that "Operand 2 of 'and' should be an 8-bit integer (-128-127)". This is worrisome to begin with, as thread information flags comment says that "pending work-to-be-done flags are in least-significant 16 bits", while the code currently only supports "8-bits". What's more interesting is that I've used bit '7' for the
TIF_MIGRATION_WORKflag. That should fit in the range (-128 - 127), right? Maybe the assembler is confused by sign extension of the signed 8-bit int?
Funny! I went through exactly the same thought process when I remove the TIF flag. Yes, the instruction say imm8, so you'd expect that a 8-bit constant would fit. But, if you look closer and especially to the pseudo-code describing the instruction you'll see that there is sign-extension going on, so the assembler is not wrong. What I do not understand is what's the point of sign-extension on a AND (bitwise) operation?
Quoted 4 lines
For my testing, I can probably use your '
PERFMON_WORKflag, but that's probably not a good long term solution. Any ideas how to proceed longer term to support >7 pending work flags?
In anycase, there is no solution to your problem but to modify entry.S to deal with the bit-width limitation, i.e, you need to load the constant into a register and then do the and. You probably understand now, why I thought is was easier to remove unused TIF flags....
Signature · 1 line
-Stephane
Re:[PATCH] Fix uninitialized local variable "covered" in i386 acpi-cpufreq driver
Updated patch:
Use CPU_MASK_NONE for initil value.
---
arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-)
arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c +1 -1
@@ -511,7 +511,7 @@ acpi_cpufreq_guess_freq(struct acpi_cpufreq_data *data, unsigned int cpu)static int acpi_cpufreq_early_init (void ) {struct acpi_processor_performance *data; -cpumask_t covered; +cpumask_t covered =CPU_MASK_NONE ;unsigned int i, j;dprintk ("acpi_cpufreq_early_init\n" );
PATCH 1/1 Fix uninitialized local variable "covered" in i386 acpi-cpufreq driver
In reply to Lee SchermerhornThe local variable "covered" is used without initialization in i386 acpi-cpufreq driver. The initial value of covered should be 0. The bug will cause memory leak when hit. The following patch fixes this bug.
---
arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-)
arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c +1 -1
@@ -511,7 +511,7 @@ acpi_cpufreq_guess_freq(struct acpi_cpufreq_data *data, unsigned int cpu)static int acpi_cpufreq_early_init (void ) {struct acpi_processor_performance *data; -cpumask_t covered; +cpumask_t covered=0 ;unsigned int i, j;dprintk ("acpi_cpufreq_early_init\n" );
Re: [PATCH] Fix uninitialized local variable "covered" in i386 acpi-cpufreq driver
Quoted 16 lines · On Thu, 26 Jul 2007 16:46:30 -0700 Fenghua Yu <[email protected]> wrote:
The local variable "covered" is used without initialization in i386 acpi-cpufreq driver. The initial value of covered should be 0. The bug will cause memory leak when hit. The following patch fixes this bug.
Signed-off-by Fenghua Yu <[email protected]>---
arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-)arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c +0
-0
arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c acpi_cpufreq_guess_freq(struct acpi_cpufreq_data *data, unsigned int cpu) · line 517
Quoted 8 lines
arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c +1
-1@@ -511,7 +511,7 @@ acpi_cpufreq_guess_freq(struct acpi_cpufreq_data *data, unsigned int cpu)static int acpi_cpufreq_early_init (void ) {struct acpi_processor_performance *data; -cpumask_t covered; +cpumask_t covered=0 ;unsigned int i, j;dprintk ("acpi_cpufreq_early_init\n" );
- please put spaces around "="
- that should have been CPU_MASK_NONE
- that code's way overengineered. This:
arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c renamed from arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c~a +1 -3
@@ -511,7 +511,6 @@ acpi_cpufreq_guess_freq(struct acpi_cpufstatic int acpi_cpufreq_early_init (void ) {struct acpi_processor_performance *data; -cpumask_t covered;unsigned int i, j;dprintk ("acpi_cpufreq_early_init\n" );
@@ -520,14 +519,13 @@ static int acpi_cpufreq_early_init(void) data =kzalloc (sizeof (struct acpi_processor_performance ),GFP_KERNEL );if (!data) { -for_each_cpu_mask (j, covered) { +for_each_possible_cpu (j) {kfree (acpi_perf_data[j]); acpi_perf_data[j] =NULL ; }return -ENOMEM ; } acpi_perf_data[i] = data; -cpu_set (i, covered); }/* Do initialization in ACPI core */
_
should do the trick (please check it)
- what we have here is an open-coded alloc_percpu(). Hows about converting it to alloc_percpu()?
- that function should have been be __init.
How's that for a one-liner? ;)
Re: [PATCH] Fix uninitialized local variable "covered" in i386 acpi-cpufreq driver
Quoted 1 line · On Thu, 26 Jul 2007 17:12:22 -0700 Andrew Morton <[email protected]>…
How's that for a one-liner? ;)
- the return value from acpi_cpufreq_early_init() gets ignored, so the module will still load, but won't work.
- Once that is fixed, the test for !acpi_perf_data[cpu] in acpi_cpufreq_cpu_init() can be removed.
RE: [PATCH] Fix uninitialized local variable "covered" in i386 acpi-cpufreq driver
Quoted 7 lines
Quoted 1 line
How's that for a one-liner? ;)
- the return value from
acpi_cpufreq_early_init()gets ignored, so the module will still load, but won't work.- Once that is fixed, the test for !acpi_perf_data[cpu] in
acpi_cpufreq_cpu_init()can be removed.
We will modify code in those places.