Skip to contentSkip to conversation

oprofile: hotplug cpu fix

PATCH Applied Chris J Arges 2 participants 2 messages Oct 15, 2008 – Oct 17, 2008

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 oprofile: hotplug cpu fix

This patch addresses crashes when hotplugging cpus while profiling. I used the following script to test :

   #!/bin/bash
   startup()
   {
     opcontrol --init
     opcontrol --vmlinux=/boot/vmlinux
     opcontrol --reset
     opcontrol  --start
     opcontrol --dump
   }
   shutdown()
   {
     opcontrol --dump
     opcontrol -h
   }
   startup
   echo 0 > /sys/devices/system/cpu/cpu2/online
   echo 0 > /sys/devices/system/cpu/cpu1/online
   shutdown
   startup
   echo 1 > /sys/devices/system/cpu/cpu2/online
   echo 1 > /sys/devices/system/cpu/cpu1/online
   shutdown
   startup
   echo 0 > /sys/devices/system/cpu/cpu2/online
   shutdown
   startup
   echo 1 > /sys/devices/system/cpu/cpu2/online
   echo 0 > /sys/devices/system/cpu/cpu2/online
   shutdown
   echo 1 > /sys/devices/system/cpu/cpu2/online

Without the patch on my Power machine (ppc970mp) I get the following error:

Vector: 300 (Data Access) at [c000000276143950]
pc: d0000000000366e8: .add_event_entry+0x60/0xb0 [oprofile]
lr: d000000000035e60: .sync_buffer+0x68/0x4ac [oprofile]

Without the patch on my x86 (Core 2 Duo) machine:

mutex_lock +0x8/0x20
sync_buffer +0x29/0x3e0
wq_sync_buffer +0x0/0x70

Since I'm guessing hotplugging cpus and using oprofile is not a common occurrence, this patch is just a do-no-harm fix, instead of a full solution with a hotplug callback, etc.

Thanks,
--chris

Quoted 1 line

From 60f07301d3c387a0405becccbdc0cfb7e99ecf39 Mon Sep 17 00:00:00 2001

From: Chris J Arges <[email protected]>
Date: Wed, 15 Oct 2008 11:03:39 -0500
Subject: [PATCH] oprofile: hotplug cpu fix
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.

---
 drivers/oprofile/cpu_buffer.c |    9 +++++++--
 1 files changed, 7 insertions(+), 2 deletions(-)
drivers/oprofile/cpu_buffer.c +7 -2
index e1bd5a9..8bb030b 100644
@@ -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,
@@ -368,6 +368,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);
 
Signature · 3 lines
1.5.4.5

Signed-off-by: Chris J Arges <[email protected]>
#1 lore raw
Quoted 10 lines · Chris J Arges

From 60f07301d3c387a0405becccbdc0cfb7e99ecf39 Mon Sep 17 00:00:00 2001
From: Chris J Arges <[email protected]>
Date: Wed, 15 Oct 2008 11:03:39 -0500
Subject: [PATCH] oprofile: hotplug cpu fix
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.

Applied to oprofile/oprofile-for-tip. Thanks, Chris.

-Robert

Signature · 3 lines
Advanced Micro Devices, Inc.
Operating System Research Center
email: [email protected]