From 2ccfcd7a092d9e18105ef9f1d76d8250abe35ea4 Mon Sep 17 00:00:00 2001 From: "kfraser@localhost.localdomain" Date: Thu, 9 Nov 2006 11:47:42 +0000 Subject: [PATCH 1/2] [XENOPROF] Oprofile user level samples for passive domains are being lost. The number of of lost samples is most significant when dom0 is idle. From: joserenato.santos@hp.com Signed-off-by: Keir Fraser --- .../linux-2.6.16.29/xenoprof-generic.patch | 91 ++++++++++++++----- 1 file changed, 69 insertions(+), 22 deletions(-) diff --git a/patches/linux-2.6.16.29/xenoprof-generic.patch b/patches/linux-2.6.16.29/xenoprof-generic.patch index 6521fd7c7d..7783495f70 100644 --- a/patches/linux-2.6.16.29/xenoprof-generic.patch +++ b/patches/linux-2.6.16.29/xenoprof-generic.patch @@ -1,6 +1,6 @@ diff -pruN ../orig-linux-2.6.16.29/drivers/oprofile/buffer_sync.c ./drivers/oprofile/buffer_sync.c ---- ../orig-linux-2.6.16.29/drivers/oprofile/buffer_sync.c 2006-09-12 19:02:10.000000000 +0100 -+++ ./drivers/oprofile/buffer_sync.c 2006-09-19 14:06:05.000000000 +0100 +--- ../orig-linux-2.6.16.29/drivers/oprofile/buffer_sync.c 2006-11-06 14:46:52.000000000 -0800 ++++ ./drivers/oprofile/buffer_sync.c 2006-11-06 15:16:52.000000000 -0800 @@ -6,6 +6,10 @@ * * @author John Levon @@ -12,7 +12,27 @@ diff -pruN ../orig-linux-2.6.16.29/drivers/oprofile/buffer_sync.c ./drivers/opro * This is the core of the buffer management. Each * CPU buffer is processed and entered into the * global event buffer. Such processing is necessary -@@ -275,15 +279,31 @@ static void add_cpu_switch(int i) +@@ -38,6 +42,7 @@ static cpumask_t marked_cpus = CPU_MASK_ + static DEFINE_SPINLOCK(task_mortuary); + static void process_task_mortuary(void); + ++static int cpu_current_domain[NR_CPUS]; + + /* Take ownership of the task struct and place it on the + * list for processing. Only after two full buffer syncs +@@ -146,6 +151,11 @@ static void end_sync(void) + int sync_start(void) + { + int err; ++ int i; ++ ++ for (i = 0; i < NR_CPUS; i++) { ++ cpu_current_domain[i] = COORDINATOR_DOMAIN; ++ } + + start_cpu_work(); + +@@ -275,15 +285,31 @@ static void add_cpu_switch(int i) last_cookie = INVALID_COOKIE; } @@ -50,7 +70,7 @@ diff -pruN ../orig-linux-2.6.16.29/drivers/oprofile/buffer_sync.c ./drivers/opro static void add_user_ctx_switch(struct task_struct const * task, unsigned long cookie) { -@@ -348,9 +368,9 @@ static int add_us_sample(struct mm_struc +@@ -348,9 +374,9 @@ static int add_us_sample(struct mm_struc * for later lookup from userspace. */ static int @@ -62,7 +82,7 @@ diff -pruN ../orig-linux-2.6.16.29/drivers/oprofile/buffer_sync.c ./drivers/opro add_sample_entry(s->eip, s->event); return 1; } else if (mm) { -@@ -496,10 +516,11 @@ void sync_buffer(int cpu) +@@ -496,15 +522,21 @@ void sync_buffer(int cpu) struct mm_struct *mm = NULL; struct task_struct * new; unsigned long cookie = 0; @@ -75,7 +95,17 @@ diff -pruN ../orig-linux-2.6.16.29/drivers/oprofile/buffer_sync.c ./drivers/opro down(&buffer_sem); -@@ -512,16 +533,18 @@ void sync_buffer(int cpu) + add_cpu_switch(cpu); + ++ /* We need to assign the first samples in this CPU buffer to the ++ same domain that we were processing at the last sync_buffer */ ++ if (cpu_current_domain[cpu] != COORDINATOR_DOMAIN) { ++ add_domain_switch(cpu_current_domain[cpu]); ++ } + /* Remember, only we can modify tail_pos */ + + available = get_slots(cpu_buf); +@@ -512,16 +544,18 @@ void sync_buffer(int cpu) for (i = 0; i < available; ++i) { struct op_sample * s = &cpu_buf->buffer[cpu_buf->tail_pos]; @@ -99,7 +129,7 @@ diff -pruN ../orig-linux-2.6.16.29/drivers/oprofile/buffer_sync.c ./drivers/opro } else { struct mm_struct * oldmm = mm; -@@ -535,11 +558,16 @@ void sync_buffer(int cpu) +@@ -535,11 +569,21 @@ void sync_buffer(int cpu) add_user_ctx_switch(new, cookie); } } else { @@ -109,10 +139,15 @@ diff -pruN ../orig-linux-2.6.16.29/drivers/oprofile/buffer_sync.c ./drivers/opro - state = sb_bt_ignore; - atomic_inc(&oprofile_stats.bt_lost_no_mapping); + if (domain_switch) { ++ cpu_current_domain[cpu] = s->eip; + add_domain_switch(s->eip); + domain_switch = 0; + } else { -+ if (state >= sb_bt_start && ++ if (cpu_current_domain[cpu] != ++ COORDINATOR_DOMAIN) { ++ add_sample_entry(s->eip, s->event); ++ } ++ else if (state >= sb_bt_start && + !add_sample(mm, s, cpu_mode)) { + if (state == sb_bt_start) { + state = sb_bt_ignore; @@ -121,9 +156,21 @@ diff -pruN ../orig-linux-2.6.16.29/drivers/oprofile/buffer_sync.c ./drivers/opro } } } +@@ -548,6 +592,11 @@ void sync_buffer(int cpu) + } + release_mm(mm); + ++ /* We reset domain to COORDINATOR at each CPU switch */ ++ if (cpu_current_domain[cpu] != COORDINATOR_DOMAIN) { ++ add_domain_switch(COORDINATOR_DOMAIN); ++ } ++ + mark_done(cpu); + + up(&buffer_sem); diff -pruN ../orig-linux-2.6.16.29/drivers/oprofile/cpu_buffer.c ./drivers/oprofile/cpu_buffer.c ---- ../orig-linux-2.6.16.29/drivers/oprofile/cpu_buffer.c 2006-09-12 19:02:10.000000000 +0100 -+++ ./drivers/oprofile/cpu_buffer.c 2006-09-19 14:06:05.000000000 +0100 +--- ../orig-linux-2.6.16.29/drivers/oprofile/cpu_buffer.c 2006-11-06 14:46:52.000000000 -0800 ++++ ./drivers/oprofile/cpu_buffer.c 2006-11-06 14:47:55.000000000 -0800 @@ -6,6 +6,10 @@ * * @author John Levon @@ -233,8 +280,8 @@ diff -pruN ../orig-linux-2.6.16.29/drivers/oprofile/cpu_buffer.c ./drivers/oprof * This serves to avoid cpu buffer overflow, and makes sure * the task mortuary progresses diff -pruN ../orig-linux-2.6.16.29/drivers/oprofile/cpu_buffer.h ./drivers/oprofile/cpu_buffer.h ---- ../orig-linux-2.6.16.29/drivers/oprofile/cpu_buffer.h 2006-09-12 19:02:10.000000000 +0100 -+++ ./drivers/oprofile/cpu_buffer.h 2006-09-19 14:06:05.000000000 +0100 +--- ../orig-linux-2.6.16.29/drivers/oprofile/cpu_buffer.h 2006-11-06 14:46:52.000000000 -0800 ++++ ./drivers/oprofile/cpu_buffer.h 2006-11-06 14:47:55.000000000 -0800 @@ -36,7 +36,7 @@ struct oprofile_cpu_buffer { volatile unsigned long tail_pos; unsigned long buffer_size; @@ -258,8 +305,8 @@ diff -pruN ../orig-linux-2.6.16.29/drivers/oprofile/cpu_buffer.h ./drivers/oprof #endif /* OPROFILE_CPU_BUFFER_H */ diff -pruN ../orig-linux-2.6.16.29/drivers/oprofile/event_buffer.h ./drivers/oprofile/event_buffer.h ---- ../orig-linux-2.6.16.29/drivers/oprofile/event_buffer.h 2006-09-12 19:02:10.000000000 +0100 -+++ ./drivers/oprofile/event_buffer.h 2006-09-19 14:06:05.000000000 +0100 +--- ../orig-linux-2.6.16.29/drivers/oprofile/event_buffer.h 2006-11-06 14:46:52.000000000 -0800 ++++ ./drivers/oprofile/event_buffer.h 2006-11-06 14:47:55.000000000 -0800 @@ -29,15 +29,20 @@ void wake_up_buffer_waiter(void); #define CPU_SWITCH_CODE 2 #define COOKIE_SWITCH_CODE 3 @@ -283,8 +330,8 @@ diff -pruN ../orig-linux-2.6.16.29/drivers/oprofile/event_buffer.h ./drivers/opr void add_event_entry(unsigned long data); diff -pruN ../orig-linux-2.6.16.29/drivers/oprofile/oprof.c ./drivers/oprofile/oprof.c ---- ../orig-linux-2.6.16.29/drivers/oprofile/oprof.c 2006-09-12 19:02:10.000000000 +0100 -+++ ./drivers/oprofile/oprof.c 2006-09-19 14:06:05.000000000 +0100 +--- ../orig-linux-2.6.16.29/drivers/oprofile/oprof.c 2006-11-06 14:46:52.000000000 -0800 ++++ ./drivers/oprofile/oprof.c 2006-11-06 14:47:55.000000000 -0800 @@ -5,6 +5,10 @@ * @remark Read the file COPYING * @@ -339,8 +386,8 @@ diff -pruN ../orig-linux-2.6.16.29/drivers/oprofile/oprof.c ./drivers/oprofile/o { int err; diff -pruN ../orig-linux-2.6.16.29/drivers/oprofile/oprof.h ./drivers/oprofile/oprof.h ---- ../orig-linux-2.6.16.29/drivers/oprofile/oprof.h 2006-09-12 19:02:10.000000000 +0100 -+++ ./drivers/oprofile/oprof.h 2006-09-19 14:06:05.000000000 +0100 +--- ../orig-linux-2.6.16.29/drivers/oprofile/oprof.h 2006-11-06 14:46:52.000000000 -0800 ++++ ./drivers/oprofile/oprof.h 2006-11-06 14:47:55.000000000 -0800 @@ -35,5 +35,8 @@ void oprofile_create_files(struct super_ void oprofile_timer_init(struct oprofile_operations * ops); @@ -351,8 +398,8 @@ diff -pruN ../orig-linux-2.6.16.29/drivers/oprofile/oprof.h ./drivers/oprofile/o #endif /* OPROF_H */ diff -pruN ../orig-linux-2.6.16.29/drivers/oprofile/oprofile_files.c ./drivers/oprofile/oprofile_files.c ---- ../orig-linux-2.6.16.29/drivers/oprofile/oprofile_files.c 2006-09-12 19:02:10.000000000 +0100 -+++ ./drivers/oprofile/oprofile_files.c 2006-09-19 14:06:05.000000000 +0100 +--- ../orig-linux-2.6.16.29/drivers/oprofile/oprofile_files.c 2006-11-06 14:46:52.000000000 -0800 ++++ ./drivers/oprofile/oprofile_files.c 2006-11-06 14:47:55.000000000 -0800 @@ -5,15 +5,21 @@ * @remark Read the file COPYING * @@ -581,8 +628,8 @@ diff -pruN ../orig-linux-2.6.16.29/drivers/oprofile/oprofile_files.c ./drivers/o oprofilefs_create_ulong(sb, root, "buffer_size", &fs_buffer_size); oprofilefs_create_ulong(sb, root, "buffer_watershed", &fs_buffer_watershed); diff -pruN ../orig-linux-2.6.16.29/include/linux/oprofile.h ./include/linux/oprofile.h ---- ../orig-linux-2.6.16.29/include/linux/oprofile.h 2006-09-12 19:02:10.000000000 +0100 -+++ ./include/linux/oprofile.h 2006-09-19 14:06:05.000000000 +0100 +--- ../orig-linux-2.6.16.29/include/linux/oprofile.h 2006-11-06 14:46:42.000000000 -0800 ++++ ./include/linux/oprofile.h 2006-11-06 14:47:55.000000000 -0800 @@ -16,6 +16,8 @@ #include #include From de083f66489c77d3f8fc6934cf96f23b7d43eaf8 Mon Sep 17 00:00:00 2001 From: "kfraser@localhost.localdomain" Date: Thu, 9 Nov 2006 12:07:28 +0000 Subject: [PATCH 2/2] [BLK] Expand number of fake-SCSI VBD volumes supported to 120. Signed-off-by: Takanori Kasai Signed-off-by: Tomonari Horikoshi Signed-off-by: Tsunehisa Doi --- .../drivers/xen/blkfront/vbd.c | 46 ++++++++++++++----- tools/python/xen/util/blkif.py | 11 ++++- 2 files changed, 43 insertions(+), 14 deletions(-) diff --git a/linux-2.6-xen-sparse/drivers/xen/blkfront/vbd.c b/linux-2.6-xen-sparse/drivers/xen/blkfront/vbd.c index 0c8b508c9a..bbb16a956e 100644 --- a/linux-2.6-xen-sparse/drivers/xen/blkfront/vbd.c +++ b/linux-2.6-xen-sparse/drivers/xen/blkfront/vbd.c @@ -50,7 +50,7 @@ */ #define NUM_IDE_MAJORS 10 -#define NUM_SCSI_MAJORS 9 +#define NUM_SCSI_MAJORS 17 #define NUM_VBD_MAJORS 1 static struct xlbd_type_info xlbd_ide_type = { @@ -165,8 +165,11 @@ xlbd_get_major_info(int vdevice) case SCSI_DISK1_MAJOR ... SCSI_DISK7_MAJOR: index = 11 + major - SCSI_DISK1_MAJOR; break; - case SCSI_CDROM_MAJOR: index = 18; break; - default: index = 19; break; + case SCSI_DISK8_MAJOR ... SCSI_DISK15_MAJOR: + index = 18 + major - SCSI_DISK8_MAJOR; + break; + case SCSI_CDROM_MAJOR: index = 26; break; + default: index = 27; break; } mi = ((major_info[index] != NULL) ? major_info[index] : @@ -227,6 +230,7 @@ xlvbd_alloc_gendisk(int minor, blkif_sector_t capacity, int vdevice, struct xlbd_major_info *mi; int nr_minors = 1; int err = -ENODEV; + unsigned int offset; BUG_ON(info->gd != NULL); BUG_ON(info->mi != NULL); @@ -244,15 +248,33 @@ xlvbd_alloc_gendisk(int minor, blkif_sector_t capacity, int vdevice, if (gd == NULL) goto out; - if (nr_minors > 1) - sprintf(gd->disk_name, "%s%c", mi->type->diskname, - 'a' + mi->index * mi->type->disks_per_major + - (minor >> mi->type->partn_shift)); - else - sprintf(gd->disk_name, "%s%c%d", mi->type->diskname, - 'a' + mi->index * mi->type->disks_per_major + - (minor >> mi->type->partn_shift), - minor & ((1 << mi->type->partn_shift) - 1)); + offset = mi->index * mi->type->disks_per_major + + (minor >> mi->type->partn_shift); + if (nr_minors > 1) { + if (offset < 26) { + sprintf(gd->disk_name, "%s%c", + mi->type->diskname, 'a' + offset ); + } + else { + sprintf(gd->disk_name, "%s%c%c", + mi->type->diskname, + 'a' + ((offset/26)-1), 'a' + (offset%26) ); + } + } + else { + if (offset < 26) { + sprintf(gd->disk_name, "%s%c%d", + mi->type->diskname, + 'a' + offset, + minor & ((1 << mi->type->partn_shift) - 1)); + } + else { + sprintf(gd->disk_name, "%s%c%c%d", + mi->type->diskname, + 'a' + ((offset/26)-1), 'a' + (offset%26), + minor & ((1 << mi->type->partn_shift) - 1)); + } + } gd->major = mi->major; gd->first_minor = minor; diff --git a/tools/python/xen/util/blkif.py b/tools/python/xen/util/blkif.py index 859361970c..363bd41dd2 100644 --- a/tools/python/xen/util/blkif.py +++ b/tools/python/xen/util/blkif.py @@ -23,8 +23,15 @@ def blkdev_name_to_number(name): except Exception, ex: pass - if re.match( '/dev/sd[a-p]([1-9]|1[0-5])?', n): - return 8 * 256 + 16 * (ord(n[7:8]) - ord('a')) + int(n[8:] or 0) + scsi_major = [ 8, 65, 66, 67, 68, 69, 70, 71, 128, 129, 130, 131, 132, 133, 134, 135 ] + if re.match( '/dev/sd[a-z]([1-9]|1[0-5])?$', n): + major = scsi_major[(ord(n[7:8]) - ord('a')) / 16] + minor = ((ord(n[7:8]) - ord('a')) % 16) * 16 + int(n[8:] or 0) + return major * 256 + minor + if re.match( '/dev/sd[a-i][a-z]([1-9]|1[0-5])?$', n): + major = scsi_major[((ord(n[7:8]) - ord('a') + 1) * 26 + (ord(n[8:9]) - ord('a'))) / 16 ] + minor = (((ord(n[7:8]) - ord('a') + 1 ) * 26 + (ord(n[8:9]) - ord('a'))) % 16) * 16 + int(n[9:] or 0) + return major * 256 + minor if re.match( '/dev/hd[a-t]([1-9]|[1-5][0-9]|6[0-3])?', n): ide_majors = [ 3, 22, 33, 34, 56, 57, 88, 89, 90, 91 ]