Skip to contentSkip to conversation

Help! Need to add a flag to ia64 thread flags

PATCH In review Lee Schermerhorn 4 participants 7 messages Jun 13, 2007 – Jul 27, 2007

lore
Share & tools
lore
#0 lore raw

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

#1 lore raw

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

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 in arch/ia64/kernel/fsys.S where 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_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?

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_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?

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
#2 lore raw

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
index 6f846be..14fc5b8 100644
@@ -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");
#3 lore raw

PATCH 1/1 Fix uninitialized local variable "covered" in i386 acpi-cpufreq driver

In reply to Lee Schermerhorn

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.

---

 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
index 6f846be..bfb4959 100644
@@ -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");
#4 lore raw

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.

---

 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
index 6f846be..bfb4959 100644

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_cpuf
 static 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? ;)

#5 lore raw

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.

#6 lore raw

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.