oprofile: hotplug cpu fix
authorChris J Arges <arges@linux.vnet.ibm.com>
Wed, 15 Oct 2008 16:03:39 +0000 (11:03 -0500)
committerRobert Richter <robert.richter@amd.com>
Fri, 17 Oct 2008 08:38:58 +0000 (10:38 +0200)
This patch addresses problems when hotplugging cpus while
profiling. Instead of allocating only online cpus, all possible cpu
buffers are allocated, which allows cpus to be onlined during
operation. If a cpu is offlined before profiling is shutdown
wq_sync_buffer checks for this condition then cancels this work and
does not sync this buffer.

Signed-off-by: Chris J Arges <arges@linux.vnet.ibm.com>
Signed-off-by: Robert Richter <robert.richter@amd.com>
drivers/oprofile/cpu_buffer.c

index 5a178065cfa0be546c5266d85e3d7d54ad6e38f6..67bcc1c95e60dd7d8b56b9c16c7d0803d80416b1 100644 (file)
@@ -39,7 +39,7 @@ void free_cpu_buffers(void)
 {
        int i;
 
-       for_each_online_cpu(i) {
+       for_each_possible_cpu(i) {
                vfree(per_cpu(cpu_buffer, i).buffer);
                per_cpu(cpu_buffer, i).buffer = NULL;
        }
@@ -51,7 +51,7 @@ int alloc_cpu_buffers(void)
 
        unsigned long buffer_size = fs_cpu_buffer_size;
 
-       for_each_online_cpu(i) {
+       for_each_possible_cpu(i) {
                struct oprofile_cpu_buffer *b = &per_cpu(cpu_buffer, i);
 
                b->buffer = vmalloc_node(sizeof(struct op_sample) * buffer_size,
@@ -350,6 +350,11 @@ static void wq_sync_buffer(struct work_struct *work)
        if (b->cpu != smp_processor_id()) {
                printk(KERN_DEBUG "WQ on CPU%d, prefer CPU%d\n",
                       smp_processor_id(), b->cpu);
+
+               if (!cpu_online(b->cpu)) {
+                       cancel_delayed_work(&b->work);
+                       return;
+               }
        }
        sync_buffer(b->cpu);