rpms/oprofile/devel oprofile-0.9.3-xen.patch, NONE, 1.1 oprofile.spec, 1.65, 1.66 oprofile-0.9.1-xen.patch, 1.4, NONE
William Eden Cohen (wcohen)
fedora-extras-commits at redhat.com
Fri Jan 18 17:02:20 UTC 2008
Author: wcohen
Update of /cvs/pkgs/rpms/oprofile/devel
In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv27596
Modified Files:
oprofile.spec
Added Files:
oprofile-0.9.3-xen.patch
Removed Files:
oprofile-0.9.1-xen.patch
Log Message:
* Fri Jan 18 2008 Will Cohen <wcohen at redhat.com> - 0.9.3-15
- Deal with xenoprof conlficts with cell. Resolves: rhbz #250852
oprofile-0.9.3-xen.patch:
--- NEW FILE oprofile-0.9.3-xen.patch ---
diff -Naur oprofile-0.9.3/daemon/init.c oprofile-0.9.3-xen-r2/daemon/init.c
--- oprofile-0.9.3/daemon/init.c 2007-07-16 11:22:17.000000000 -0700
+++ oprofile-0.9.3-xen-r2/daemon/init.c 2007-07-30 10:28:09.000000000 -0700
@@ -226,6 +226,8 @@
opd_create_vmlinux(vmlinux, kernel_range);
opd_create_xen(xenimage, xen_range);
+ if (xen_passive_setup)
+ opd_create_passive(xen_passive_setup);
opd_buf_size = opd_read_fs_int("/dev/oprofile/", "buffer_size", 1);
kernel_pointer_size = opd_read_fs_int("/dev/oprofile/", "pointer_size", 1);
diff -Naur oprofile-0.9.3/daemon/opd_interface.h oprofile-0.9.3-xen-r2/daemon/opd_interface.h
--- oprofile-0.9.3/daemon/opd_interface.h 2007-07-16 11:22:17.000000000 -0700
+++ oprofile-0.9.3-xen-r2/daemon/opd_interface.h 2007-12-20 11:59:20.000000000 -0800
@@ -27,8 +27,19 @@
/* Code 9 used to be TRACE_END_CODE which is not used anymore */
/* Code 9 is now considered an unknown escape code */
#define XEN_ENTER_SWITCH_CODE 10
+/*
+ * Ugly work-around for the unfortunate collision between Xenoprof's
+ * DOMAIN_SWITCH_CODE (in use on x86 and ia64) and Cell's SPU_PROFILING_CODE
+ * (in use with Power):
+ */
+#if defined(__i386__) || defined(__x86_64__) || defined(__ia64__)
+#define DOMAIN_SWITCH_CODE 11
+#define LAST_CODE 12
+#else
#define SPU_PROFILING_CODE 11
#define SPU_CTX_SWITCH_CODE 12
-#define LAST_CODE 13
+#define DOMAIN_SWITCH_CODE 13
+#define LAST_CODE 14
+#endif
#endif /* OPD_INTERFACE_H */
diff -Naur oprofile-0.9.3/daemon/opd_kernel.c oprofile-0.9.3-xen-r2/daemon/opd_kernel.c
--- oprofile-0.9.3/daemon/opd_kernel.c 2007-07-16 11:22:17.000000000 -0700
+++ oprofile-0.9.3-xen-r2/daemon/opd_kernel.c 2007-08-02 09:46:27.000000000 -0700
@@ -34,11 +34,22 @@
static struct kernel_image xen_image;
+static struct kernel_image xen_image_anon;
+static struct kernel_image vmlinux_image_anon;
+
+static LIST_HEAD(passive_vmlinux);
+static LIST_HEAD(passive_xen);
+static LIST_HEAD(passive_apps);
+static LIST_HEAD(passive_modules);
+static LIST_HEAD(passive_xen_anon);
+
void opd_create_vmlinux(char const * name, char const * arg)
{
/* vmlinux is *not* on the list of modules */
list_init(&vmlinux_image.list);
+ list_init(&vmlinux_image_anon.list);
+
/* for no vmlinux */
if (no_vmlinux) {
vmlinux_image.name = "no-vmlinux";
@@ -57,13 +68,22 @@
vmlinux_image.start, vmlinux_image.end);
exit(EXIT_FAILURE);
}
+
+ vmlinux_image_anon.name = "vmlinux-unknown";
+ vmlinux_image_anon.start = vmlinux_image.start;
+ vmlinux_image_anon.end = vmlinux_image.end;
+
}
void opd_create_xen(char const * name, char const * arg)
{
+ int stat;
+
/* xen is *not* on the list of modules */
list_init(&xen_image.list);
+ list_init(&xen_image_anon.list);
+
/* for no xen */
if (no_xen) {
xen_image.name = "no-xen";
@@ -72,18 +92,106 @@
xen_image.name = xstrdup(name);
- sscanf(arg, "%llx,%llx", &xen_image.start, &xen_image.end);
+ stat = sscanf(arg, "%llx,%llx", &xen_image.start, &xen_image.end);
+
+ xen_image_anon.name = "xen-unknown";
+ xen_image_anon.start = xen_image.start;
+ xen_image_anon.end = xen_image.end;
verbprintf(vmisc, "xen_start = %llx, xen_end = %llx\n",
xen_image.start, xen_image.end);
- if (!xen_image.start && !xen_image.end) {
+ if ( stat != 2 ) {
fprintf(stderr, "error: mis-parsed xen range: %llx-%llx\n",
xen_image.start, xen_image.end);
exit(EXIT_FAILURE);
}
+
}
+void opd_create_passive_domain(int id, char const * image_kernel,
+ char const * range, char const * image_xen)
+{
+ char file[64];
+ struct kernel_image * image;
+ int stat;
+
+ image = xmalloc(sizeof(struct kernel_image));
+ image->name = xstrdup(image_kernel);
+ image->start = image->end = 0;
+ stat = sscanf(range, "%llx,%llx", &image->start, &image->end);
+ image->id = id;
+ list_add(&image->list, &passive_vmlinux);
+
+ if ( stat != 2 ) {
+ fprintf(stderr, "error: mis-parsed passive domain range for "
+ "domain %d: %llx-%llx\n", id, image->start, image->end);
+ exit(EXIT_FAILURE);
+ }
+
+ image = xmalloc(sizeof(struct kernel_image));
+ image->name = xstrdup(image_xen);
+ image->start = xen_image.start;
+ image->end = xen_image.end;
+ image->id = id;
+ list_add(&image->list, &passive_xen);
+
+ sprintf(file, "domain%d-apps", id);
+ image = xmalloc(sizeof(struct kernel_image));
+ image->name = xstrdup(file);
+ image->start = 0;
+ image->end = 0;
+ image->id = id;
+ list_add(&image->list, &passive_apps);
+
+ sprintf(file, "domain%d-modules", id);
+ image = xmalloc(sizeof(struct kernel_image));
+ image->name = xstrdup(file);
+ image->start = 0;
+ image->end = 0;
+ stat = sscanf(range, "%llx,%llx", &image->start, &image->end);
+ image->id = id;
+ list_add(&image->list, &passive_modules);
+
+ sprintf(file, "domain%d-xen-unknown", id);
+ image = xmalloc(sizeof(struct kernel_image));
+ image->name = xstrdup(file);
+ image->start = xen_image.start;
+ image->end = xen_image.end;
+ image->id = id;
+ list_add(&image->list, &passive_xen_anon);
+
+}
+
+void opd_create_passive(char const *setup_file)
+{
+ FILE *fp;
+ int id=0;
+ char image_kernel[128+1];
+ char range[128+1];
+ char image_xen[128+1];
+ int stat;
+
+ image_kernel[0] = range[0] = image_xen[0] = 0;
+
+ fp = fopen(setup_file, "r");
+
+ if (!fp) {
+ fprintf(stderr, "error: Could not open Xen passive domain "
+ "setup file %s\n", setup_file);
+ exit(EXIT_FAILURE);
+ }
+
+ while (1) {
+ stat = fscanf(fp, "%d %128s %128s %128s", &id, image_kernel, range,
+ image_xen);
+ if ( stat != 4 )
+ return;
+ opd_create_passive_domain(id, image_kernel, range, image_xen);
+ }
+
+ fclose(fp);
+}
/**
* Allocate and initialise a kernel image description
@@ -210,6 +318,75 @@
struct list_head * pos;
struct kernel_image * image = &vmlinux_image;
+ if (current_domain != COORDINATOR_DOMAIN) {
+ /* we rely on cpu_mode value (i.e. trans->in_kernel)
+ * to search the right image type: xen, kernel or user
+ * We cannot use address ranges since hypervisor does not
+ * share the same address space with fully virtualized guests,
+ * and thus address ranges can overlap */
+ switch ( trans->in_kernel ) {
+
+ /* user mode */
+ case 1:
+ list_for_each(pos, &passive_apps) {
+ image = list_entry(pos, struct kernel_image, list);
+ if (image->id == current_domain)
+ return image;
+ }
+ return NULL;
+
+ /* kernel mode */
+ case 2:
+ list_for_each(pos, &passive_vmlinux) {
+ image = list_entry(pos, struct kernel_image, list);
+ if ( (image->id == current_domain)
+ && ( (image->start == 0 && image->end == 0)
+ || (image->start <= trans->pc
+ && image->end > trans->pc) ) )
+ return image;
+ }
+ /* if not in kernel image range then it should be a module */
+ list_for_each(pos, &passive_modules) {
+ image = list_entry(pos, struct kernel_image, list);
+ if (image->id == current_domain)
+ return image;
+ }
+ /* This should not happen if the kernel and user level
+ oprofile code are sane and in sync */
+ return NULL;
+
+ /* hypervisor mode */
+ case 3:
+ list_for_each(pos, &passive_xen) {
+ image = list_entry(pos, struct kernel_image, list);
+ if (image->id == current_domain
+ && image->start <= trans->pc
+ && image->end > trans->pc)
+ return image;
+ }
+ list_for_each(pos, &passive_xen_anon) {
+ image = list_entry(pos, struct kernel_image, list);
+ if (image->id == current_domain)
+ return image;
+ }
+ return NULL;
+
+ default:
+ printf("Unexpected error on passive mode: CPU mode is "
+ "%d for domain %d\n", trans->in_kernel, current_domain);
+ return NULL;
+ }
+
+
+ }
+
+ if (xen_image.start <= trans->pc && xen_image.end > trans->pc)
+ return &xen_image;
+
+ if (trans->in_kernel == 2) {
+ return &xen_image_anon;
+ }
+
if (no_vmlinux)
return image;
@@ -222,8 +399,5 @@
return image;
}
- if (xen_image.start <= trans->pc && xen_image.end > trans->pc)
- return &xen_image;
-
- return NULL;
+ return &vmlinux_image_anon;
}
diff -Naur oprofile-0.9.3/daemon/opd_kernel.h oprofile-0.9.3-xen-r2/daemon/opd_kernel.h
--- oprofile-0.9.3/daemon/opd_kernel.h 2007-07-16 11:22:17.000000000 -0700
+++ oprofile-0.9.3-xen-r2/daemon/opd_kernel.h 2007-07-30 10:28:09.000000000 -0700
@@ -23,8 +23,12 @@
/** create the kernel image */
void opd_create_vmlinux(char const * name, char const * arg);
+/** create Xen image */
void opd_create_xen(char const * name, char const * arg);
+/** create Xen passive domain images */
+void opd_create_passive(char const *setup_file);
+
/** opd_reread_module_info - parse /proc/modules for kernel modules */
void opd_reread_module_info(void);
@@ -33,6 +37,7 @@
char * name;
vma_t start;
vma_t end;
+ int id;
struct list_head list;
};
diff -Naur oprofile-0.9.3/daemon/opd_perfmon.c oprofile-0.9.3-xen-r2/daemon/opd_perfmon.c
--- oprofile-0.9.3/daemon/opd_perfmon.c 2007-07-16 11:22:17.000000000 -0700
+++ oprofile-0.9.3-xen-r2/daemon/opd_perfmon.c 2007-12-20 12:07:50.000000000 -0800
@@ -380,6 +380,7 @@
close(child->up_pipe[1]);
}
+static struct child* xen_ctx;
void perfmon_init(void)
{
@@ -389,6 +390,24 @@
if (cpu_type == CPU_TIMER_INT)
return;
+ if (!no_xen) {
+ xen_ctx = xmalloc(sizeof(struct child));
+ xen_ctx->pid = getpid();
+ xen_ctx->up_pipe[0] = -1;
+ xen_ctx->up_pipe[1] = -1;
+ xen_ctx->sigusr1 = 0;
+ xen_ctx->sigusr2 = 0;
+ xen_ctx->sigterm = 0;
+
+ create_context(xen_ctx);
+
+ write_pmu(xen_ctx);
+
+ load_context(xen_ctx);
+ return;
+ }
+
+
nr = sysconf(_SC_NPROCESSORS_ONLN);
if (nr == -1) {
fprintf(stderr, "Couldn't determine number of CPUs.\n");
@@ -431,6 +450,9 @@
if (cpu_type == CPU_TIMER_INT)
return;
+ if (!no_xen)
+ return;
+
for (i = 0; i < nr_cpus; ++i) {
kill(children[i].pid, SIGKILL);
waitpid(children[i].pid, NULL, 0);
@@ -445,6 +467,11 @@
if (cpu_type == CPU_TIMER_INT)
return;
+ if (!no_xen) {
+ perfmon_start_child(xen_ctx->ctx_fd);
+ return;
+ }
+
for (i = 0; i < nr_cpus; ++i)
kill(children[i].pid, SIGUSR1);
}
@@ -457,6 +484,11 @@
if (cpu_type == CPU_TIMER_INT)
return;
+ if (!no_xen) {
+ perfmon_stop_child(xen_ctx->ctx_fd);
+ return;
+ }
+
for (i = 0; i < nr_cpus; ++i)
kill(children[i].pid, SIGUSR2);
}
diff -Naur oprofile-0.9.3/daemon/opd_sfile.c oprofile-0.9.3-xen-r2/daemon/opd_sfile.c
--- oprofile-0.9.3/daemon/opd_sfile.c 2007-07-16 11:22:17.000000000 -0700
+++ oprofile-0.9.3-xen-r2/daemon/opd_sfile.c 2007-07-30 10:28:09.000000000 -0700
@@ -234,7 +234,7 @@
}
/* we might need a kernel image start/end to hash on */
- if (trans->in_kernel) {
+ else if (trans->in_kernel) {
ki = find_kernel_image(trans);
if (!ki) {
verbprintf(vsamples, "Lost kernel sample %llx\n", trans->pc);
diff -Naur oprofile-0.9.3/daemon/opd_trans.c oprofile-0.9.3-xen-r2/daemon/opd_trans.c
--- oprofile-0.9.3/daemon/opd_trans.c 2007-07-16 11:22:17.000000000 -0700
+++ oprofile-0.9.3-xen-r2/daemon/opd_trans.c 2007-12-20 12:03:23.000000000 -0800
@@ -31,6 +31,8 @@
#include <stdio.h>
#include <errno.h>
+int32_t current_domain = COORDINATOR_DOMAIN;
+
extern size_t kernel_pointer_size;
@@ -203,6 +205,9 @@
{
verbprintf(vmisc, "KERNEL_ENTER_SWITCH to kernel\n");
trans->in_kernel = 1;
+ /* if in passive domain mode cpu mode should be incremented */
+ if (current_domain != COORDINATOR_DOMAIN)
+ trans->in_kernel++;
clear_trans_current(trans);
/* subtlety: we must keep trans->cookie cached,
* even though it's meaningless for the kernel -
@@ -216,6 +221,9 @@
{
verbprintf(vmisc, "USER_ENTER_SWITCH to user-space\n");
trans->in_kernel = 0;
+ /* if in passive domain mode cpu mode should be incremented */
+ if (current_domain != COORDINATOR_DOMAIN)
+ trans->in_kernel++;
clear_trans_current(trans);
clear_trans_last(trans);
}
@@ -244,15 +252,33 @@
static void code_xen_enter(struct transient * trans)
{
verbprintf(vmisc, "XEN_ENTER_SWITCH to xen\n");
- trans->in_kernel = 1;
+ trans->in_kernel = 2;
+ /* if in passive domain mode cpu mode should be incremented */
+ if (current_domain != COORDINATOR_DOMAIN)
+ trans->in_kernel++;
trans->current = NULL;
/* subtlety: we must keep trans->cookie cached, even though it's
- * meaningless for Xen - we won't necessarily get a cookie switch
- * on Xen exit. See comments in opd_sfile.c. It seems that we can
- * get away with in_kernel = 1 as long as we supply the correct
- * Xen image, and its address range in startup find_kernel_image
- * is modified to look in the Xen image also
+ * meaningless for Xen - same reason as for kernel */
+
+}
+
+static void code_domain_switch(struct transient *trans)
+{
+ /* While processing passive domain samples we ensure (in_kernel!=0)
+ * We do this in order to ignore cookies for passive domain samples
+ * But, we have to remember the kernel value for coordinator domain,
+ * so we do the safe thing: increment when leaving the coordinator
+ * domain and decrement when returning to it
*/
+ if (current_domain == COORDINATOR_DOMAIN)
+ trans->in_kernel++;
+
+ trans->current = NULL;
+ current_domain = (int32_t) pop_buffer_value(trans);
+
+ /* If returning to coordinator domain restore the kernel value */
+ if (current_domain == COORDINATOR_DOMAIN)
+ trans->in_kernel--;
}
extern void code_spu_profiling(struct transient * trans);
@@ -271,8 +297,16 @@
&code_trace_begin,
&code_unknown,
&code_xen_enter,
+/*
+ * Ugly work-around for the unfortunate collision between Xenoprof's
+ * DOMAIN_SWITCH_CODE (in use on x86 and ia64) and Cell's SPU_PROFILING_CODE
+ * (in use with Power):
+ */
+#if !defined(__i386__) && !defined(__x86_64__) && !defined(__ia64__)
&code_spu_profiling,
&code_spu_ctx_switch,
+#endif
+ &code_domain_switch,
};
extern void (*special_processor)(struct transient *);
diff -Naur oprofile-0.9.3/daemon/opd_trans.h oprofile-0.9.3-xen-r2/daemon/opd_trans.h
--- oprofile-0.9.3/daemon/opd_trans.h 2007-07-16 11:22:17.000000000 -0700
+++ oprofile-0.9.3-xen-r2/daemon/opd_trans.h 2007-07-30 10:28:09.000000000 -0700
@@ -21,6 +21,10 @@
#include <stdint.h>
+#define COORDINATOR_DOMAIN -1
+
+extern int32_t current_domain;
+
struct sfile;
struct anon_mapping;
diff -Naur oprofile-0.9.3/daemon/oprofiled.c oprofile-0.9.3-xen-r2/daemon/oprofiled.c
--- oprofile-0.9.3/daemon/oprofiled.c 2007-07-16 11:22:17.000000000 -0700
+++ oprofile-0.9.3-xen-r2/daemon/oprofiled.c 2007-07-30 10:28:09.000000000 -0700
@@ -67,6 +67,7 @@
int no_xen;
char * xenimage;
char * xen_range;
+char * xen_passive_setup;
static char * verbose;
static char * binary_name_filter;
static char * events;
@@ -86,6 +87,7 @@
{ "xen-range", 0, POPT_ARG_STRING, &xen_range, 0, "Xen VMA range", "start-end", },
{ "xen-image", 0, POPT_ARG_STRING, &xenimage, 0, "Xen image", "file", },
{ "image", 0, POPT_ARG_STRING, &binary_name_filter, 0, "image name filter", "profile these comma separated image" },
+ { "xen-passive-setup", 0, POPT_ARG_STRING, &xen_passive_setup, 0, "Xen passive domain setup file", "filename", },
{ "separate-lib", 0, POPT_ARG_INT, &separate_lib, 0, "separate library samples for each distinct application", "[0|1]", },
{ "separate-kernel", 0, POPT_ARG_INT, &separate_kernel, 0, "separate kernel samples for each distinct application", "[0|1]", },
{ "separate-thread", 0, POPT_ARG_INT, &separate_thread, 0, "thread-profiling mode", "[0|1]" },
diff -Naur oprofile-0.9.3/daemon/oprofiled.h oprofile-0.9.3-xen-r2/daemon/oprofiled.h
--- oprofile-0.9.3/daemon/oprofiled.h 2007-07-16 11:22:17.000000000 -0700
+++ oprofile-0.9.3-xen-r2/daemon/oprofiled.h 2007-07-30 10:28:09.000000000 -0700
@@ -64,5 +64,6 @@
extern int no_xen;
extern char * xenimage;
extern char * xen_range;
+extern char * xen_passive_setup;
#endif /* OPROFILED_H */
diff -Naur oprofile-0.9.3/doc/opcontrol.1.in oprofile-0.9.3-xen-r2/doc/opcontrol.1.in
--- oprofile-0.9.3/doc/opcontrol.1.in 2007-07-16 11:22:17.000000000 -0700
+++ oprofile-0.9.3-xen-r2/doc/opcontrol.1.in 2007-07-30 10:28:09.000000000 -0700
@@ -147,12 +147,41 @@
.br
.TP
.BI "--active-domains="<list>
-List of domain ids participating in a multi-domain profiling session. If
+List of domain ids participating in a multi-domain profiling session.
+Each of the specified domains must run an instance of oprofile. The
+sequence of opcontrol commands in each domain must follow a given
+order which is specified in the oprofile user manual. If
more than one domain is specified in <list> they should be separated using
commas. This option can only be used in domain 0 which is the only domain
that can coordinate a multi-domain profiling session. Including domain 0 in
the list of active domains is optional. (e.g. --active-domains=2,5,6 and
---active-domains=0,2,5,6 are equivalent)
+--active-domains=0,2,5,6 are equivalent).
+This option can only be specified
+if --start-daemon is also specified and it is only
+valid for the current run of the oprofile daemon; e.g. the list
+of active domains is not persistent.
+.br
+.TP
+.BI "--passive-domains="<list> or "--domains="<list>
+List of domain ids to be profiled, separated by commas.
+As opposed to the --active-domains option, the domains specified with this
+option do not need to run oprofile. This makes
+profiling multiple domains easier. However, with the passive-domains option,
+samples in user level processes and kernel modules cannot be
+mapped to specific symbols and are aggregated
+under a generic class. Both --active-domains and --passive-domains
+options can be specified in the same command, but the same domain cannot be
+specified in both options. This option can only be specified if either --start
+or --start-daemon is specified on the same command and it is only valid for
+the current run of the oprofile daemon; e.g. the list of passive domains is
+not persistent.
+.br
+.TP
+.BI "--passive-images="<list> or "--domains-images="<list>
+List of kernel images associated with the domains specified in the
+--passive-domains option, also separated by commas. The association
+between the images and domains is based on the order they are
+specified in both options.
.br
.SH ENVIRONMENT
diff -Naur oprofile-0.9.3/utils/opcontrol oprofile-0.9.3-xen-r2/utils/opcontrol
--- oprofile-0.9.3/utils/opcontrol 2007-07-16 11:22:17.000000000 -0700
+++ oprofile-0.9.3-xen-r2/utils/opcontrol 2007-07-30 12:22:19.000000000 -0700
@@ -144,9 +144,16 @@
--cpu-buffer-size=num per-cpu buffer size in units (2.6 only)
--note-table-size kernel notes buffer size in notes units (2.4 only)
- --xen Xen image (for Xen only)
- --active-domains=<list> List of domains in profiling session (for Xen only)
- (list contains domain ids separated by commas)
+ --xen=file Xen image (for Xen only)
+ --active-domains=id[,ids] list of domains in multiple domain profiling session (Xen)
+ (detailed profiling of user level and kernel modules code)
+ (requires running oprofile on these domains)
+ --passive-domains=id[,ids] list of domains to be profiled (Xen).
+ or --domains=id[,ids] (coarse profiling of user level and kernel modules code)
+ (no need to run oprofile on these domains)
+ --passive-images=file[,files] list of kernel images associated with each passive domain
+ or
+ --domain-images=file[,files]
" >&2
}
@@ -289,6 +296,9 @@
SETUP_DIR="/root/.oprofile"
SETUP_FILE="$SETUP_DIR/daemonrc"
+ # location for passing info about passive domains to daemon
+ PASSIVE_SETUP_FILE="$SETUP_DIR/xendomain.setup"
+
# initialize daemon vars
decide_oprofile_device_mount
CPUTYPE=`cat $MOUNT/cpu_type`
@@ -433,7 +443,7 @@
}
-check_valid_args()
+check_valid_vmlinux()
{
if test -z "$VMLINUX"; then
echo "No vmlinux file specified. You must specify the correct vmlinux file, e.g." >&2
@@ -454,8 +464,12 @@
echo "The specified vmlinux file \"$VMLINUX\" doesn't exist." >&2
exit 1
+}
+
# similar check for Xen image
+check_valid_xen()
+{
if test -f "$XENIMAGE"; then
return
fi
@@ -511,6 +525,76 @@
fi
}
+set_passive_domain()
+{
+ DOMAIN_ID=$1
+ FILE_IMAGE=$2
+ XEN_IMAGE=$3
+
+ if test "$FILE_IMAGE" = "none"; then
+ RANGE="0,0"
+ FILE_IMAGE="domain$DOMAIN_ID-kernel"
+ else
+ # Find VMA range for passive domain kernel image
+ range_info=`objdump -h $FILE_IMAGE 2>/dev/null | grep " .text "`
+ tmp1=`echo $range_info | awk '{print $4}'`
+ tmp_length=`echo $range_info | awk '{print $3}'`
+ tmp2=`objdump -h $FILE_IMAGE --adjust-vma=0x$tmp_length 2>/dev/null | grep " .text " | awk '{print $4}'`
+
+ if test -z "$tmp1" -o -z "$tmp2"; then
+ echo "The specified file $FILE_IMAGE does not seem to be valid" >&2
+ echo "Make sure you are using the non-compressed image file (e.g. vmlinux not vmlinuz)" >&2
+ vecho "found start as \"$tmp1\", end as \"$tmp2\"" >&2
+ exit 1
+ fi
+ RANGE="`echo $tmp1`,`echo $tmp2`"
+ fi
+ echo " $DOMAIN_ID $FILE_IMAGE $RANGE $XEN_IMAGE" >> $PASSIVE_SETUP_FILE
+}
+
+
+set_passive_domain_config()
+{
+
+ create_dir "$SETUP_DIR"
+
+ touch $PASSIVE_SETUP_FILE
+ chmod 644 $PASSIVE_SETUP_FILE
+ >$PASSIVE_SETUP_FILE
+
+ NDOMAINS=`echo "$PASSIVE_DOMAINS" | awk -F',' '{print NF}'`
+
+ if test -n "$PASSIVE_IMAGES"; then
+ NIMAGES=`echo "$PASSIVE_IMAGES" | awk -F',' '{print NF}'`
+ if [ $NDOMAINS != $NIMAGES ]; then
+ echo "# of passive domains and # of passive images doesn't match." >&2
+ do_help
+ exit 1
+ fi
+
+ for (( i=1; i<=$NDOMAINS; i++ )); do
+ ID=`echo "$PASSIVE_DOMAINS" | awk -F"," '{print $'$i'}'`
+ FILE=`echo "$PASSIVE_IMAGES" | awk -F',' '{print $'$i'}'`
+ if test ! -f "$FILE"; then
+ echo "Image $FILE for passive domain $ID not found." >&2
+ return 1
+ fi
+ LNK_KERNEL=/boot/domain$ID-kernel
+ ln -sf $FILE $LNK_KERNEL
+ LNK_XEN=/boot/domain$ID-xen
+ ln -sf $XENIMAGE $LNK_XEN
+ set_passive_domain $ID $LNK_KERNEL $LNK_XEN
+ done
+ else
+ for (( i=1; i<=$NDOMAINS; i++ )); do
+ ID=`echo "$PASSIVE_DOMAINS" | awk -F"," '{print $'$i'}'`
+ LNK_XEN=/boot/domain$ID-xen
+ set_passive_domain $ID none $LNK_XEN
+ done
+
+ fi
+}
+
# validate --separate= parameters. This function is called with IFS=,
# so on each argument is splitted
@@ -825,6 +909,16 @@
ACTIVE_DOMAINS=$val
DO_SETUP=yes
;;
+ --passive-domains|--domains)
+ error_if_empty $arg $val
+ PASSIVE_DOMAINS=$val
+ DO_SETUP=yes
+ ;;
+ --passive-images|--domain-images)
+ error_if_empty $arg $val
+ PASSIVE_IMAGES=$val
+ DO_SETUP=yes
+ ;;
--note-table-size)
error_if_empty $arg $val
if test "$KERNEL_SUPPORT" = "yes"; then
@@ -897,6 +991,16 @@
exit 1
fi
fi
+
+ if test -n "$ACTIVE_DOMAINS" -a "$START_DAEMON" != "yes"; then
+ echo "Option \"--active-domains\" can only be used with option \"-start-daemon\"." >&2
+ exit 1
+ fi
+
+ if test -n "$PASSIVE_DOMAINS" -a "$START_DAEMON" != "yes" -a "$START" != "yes"; then
+ echo "Option \"--passive-domains\" or "--domains" can only be used with option \"--start-daemon\" or \"--start\"." >&2
+ exit 1
+ fi
}
@@ -1167,6 +1271,15 @@
fi
fi
+ if test -n "$PASSIVE_DOMAINS"; then
+ if test "$KERNEL_SUPPORT" = "yes"; then
+ echo $PASSIVE_DOMAINS >$MOUNT/passive_domains
+ set_passive_domain_config
+ else
+ echo "passive-domains not supported - ignored" >&2
+ fi
+ fi
+
if test $NOTE_SIZE != 0; then
set_param notesize $NOTE_SIZE
fi
@@ -1284,7 +1397,8 @@
fi
do_setup
- check_valid_args
+ check_valid_vmlinux
+ check_valid_xen
get_image_range "linux"
get_image_range "xen"
do_param_setup
@@ -1312,6 +1426,10 @@
OPD_ARGS="$OPD_ARGS --image=$IMAGE_FILTER"
fi
+ if ! test -z "$PASSIVE_DOMAINS"; then
+ OPD_ARGS="$OPD_ARGS --xen-passive-setup=$PASSIVE_SETUP_FILE"
+ fi
+
if test -n "$VERBOSE"; then
OPD_ARGS="$OPD_ARGS --verbose=$VERBOSE"
fi
@@ -1522,6 +1640,8 @@
move_and_remove $SAMPLES_DIR/current/{root}
hup_daemon
+
+ rm -f /boot/domain-*-kernel /boot/domain-*-xen
}
@@ -1552,7 +1672,8 @@
fi
if test "$SETUP" = "yes"; then
- check_valid_args
+ check_valid_vmlinux
+ check_valid_xen
do_save_setup
fi
Index: oprofile.spec
===================================================================
RCS file: /cvs/pkgs/rpms/oprofile/devel/oprofile.spec,v
retrieving revision 1.65
retrieving revision 1.66
diff -u -r1.65 -r1.66
--- oprofile.spec 18 Jan 2008 16:52:32 -0000 1.65
+++ oprofile.spec 18 Jan 2008 17:01:44 -0000 1.66
@@ -3,7 +3,7 @@
Summary: System wide profiler
Name: oprofile
Version: 0.9.3
-Release: 14%{?dist}
+Release: 15%{?dist}
License: GPL
Group: Development/System
#
@@ -12,7 +12,7 @@
Requires: which
Patch10: oprofile-0.4-guess2.patch
Patch63: oprofile-0.7-libs.patch
-Patch83: oprofile-0.9.1-xen.patch
+Patch83: oprofile-0.9.3-xen.patch
Patch92: oprofile-0.9.3-ld_options.patch
Patch93: oprofile-0.9.3-family10.patch
Patch94: oprofile-0.9.3-ranges.patch
@@ -189,6 +189,9 @@
%{_bindir}/oprof_start
%changelog
+* Fri Jan 18 2008 Will Cohen <wcohen at redhat.com> - 0.9.3-15
+- Deal with xenoprof conlficts with cell. Resolves: rhbz #250852
+
* Fri Jan 18 2008 Will Cohen <wcohen at redhat.com> - 0.9.3-14
- Bump format version. Check version properly. Resolves: rhbz #394571
--- oprofile-0.9.1-xen.patch DELETED ---
More information about the fedora-extras-commits
mailing list