Use valid node number when unmapping CPUs
PATCH 1/1 Use valid node number when unmapping CPUs
The cpu_2_node array for i386 is initialized to 0 for each CPU, effectively mapping all CPUs to node 0 unless changed. When we unmap CPUs, however, we stick a -1 in the array, mapping the CPU to an invalid node. This really isn't helpful. We should map the CPU to node 0, to make sure that callers of cpu_to_node() and friends aren't returned a bogus node number. This trivial patch changes the unmapping code to place a 0 in the node mapping for removed CPUs.
Cheers!
-Matt
arch/i386/kernel/smpboot.c +1 -1
@@ -520,7 +520,7 @@ static inline void unmap_cpu_to_node(intprintk ("Unmapping cpu %d from all nodes\n" , cpu);for (node =0 ; node <MAX_NUMNODES ; node ++)cpu_clear (cpu, node_2_cpu_mask[node]); - cpu_2_node[cpu] = -1; + cpu_2_node[cpu] = 0; }#else /* !CONFIG_NUMA */
Quoted 3 lines · Matthew Dobson
The
cpu_2_nodearray for i386 is initialized to 0 for each CPU, effectively mapping all CPUs to node 0 unless changed. When we unmap CPUs, however, we stick a -1 in the array, mapping the CPU to an invalid node. This really isn't helpful. We should map the CPU to node 0, to make sure that callers ofcpu_to_node()and friends aren't returned a bogus node number. This trivial patch changes the unmapping code to place a 0 in the node mapping for removed CPUs.Cheers!
I'd prefer it got initialised to -1 for each cpu, and either set to -1 or not touched during unmap.
0 is more bogus than the alternatives, isn't it? At least for the subset of CPUs not on node 0. Callers should be fixed.
Quoted 10 lines · Nick Piggin
Quoted 3 lines · Matthew Dobson
The
cpu_2_nodearray for i386 is initialized to 0 for each CPU, effectively mapping all CPUs to node 0 unless changed. When we unmap CPUs, however, we stick a -1 in the array, mapping the CPU to an invalid node. This really isn't helpful. We should map the CPU to node 0, to make sure that callers ofcpu_to_node()and friends aren't returned a bogus node number. This trivial patch changes the unmapping code to place a 0 in the node mapping for removed CPUs.Cheers!
Quoted 6 lines
I'd prefer it got initialised to -1 for each cpu, and either set to -1 or not touched during unmap.
0 is more bogus than the alternatives, isn't it? At least for the subset of CPUs not on node 0. Callers should be fixed.
Not really... These macros are usually used for things like scheduling, memory placement and other decisions. Right now the value doesn't have to be error-checked, because it is assumed to always return a valid node. For these types of uses, it's far better to schedule/allocate something on the wrong node (ie: node 0) than on an invalid node (ie: node -1). Having a possible negative value for this will break things when used as an array index (as it often is), and will force us to put tests to ensure it is a valid value before using it, and introduce possible races in the future (ie: imagine testing if CPU 17's node mapping is non-negative, simultaneously unmapping the CPU, then using the macro again to make a node decision. You may get a negative value back, thus causing you to index way off the end of your array... BOOM).
If we stick with the convention that we always have a valid (even if
not *correct*) value in these arrays, the worst we should get is poor performance, not breakage.
Cheers!
-Matt
Quoted 19 lines · Matthew Dobson
Quoted 17 lines · Nick Piggin
Quoted 3 lines · Matthew Dobson
The
cpu_2_nodearray for i386 is initialized to 0 for each CPU, effectively mapping all CPUs to node 0 unless changed. When we unmap CPUs, however, we stick a -1 in the array, mapping the CPU to an invalid node. This really isn't helpful. We should map the CPU to node 0, to make sure that callers ofcpu_to_node()and friends aren't returned a bogus node number. This trivial patch changes the unmapping code to place a 0 in the node mapping for removed CPUs.Cheers!
I'd prefer it got initialised to -1 for each cpu, and either set to -1 or not touched during unmap.
Quoted 5 lines
Quoted 2 lines
0 is more bogus than the alternatives, isn't it? At least for the subset of CPUs not on node 0. Callers should be fixed.
Not really... These macros are usually used for things like scheduling, memory placement and other decisions. Right now the value doesn't have to be error-checked, because it is assumed to always return a valid node. For these types of uses, it's far better to schedule/allocate something on the wrong node (ie: node 0) than on an invalid node (ie: node -1). Having a possible negative value for this will break things when used as an array index (as it often is), and will force us to put tests to ensure it is a valid value before using it, and introduce possible races in the future (ie: imagine testing if CPU 17's node mapping is non-negative, simultaneously unmapping the CPU, then using the macro again to make a node decision. You may get a negative value back, thus causing you to index way off the end of your array... BOOM). If we stick with the convention that we always have a valid (even if not *correct*) value in these arrays, the worst we should get is poor performance, not breakage.
OK, then keep the correct node number. No need to change it to node 0. Having the value not change at all (1) gives you the correct information at all times, and (2) eliminates the remaining race possibilities.
Quoted 19 lines · Matthew Dobson
Quoted 17 lines · Nick Piggin
Quoted 3 lines · Matthew Dobson
The
cpu_2_nodearray for i386 is initialized to 0 for each CPU, effectively mapping all CPUs to node 0 unless changed. When we unmap CPUs, however, we stick a -1 in the array, mapping the CPU to an invalid node. This really isn't helpful. We should map the CPU to node 0, to make sure that callers ofcpu_to_node()and friends aren't returned a bogus node number. This trivial patch changes the unmapping code to place a 0 in the node mapping for removed CPUs.Cheers!
I'd prefer it got initialised to -1 for each cpu, and either set to -1 or not touched during unmap.
Quoted 5 lines
Quoted 2 lines
0 is more bogus than the alternatives, isn't it? At least for the subset of CPUs not on node 0. Callers should be fixed.
Not really... These macros are usually used for things like scheduling, memory placement and other decisions. Right now the value doesn't have to be error-checked, because it is assumed to always return a valid node. For these types of uses, it's far better to schedule/allocate something on the wrong node (ie: node 0) than on an invalid node (ie: node -1). Having a possible negative value for this will break things when used as an array index (as it often is), and will force us to put tests to ensure it is a valid value before using it, and introduce possible races in the future (ie: imagine testing if CPU 17's node mapping is non-negative, simultaneously unmapping the CPU, then using the macro again to make a node decision. You may get a negative value back, thus causing you to index way off the end of your array... BOOM). If we stick with the convention that we always have a valid (even if not *correct*) value in these arrays, the worst we should get is poor performance, not breakage.
OK, then keep the correct node number. No need to change it to node 0. Having the value not change at all (1) gives you the correct information at all times, and (2) eliminates the remaining race possibilities.
Quoted 10 lines · Nick Piggin
Quoted 3 lines · Matthew Dobson
The
cpu_2_nodearray for i386 is initialized to 0 for each CPU, effectively mapping all CPUs to node 0 unless changed. When we unmap CPUs, however, we stick a -1 in the array, mapping the CPU to an invalid node. This really isn't helpful. We should map the CPU to node 0, to make sure that callers ofcpu_to_node()and friends aren't returned a bogus node number. This trivial patch changes the unmapping code to place a 0 in the node mapping for removed CPUs.Cheers!
Quoted 6 lines
I'd prefer it got initialised to -1 for each cpu, and either set to -1 or not touched during unmap.
0 is more bogus than the alternatives, isn't it? At least for the subset of CPUs not on node 0. Callers should be fixed.
Not really... These macros are usually used for things like scheduling, memory placement and other decisions. Right now the value doesn't have to be error-checked, because it is assumed to always return a valid node. For these types of uses, it's far better to schedule/allocate something on the wrong node (ie: node 0) than on an invalid node (ie: node -1). Having a possible negative value for this will break things when used as an array index (as it often is), and will force us to put tests to ensure it is a valid value before using it, and introduce possible races in the future (ie: imagine testing if CPU 17's node mapping is non-negative, simultaneously unmapping the CPU, then using the macro again to make a node decision. You may get a negative value back, thus causing you to index way off the end of your array... BOOM).
If we stick with the convention that we always have a valid (even if
not *correct*) value in these arrays, the worst we should get is poor performance, not breakage.
Cheers!
-Matt