Re: [PATCH 02/22] 2.6.22-rc3 perfmon2 : generic kernelmodifications

From: David Rientjes
Date: Mon Jun 04 2007 - 11:18:55 EST


On Tue, 29 May 2007, Stephane Eranian wrote:

> Only in linux-2.6.22/Documentation: perfmon2.txt

You need to send -N to diff(1) so this and perfmon.h, perfmon_dfl_smpl.h,
perfmon_fmt.h, and perfmon_pmu.h will be included in the patch. A
patchset should compile and work correctly at any time when each patch is
applied consecutively. Providing perfmon.h, for example, in patch 13
doesn't allow individual testing of all prior patches.

> diff --exclude=.git -urp --exclude-from=/tmp/excl315935 linux-2.6.22.base/Makefile linux-2.6.22/Makefile
> --- linux-2.6.22.base/Makefile 2007-05-29 03:17:15.000000000 -0700
> +++ linux-2.6.22/Makefile 2007-05-29 03:24:14.000000000 -0700
> @@ -553,7 +553,7 @@ export mod_strip_cmd
>
>
> ifeq ($(KBUILD_EXTMOD),)
> -core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/
> +core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/ perfmon/
>
> vmlinux-dirs := $(patsubst %/,%,$(filter %/, $(init-y) $(init-m) \
> $(core-y) $(core-m) $(drivers-y) $(drivers-m) \
> diff --exclude=.git -urp --exclude-from=/tmp/excl315935 linux-2.6.22.base/drivers/oprofile/oprofile_files.c linux-2.6.22/drivers/oprofile/oprofile_files.c
> --- linux-2.6.22.base/drivers/oprofile/oprofile_files.c 2007-05-29 03:17:41.000000000 -0700
> +++ linux-2.6.22/drivers/oprofile/oprofile_files.c 2007-05-29 03:24:14.000000000 -0700
> @@ -117,7 +117,17 @@ static ssize_t dump_write(struct file *
> static const struct file_operations dump_fops = {
> .write = dump_write,
> };
> -
> +
> +static ssize_t implementation(struct file * file, char __user * buf, size_t count, loff_t * offset)
> +{
> + return oprofilefs_str_to_user(oprofile_ops.implementation, buf, count, offset);
> +}
> +
> +
> +static struct file_operations implementation_fops = {
> + .read = implementation,
> +};
> +
> void oprofile_create_files(struct super_block * sb, struct dentry * root)
> {
> oprofilefs_create_file(sb, root, "enable", &enable_fops);
> @@ -127,6 +137,7 @@ void oprofile_create_files(struct super_
> oprofilefs_create_ulong(sb, root, "buffer_watershed", &fs_buffer_watershed);
> oprofilefs_create_ulong(sb, root, "cpu_buffer_size", &fs_cpu_buffer_size);
> oprofilefs_create_file(sb, root, "cpu_type", &cpu_type_fops);
> + oprofilefs_create_file(sb, root, "implementation", &implementation_fops);
> oprofilefs_create_file(sb, root, "backtrace_depth", &depth_fops);
> oprofilefs_create_file(sb, root, "pointer_size", &pointer_size_fops);
> oprofile_create_stats_files(sb, root);

The commentary for how to interpret this new file is lacking; it appears
as though it will return "timer", "oprofile", or "nmi_timer" for existing
i386 subsystems and "perfmon2" with this addition. This should be
documented.

It isn't set generically in oprofile_arch_init() for other architectures.

> diff --exclude=.git -urp --exclude-from=/tmp/excl315935 linux-2.6.22.base/drivers/oprofile/timer_int.c linux-2.6.22/drivers/oprofile/timer_int.c
> --- linux-2.6.22.base/drivers/oprofile/timer_int.c 2007-05-29 03:17:41.000000000 -0700
> +++ linux-2.6.22/drivers/oprofile/timer_int.c 2007-05-29 03:24:14.000000000 -0700
> @@ -43,4 +43,5 @@ void __init oprofile_timer_init(struct o
> ops->start = timer_start;
> ops->stop = timer_stop;
> ops->cpu_type = "timer";
> + ops->implementation = "timer";
> }
> diff --exclude=.git -urp --exclude-from=/tmp/excl315935 linux-2.6.22.base/include/linux/oprofile.h linux-2.6.22/include/linux/oprofile.h
> --- linux-2.6.22.base/include/linux/oprofile.h 2007-05-29 03:17:57.000000000 -0700
> +++ linux-2.6.22/include/linux/oprofile.h 2007-05-29 03:24:14.000000000 -0700
> @@ -39,6 +39,8 @@ struct oprofile_operations {
> void (*backtrace)(struct pt_regs * const regs, unsigned int depth);
> /* CPU identification string. */
> char * cpu_type;
> + /* Identify method of string. */
> + char * implementation;
> };
>
> /**
> Only in linux-2.6.22/include/linux: perfmon.h
> Only in linux-2.6.22/include/linux: perfmon_dfl_smpl.h
> Only in linux-2.6.22/include/linux: perfmon_fmt.h
> Only in linux-2.6.22/include/linux: perfmon_pmu.h
> diff --exclude=.git -urp --exclude-from=/tmp/excl315935 linux-2.6.22.base/include/linux/sched.h linux-2.6.22/include/linux/sched.h
> --- linux-2.6.22.base/include/linux/sched.h 2007-05-29 03:17:57.000000000 -0700
> +++ linux-2.6.22/include/linux/sched.h 2007-05-29 03:24:14.000000000 -0700
> @@ -89,6 +89,7 @@ struct sched_param {
> struct exec_domain;
> struct futex_pi_state;
> struct bio;
> +struct pfm_context;
>
> /*
> * List of flags we want to share for kernel threads,
> @@ -1076,6 +1077,9 @@ struct task_struct {
> #ifdef CONFIG_FAULT_INJECTION
> int make_it_fail;
> #endif
> +#ifdef CONFIG_PERFMON
> + struct pfm_context *pfm_context;
> +#endif
> };
>
> static inline pid_t process_group(struct task_struct *tsk)
> diff --exclude=.git -urp --exclude-from=/tmp/excl315935 linux-2.6.22.base/include/linux/syscalls.h linux-2.6.22/include/linux/syscalls.h
> --- linux-2.6.22.base/include/linux/syscalls.h 2007-05-29 03:17:57.000000000 -0700
> +++ linux-2.6.22/include/linux/syscalls.h 2007-05-29 03:24:14.000000000 -0700
> @@ -29,6 +29,13 @@ struct msqid_ds;
> struct new_utsname;
> struct nfsctl_arg;
> struct __old_kernel_stat;
> +struct pfarg_ctx;
> +struct pfarg_pmc;
> +struct pfarg_pmd;
> +struct pfarg_start;
> +struct pfarg_load;
> +struct pfarg_setinfo;
> +struct pfarg_setdesc;
> struct pollfd;
> struct rlimit;
> struct rusage;
> @@ -611,4 +618,27 @@ asmlinkage long sys_eventfd(unsigned int
>
> int kernel_execve(const char *filename, char *const argv[], char *const envp[]);
>
> +asmlinkage long sys_pfm_create_context(struct pfarg_ctx __user *ureq,
> + void __user *uarg, size_t smpl_size);
> +asmlinkage long sys_pfm_write_pmcs(int fd, struct pfarg_pmc __user *ureq,
> + int count);
> +asmlinkage long sys_pfm_write_pmds(int fd, struct pfarg_pmd __user *ureq,
> + int count);
> +asmlinkage long sys_pfm_read_pmds(int fd, struct pfarg_pmd __user *ureq,
> + int count);
> +asmlinkage long sys_pfm_restart(int fd);
> +asmlinkage long sys_pfm_stop(int fd);
> +asmlinkage long sys_pfm_start(int fd, struct pfarg_start __user *ureq);
> +asmlinkage long sys_pfm_load_context(int fd, struct pfarg_load __user *ureq);
> +asmlinkage long sys_pfm_unload_context(int fd);
> +asmlinkage long sys_pfm_delete_evtsets(int fd,
> + struct pfarg_setinfo __user *ureq,
> + int count);
> +asmlinkage long sys_pfm_create_evtsets(int fd,
> + struct pfarg_setdesc __user *ureq,
> + int count);
> +asmlinkage long sys_pfm_getinfo_evtsets(int fd,
> + struct pfarg_setinfo __user *ureq,
> + int count);
> +
> #endif
> diff --exclude=.git -urp --exclude-from=/tmp/excl315935 linux-2.6.22.base/kernel/sched.c linux-2.6.22/kernel/sched.c
> --- linux-2.6.22.base/kernel/sched.c 2007-05-29 03:17:57.000000000 -0700
> +++ linux-2.6.22/kernel/sched.c 2007-05-29 03:24:14.000000000 -0700
> @@ -53,6 +53,7 @@
> #include <linux/kprobes.h>
> #include <linux/delayacct.h>
> #include <linux/reciprocal_div.h>
> +#include <linux/perfmon.h>

perfmon.h isn't included in this patch so the inclusion of it here is a
mystery but I suspect it's for pfm_ctxsw() later.

David
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/