Prev: i2c: Single-wire Serial Bus Interface for Qualcomm MSM chipsets
Next: [patch v2.2 4/4] [PATCH v2.1 4/4] libxt_ipvs: user-space lib for netfilter matcher xt_ipvs
From: Robert Richter on 23 Jul 2010 06:50 On 22.07.10 07:12:22, Lin Ming wrote: > Generic hardware events are exported under > /sys/devices/system/cpu/cpu0...N/events, for example > > /sys/devices/system/cpu/cpu0/events > |-- L1-dcache-load-misses > | |-- config > | `-- type The sysfs approach came up as a solution to connect to dynamically added pmus of various kind of hardware. The current mechanism using config/type style did not fit anymore because we would have to continuously extend the syscall i/f by new flags and attributes for every new event. So, the problem is not which config and type parameters to use for creating an event, we need a _different_ way for this. The config and type value you expose to sysfs are only used for setting up the syscall. So, I want to bring up my idea again here that I posted some days ago to lkml, using a unique sysfs id to specify event classes. Simply export an id (an u64), like: |-- L1-dcache-load-misses ===> event name | `-- id ===> event id .... and then extend the syscall to enable an event by its sysfs id: memset(&attr, 0, sizeof(attr)); attr.type = PERF_TYPE_SYSFS; attr.sysfs_id = sysfs_id; attr.sample_type = PERF_SAMPLE_CPU | PERF_SAMPLE_RAW; attr.config = config; ... The config value can then be (re-)used to setup this _specific_ event individually. The kernel knows the id and is able to route the event request directly to that particular pmu, something like: struct event_kobject { struct kobject *kobj; u64 id; struct pmu *pmu; struct event_kobject *next; }; struct event_kobject *eclass; eclass = find_event_kobject(id); eclass->pmu->event_init(event); .... This is very simple and flexible and solves the original problem too. (reposting my previous mail:) You still need knowledge of what the event is measuring and how it is set up or configured. Maybe the configuration may left blank if the event can be setup without it. But with this approach you can get file descriptors for every event a user may be interested in simply by looking into sysfs. For example, I was thinking of perfctr events vs. ibs events. The cpu could setup something like: /sys/devices/system/cpu/cpu0...cpuN/events/perfctr/id /sys/devices/system/cpu/cpu0...cpuN/events/ibs_op/id Both events are setup with one 64 bit config value that is basically the event's configuration msr (x86 perfctr or AMD IBS). These are definded in the hardware specifications. Its formats differ. You could then open the event file descriptor using the sysfs id and use the config value to customize the event. You don't have a complicated setup or implementation to detect which kind of event you want to use as the id indicates the type of event. Actually, we could setup e.g. also trace events with this mechanism. -Robert -- Advanced Micro Devices, Inc. Operating System Research Center -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
From: Lin Ming on 26 Jul 2010 22:20 On Fri, 2010-07-23 at 18:44 +0800, Robert Richter wrote: > On 22.07.10 07:12:22, Lin Ming wrote: > > Generic hardware events are exported under > > /sys/devices/system/cpu/cpu0...N/events, for example > > > > /sys/devices/system/cpu/cpu0/events > > |-- L1-dcache-load-misses > > | |-- config > > | `-- type > > The sysfs approach came up as a solution to connect to dynamically > added pmus of various kind of hardware. The current mechanism using > config/type style did not fit anymore because we would have to > continuously extend the syscall i/f by new flags and attributes for > every new event. So, the problem is not which config and type > parameters to use for creating an event, we need a _different_ way for > this. > > The config and type value you expose to sysfs are only used for > setting up the syscall. So, I want to bring up my idea again here that > I posted some days ago to lkml, using a unique sysfs id to specify > event classes. > > Simply export an id (an u64), like: > > |-- L1-dcache-load-misses ===> event name > | `-- id ===> event id > > ... and then extend the syscall to enable an event by its sysfs id: > > memset(&attr, 0, sizeof(attr)); > attr.type = PERF_TYPE_SYSFS; > attr.sysfs_id = sysfs_id; > attr.sample_type = PERF_SAMPLE_CPU | PERF_SAMPLE_RAW; > attr.config = config; > ... > > The config value can then be (re-)used to setup this _specific_ event > individually. > > The kernel knows the id and is able to route the event request > directly to that particular pmu, something like: > > struct event_kobject { > struct kobject *kobj; > u64 id; > struct pmu *pmu; > struct event_kobject *next; > }; > > struct event_kobject *eclass; > > eclass = find_event_kobject(id); > eclass->pmu->event_init(event); > ... > > This is very simple and flexible and solves the original problem too. Yeah, this is flexible. I'll think about this closely. Thanks, Lin Ming > > (reposting my previous mail:) > > You still need knowledge of what the event is measuring and how it is > set up or configured. Maybe the configuration may left blank if the > event can be setup without it. But with this approach you can get file > descriptors for every event a user may be interested in simply by > looking into sysfs. > > For example, I was thinking of perfctr events vs. ibs events. The cpu > could setup something like: > > /sys/devices/system/cpu/cpu0...cpuN/events/perfctr/id > /sys/devices/system/cpu/cpu0...cpuN/events/ibs_op/id > > Both events are setup with one 64 bit config value that is basically > the event's configuration msr (x86 perfctr or AMD IBS). These are > definded in the hardware specifications. Its formats differ. You could > then open the event file descriptor using the sysfs id and use the > config value to customize the event. You don't have a complicated > setup or implementation to detect which kind of event you want to use > as the id indicates the type of event. > > Actually, we could setup e.g. also trace events with this mechanism. > > -Robert > -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
From: Robert Richter on 27 Jul 2010 04:30 On 26.07.10 22:18:23, Lin Ming wrote: > > > /sys/devices/system/cpu/cpu0/events > > > |-- L1-dcache-load-misses > > > | |-- config > > > | `-- type vs. > > |-- L1-dcache-load-misses ===> event name > > | `-- id ===> event id > > This is very simple and flexible and solves the original problem too. > > Yeah, this is flexible. I'll think about this closely. The thing is, if you start introducing the config/type i/f, we will stick with it for a long time. I want to avoid this from the beginning. Using an id only would work with your current implementation too, you only need to maintain an id -> config/type mapping, maybe in some private data section, without exporting it to userspace. -Robert -- Advanced Micro Devices, Inc. Operating System Research Center -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
From: Corey Ashford on 27 Jul 2010 14:00 On 07/27/2010 01:27 AM, Robert Richter wrote: > On 26.07.10 22:18:23, Lin Ming wrote: > >>>> /sys/devices/system/cpu/cpu0/events >>>> |-- L1-dcache-load-misses >>>> | |-- config >>>> | `-- type > > vs. > >>> |-- L1-dcache-load-misses ===> event name >>> | `-- id ===> event id > >>> This is very simple and flexible and solves the original problem too. >> >> Yeah, this is flexible. I'll think about this closely. > > The thing is, if you start introducing the config/type i/f, we will > stick with it for a long time. I want to avoid this from the > beginning. > > Using an id only would work with your current implementation too, you > only need to maintain an id -> config/type mapping, maybe in some > private data section, without exporting it to userspace. Now that I understand that the sysfs id essentially points to a kernel data structure, I like this idea a lot. Before I was thinking that you were trying to place a lot of info into the id itself. The only downside I see, and maybe it's a very minor one, is that you'll no longer have the ability to specify an event without specifying a sysfs path... there's no other mechanism. - Corey -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
From: Robert Richter on 28 Jul 2010 06:10
On 27.07.10 13:51:55, Corey Ashford wrote: > On 07/27/2010 01:27 AM, Robert Richter wrote: > > On 26.07.10 22:18:23, Lin Ming wrote: > > > >>>> /sys/devices/system/cpu/cpu0/events > >>>> |-- L1-dcache-load-misses > >>>> | |-- config > >>>> | `-- type > > > > vs. > > > >>> |-- L1-dcache-load-misses ===> event name > >>> | `-- id ===> event id > > > >>> This is very simple and flexible and solves the original problem too. > >> > >> Yeah, this is flexible. I'll think about this closely. > > > > The thing is, if you start introducing the config/type i/f, we will > > stick with it for a long time. I want to avoid this from the > > beginning. > > > > Using an id only would work with your current implementation too, you > > only need to maintain an id -> config/type mapping, maybe in some > > private data section, without exporting it to userspace. > > Now that I understand that the sysfs id essentially points to a kernel > data structure, I like this idea a lot. Before I was thinking that you > were trying to place a lot of info into the id itself. > > The only downside I see, and maybe it's a very minor one, is that you'll > no longer have the ability to specify an event without specifying a > sysfs path... there's no other mechanism. Right, the id is generated dynamically, it could be an incremented u64 value, a pointer to a kernel structure or something else. Its implementation could even change from kernel to kernel without breaking the i/f. Note also, that you will still be able to setup current events using the traditional way of filling in the syscall structure. Nothing will change for this. But yes, a new event could only support a sysfs id setup. And then, you need sysfs. But you could also implement a non-sysfs setup in addition. -Robert -- Advanced Micro Devices, Inc. Operating System Research Center -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/ |