Hello,
I have pushed the v3 code into a new branch on the GIT repository. The branch is called perfmon3. And I know what you're going to ask next? How do I pull this stuff? Here is what seems to work: $ git checkout --track -b perfmon3 (after that you're in perfmon3 branch) $ git pull origin refs/heads/perfmon3 This sequence also works for people doing a straight git-clone. On Wed, Sep 24, 2008 at 2:27 AM, Robert Richter <[EMAIL PROTECTED]> wrote: > Stephane, > > could you apply your latest patch set to a perfmon3 development branch > in your git repository at kernel.org? This would make review and > testing easier. > > Thanks, > > -Robert > > On 23.09.08 23:32:24, stephane eranian wrote: >> Hello, >> >> As you may know, I have been working on redesigning the perfmon2 system call >> API to address some issues raised by the LKML review a couple of months back. >> >> I have made some good progress on this and I'd like to share the current >> design >> with you. >> >> There were three major goals in the redesign: >> >> - minimize the number of system calls. Pefmon2 v2.x has 12 syscalls. This >> was >> considered quite a lot for a single subsystem. >> >> - make sure we could extend the syscall API without necessarily >> adding new syscalls. >> That means having flexibility in each syscall and also in the >> structures passed >> in syscalls. >> >> - make sure it would be possible to use existing v2.0 (IA-64) and >> also v2.x (x>0) >> applications with, at worse, a recompilation. Unlike v2.0 (IA-64 >> single syscall API) >> the compatibility would have to be provided by user level code, >> e.g., libpfm. >> Obviously statically linked applications would have to be recompiled. >> >> I am happy to report that I has successfully fulfilled those three >> goals. Here is how >> the new API looks like now: >> >> - down to 8 system calls, all with different names from v2.81 >> - several data structures, pfarg_*, have been removed >> - full compatibility with v2.81 except for one system call >> (pfm_delete_evtsets) >> - all system calls are extensible via a flags parameter >> - all structures have reserved fields >> - the context abstraction has been replaced with the notion of a session. >> >> Here are the details: >> >> I) session creation >> >> With v2.81: >> int pfm_create_context(pfarg_ctx_t *ctx, char *smpl_name, void >> *smpl_arg, size_t smpl_size); >> >> With v3.0: >> int pfm_create_session(int flags); >> int pfm_create_session(int flags, char *smpl_name, void >> *smpl_arg, size_t smpl_size); >> >> New Flags: >> PFM_FL_SMPL_FMT : indicate using sampling format and >> that 3 additional parameters are passed >> >> The pfarg_ctx_t structure has been abandoned. The flags parameter is >> used very much like for the open(2) >> syscall to indicate that additional (optional) parameters are passed. >> >> All old flags are preserved. >> >> The call still returns the file descriptor uniquely identifying the >> session. >> >> Just like with context, a session can either be monitoring a thread or a >> CPU. >> >> II) programming the registers >> >> With v2.81: >> int pfm_write_pmcs(int fd, pfarg_pmc_t *pmds, int n); >> int pfm_write_pmds(int fd, pfarg_pmd_t *pmcs, int n); >> int pfm_read_pmds(int fd, parg_pmd_t *pmds, int n); >> >> With v3.0: >> int pfm_write_pmrs(int fd, int flags, pfarg_pmr_t *pmrs, int n); >> int pfm_write_pmrs(int fd, int flags, pfarg_pmr_t *pmrs, int n, >> pfarg_pmd_attr_t *pmas); >> >> int pfm_read_pmrs(int fd, int flags, pfarg_pmr_t *pmrs, int n); >> int pfm_read_pmrs(int fd, int flags, parg_pmr_t *pmrs, int n, >> pfarg_pmd_attr_t *pmas); >> >> New structures: >> >> typedef struct { >> u16 reg_num; >> u16 reg_set; >> u32 reg_flags; >> u64 reg_value; >> } pfarg_pmr_t; >> >> typedef struct { >> u64 reg_long_reset; >> u64 reg_short_reset; >> u64 reg_random_mask; >> u64 reg_smpl_pmds[PFM_PMD_BV]; >> u64 reg_reset_pmds[PFM_PMD_BV]; >> u64 reg_ovfl_swcnt; >> u64 reg_smpl_eventid; >> u64 reg_last_value; >> u64 reg_reserved[8]; >> }; >> >> New flags: >> PFM_RWFL_PMD : pmrs contains PMD register descriptions >> PFM_RWFL_PMC : pmrs contains PMC register descriptions >> PFM_RWFL_PMD_ATTR: an additional vector is passed in pmas >> >> We now use only 2 system calls to read and write the PMU registers. >> This is possible because >> we are sharing the same register description data structure, >> pfarg_pmr_t. They key attributes >> of each register are encapsulated into this structure. Additional >> PMD attributes related to sampling >> and multiplexing are off-loaded into another optional structure, >> pfarg_pmd_attr_t. This structure >> becomes optional and is only looked at by the kernel if the >> PFM_RWFL_PMD_ATTR flag is passed. >> >> For all counting applications, using pfarg_pmr_t is enough. The nice >> side effect of this split is that >> the cost of reading and writing PMD register is now reduced because >> we have less data to copy in >> and out of the kernel. >> >> Unlike suggested by some people, I have not merged the notions of >> PMD and PMC registers. I think >> it is cleaner to separate them out. It also makes it much easier to >> provide backward compatibility with >> v2.81. >> >> III) attaching and detaching >> >> With v2.81: >> int pfm_load_context(int fd, pfarg_load_t *load); >> int pfm_unload_context(int fd); >> >> With v3.0: >> int pfm_attach_session(int fd, int flags, int target); >> int pfm_detach_session(int fd, int flags); >> >> The pfarg_load_t structure has been abandoned. The information about what >> to >> attach to is passed as a parameter to the syscall in "target". It >> can either be >> a thread id or a CPU id. >> >> There are currently no flags defined for either call. >> >> Note that we have lost the ability to specify which event set is >> to be activated first. >> There was no actual use of this option anyway. >> >> IV) starting and stopping >> >> With v2.81: >> int pfm_start(int fd, pfarg_start_t *st); >> int pfm_stop(int fd); >> int pfm_restart(int fd); >> >> With v3.0: >> int pfm_start_session(int fd, int flags); >> int pfm_stop_session(int fd, int flags); >> >> New flags: >> PFM_STFL_RESTART: resume monitoring after an overflow notification >> >> The pfarg_start_t structure has been abandoned. >> >> The pfm_restart() syscall has been merged with pfm_start() by >> using the PFM_STFL_RESTART >> flag. It is not possible to just use pfm_start_session() and >> internally determine what to do because >> this is dependent on the sampling format. >> >> We have lost the ability to specify on which event set to >> start. I don't think this option was ever >> used. >> >> V) event set and multiplexing >> >> With v2.81: >> int pfm_create_evtsets(int fd, pfarg_setdesc_t *s, int n); >> int pfm_getinfo_evtsets(int fd, pfarg_setinfo_t *s, int n); >> int pfm_delete_evtsets(int fd, pfarg_setdesc_t *s, int n); >> >> With v3.0: >> int pfm_create_sets(int fd, int flags, pfarg_setdesc_t *s, int n); >> int pfm_getinfo_evtsets(int fd, int flags, pfarg_setinfo_t *s, int >> n); >> >> We have kept the same data structures and simply added a flags >> parameters to provide >> for extensibility of the calls. >> >> We have removed pfm_delete_evtsets() because it was not used by a >> lot of applications. >> We could add it back later if there is a good reason for it, >> something stronger than saying >> it needs to be there for symmetry. >> >> VI) libpfm >> >> The libpfm library will support v2.81 and v3.0 transparently. The >> examples have all been rewritten >> to the new API. The v2.81 examples are still there for testing >> and comparison purposes. They >> compile with no modifications. >> >> The perfmon.h header has been strongly restructured to accomodate >> v3.0, v2.81 and older v2.x >> releases as used by Cray and SiCortex or even older v2.0 IA-64 programs. >> >> When using a the v2.81 API, the library is able to adapt based on >> the host kernel perfmon version. >> If the host kernel is using v2.81 then the calls are simply >> passed through. If instead, the kernel >> uses v3.0, then each v2.81 call is mapped onto its equivalent >> v3.0 whenever possible. If the >> syscall has no equivalent, e.g., pfm_delete_evtsets(), then an >> error is returned. The errno >> value is updated correctly when using v2.81 <-> v3.0 glue layer. >> >> VII) conclusions >> >> There are no other modifications to other parts of the API. >> >> I think this ultimate modification addresses ALL outstanding >> issues raised by LKML. >> >> I have presented the new API for a fully featured perfmon, with >> sampling, system-wide and multiplexing. >> This is not what is going to go into the mainline kernel >> initially. The plan is to use this as the development >> code and pull bits and pieces into the minimal kernel patch that >> I maintain separately and which is >> what I intend to post to LKML. The reason I modified the fully >> featured version is to gauge all the changes >> needed and their potential connections. >> >> I will soon, create branches on both the GIT tree, libpfm CVS so >> that you will be able to experiment with this >> API. The v3.0 has been added to all architectures currently >> supported. They all compile. I was not able to >> tests many of them for lack of hardware. >> >> I welcome any comments you may have about this new API. >> >> S.Eranian >> >> Thanks. >> >> ------------------------------------------------------------------------- >> This SF.Net email is sponsored by the Moblin Your Move Developer's challenge >> Build the coolest Linux based applications with Moblin SDK & win great prizes >> Grand prize is a trip for two to an Open Source event anywhere in the world >> http://moblin-contest.org/redirect.php?banner_id=100&url=/ >> _______________________________________________ >> perfmon2-devel mailing list >> perfmon2-devel@lists.sourceforge.net >> https://lists.sourceforge.net/lists/listinfo/perfmon2-devel >> > > -- > Advanced Micro Devices, Inc. > Operating System Research Center > email: [EMAIL PROTECTED] > > ------------------------------------------------------------------------- This SF.Net email is sponsored by the Moblin Your Move Developer's challenge Build the coolest Linux based applications with Moblin SDK & win great prizes Grand prize is a trip for two to an Open Source event anywhere in the world http://moblin-contest.org/redirect.php?banner_id=100&url=/ _______________________________________________ perfmon2-devel mailing list perfmon2-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/perfmon2-devel