| From 46b30ea9bc3698bc1d1e6fd726c9601d46fa0a91 Mon Sep 17 00:00:00 2001 |
| From: Tejun Heo <tj@kernel.org> |
| Date: Tue, 21 Sep 2010 07:57:19 +0200 |
| Subject: percpu: fix pcpu_last_unit_cpu |
| |
| From: Tejun Heo <tj@kernel.org> |
| |
| commit 46b30ea9bc3698bc1d1e6fd726c9601d46fa0a91 upstream. |
| |
| pcpu_first/last_unit_cpu are used to track which cpu has the first and |
| last units assigned. This in turn is used to determine the span of a |
| chunk for man/unmap cache flushes and whether an address belongs to |
| the first chunk or not in per_cpu_ptr_to_phys(). |
| |
| When the number of possible CPUs isn't power of two, a chunk may |
| contain unassigned units towards the end of a chunk. The logic to |
| determine pcpu_last_unit_cpu was incorrect when there was an unused |
| unit at the end of a chunk. It failed to ignore the unused unit and |
| assigned the unused marker NR_CPUS to pcpu_last_unit_cpu. |
| |
| This was discovered through kdump failure which was caused by |
| malfunctioning per_cpu_ptr_to_phys() on a kvm setup with 50 possible |
| CPUs by CAI Qian. |
| |
| Signed-off-by: Tejun Heo <tj@kernel.org> |
| Reported-by: CAI Qian <caiqian@redhat.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| mm/percpu.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/mm/percpu.c |
| +++ b/mm/percpu.c |
| @@ -1702,9 +1702,9 @@ int __init pcpu_setup_first_chunk(const |
| |
| if (pcpu_first_unit_cpu == NR_CPUS) |
| pcpu_first_unit_cpu = cpu; |
| + pcpu_last_unit_cpu = cpu; |
| } |
| } |
| - pcpu_last_unit_cpu = cpu; |
| pcpu_nr_units = unit; |
| |
| for_each_possible_cpu(cpu) |