Merge branch 'v4.4/topic/coresight' into linux-linaro-lsk-v4.4
authorAlex Shi <alex.shi@linaro.org>
Tue, 21 Jun 2016 03:14:16 +0000 (11:14 +0800)
committerAlex Shi <alex.shi@linaro.org>
Tue, 21 Jun 2016 03:14:16 +0000 (11:14 +0800)
1  2 
MAINTAINERS
kernel/events/core.c
tools/perf/util/evlist.c
tools/perf/util/parse-events.c

diff --combined MAINTAINERS
index e97e72928a5a044d451ede1d3c22e5d4a9b726a6,6c94a8f3ca45a2d82751751a2596bc1021f7b5b0..7875f7b71546b1cdead3caad96a077fe2abd7c64
@@@ -230,13 -230,13 +230,13 @@@ F:      kernel/sys_ni.
  
  ABIT UGURU 1,2 HARDWARE MONITOR DRIVER
  M:    Hans de Goede <hdegoede@redhat.com>
 -L:    lm-sensors@lm-sensors.org
 +L:    linux-hwmon@vger.kernel.org
  S:    Maintained
  F:    drivers/hwmon/abituguru.c
  
  ABIT UGURU 3 HARDWARE MONITOR DRIVER
  M:    Alistair John Strachan <alistair@devzero.co.uk>
 -L:    lm-sensors@lm-sensors.org
 +L:    linux-hwmon@vger.kernel.org
  S:    Maintained
  F:    drivers/hwmon/abituguru3.c
  
@@@ -373,14 -373,14 +373,14 @@@ S:      Maintaine
  
  ADM1025 HARDWARE MONITOR DRIVER
  M:    Jean Delvare <jdelvare@suse.com>
 -L:    lm-sensors@lm-sensors.org
 +L:    linux-hwmon@vger.kernel.org
  S:    Maintained
  F:    Documentation/hwmon/adm1025
  F:    drivers/hwmon/adm1025.c
  
  ADM1029 HARDWARE MONITOR DRIVER
  M:    Corentin Labbe <clabbe.montjoie@gmail.com>
 -L:    lm-sensors@lm-sensors.org
 +L:    linux-hwmon@vger.kernel.org
  S:    Maintained
  F:    drivers/hwmon/adm1029.c
  
@@@ -425,7 -425,7 +425,7 @@@ F: drivers/video/backlight/adp8860_bl.
  
  ADS1015 HARDWARE MONITOR DRIVER
  M:    Dirk Eibach <eibach@gdsys.de>
 -L:    lm-sensors@lm-sensors.org
 +L:    linux-hwmon@vger.kernel.org
  S:    Maintained
  F:    Documentation/hwmon/ads1015
  F:    drivers/hwmon/ads1015.c
@@@ -438,7 -438,7 +438,7 @@@ F: drivers/macintosh/therm_adt746x.
  
  ADT7475 HARDWARE MONITOR DRIVER
  M:    Jean Delvare <jdelvare@suse.com>
 -L:    lm-sensors@lm-sensors.org
 +L:    linux-hwmon@vger.kernel.org
  S:    Maintained
  F:    Documentation/hwmon/adt7475
  F:    drivers/hwmon/adt7475.c
@@@ -615,7 -615,7 +615,7 @@@ F: include/linux/ccp.
  
  AMD FAM15H PROCESSOR POWER MONITORING DRIVER
  M:    Andreas Herrmann <herrmann.der.user@googlemail.com>
 -L:    lm-sensors@lm-sensors.org
 +L:    linux-hwmon@vger.kernel.org
  S:    Maintained
  F:    Documentation/hwmon/fam15h_power
  F:    drivers/hwmon/fam15h_power.c
@@@ -779,7 -779,7 +779,7 @@@ F: drivers/input/mouse/bcm5974.
  
  APPLE SMC DRIVER
  M:    Henrik Rydberg <rydberg@bitmath.org>
 -L:    lm-sensors@lm-sensors.org
 +L:    linux-hwmon@vger.kernel.org
  S:    Odd fixes
  F:    drivers/hwmon/applesmc.c
  
@@@ -1007,6 -1007,10 +1007,10 @@@ F:    drivers/hwtracing/coresight/
  F:    Documentation/trace/coresight.txt
  F:    Documentation/devicetree/bindings/arm/coresight.txt
  F:    Documentation/ABI/testing/sysfs-bus-coresight-devices-*
+ F:    tools/perf/arch/arm/util/pmu.c
+ F:    tools/perf/arch/arm/util/auxtrace.c
+ F:    tools/perf/arch/arm/util/cs_etm.c
+ F:    tools/perf/arch/arm/util/cs_etm.h
  
  ARM/CORGI MACHINE SUPPORT
  M:    Richard Purdie <rpurdie@rpsys.net>
@@@ -1777,7 -1781,7 +1781,7 @@@ F:      include/media/as3645a.
  
  ASC7621 HARDWARE MONITOR DRIVER
  M:    George Joseph <george.joseph@fairview5.com>
 -L:    lm-sensors@lm-sensors.org
 +L:    linux-hwmon@vger.kernel.org
  S:    Maintained
  F:    Documentation/hwmon/asc7621
  F:    drivers/hwmon/asc7621.c
@@@ -1864,7 -1868,7 +1868,7 @@@ F:      drivers/net/wireless/ath/carl9170
  
  ATK0110 HWMON DRIVER
  M:    Luca Tettamanti <kronos.it@gmail.com>
 -L:    lm-sensors@lm-sensors.org
 +L:    linux-hwmon@vger.kernel.org
  S:    Maintained
  F:    drivers/hwmon/asus_atk0110.c
  
@@@ -2984,7 -2988,7 +2988,7 @@@ F:      mm/swap_cgroup.
  
  CORETEMP HARDWARE MONITORING DRIVER
  M:    Fenghua Yu <fenghua.yu@intel.com>
 -L:    lm-sensors@lm-sensors.org
 +L:    linux-hwmon@vger.kernel.org
  S:    Maintained
  F:    Documentation/hwmon/coretemp
  F:    drivers/hwmon/coretemp.c
@@@ -3549,7 -3553,7 +3553,7 @@@ T:      git git://git.infradead.org/users/vk
  
  DME1737 HARDWARE MONITOR DRIVER
  M:    Juerg Haefliger <juergh@gmail.com>
 -L:    lm-sensors@lm-sensors.org
 +L:    linux-hwmon@vger.kernel.org
  S:    Maintained
  F:    Documentation/hwmon/dme1737
  F:    drivers/hwmon/dme1737.c
@@@ -4097,8 -4101,8 +4101,8 @@@ F:      Documentation/efi-stub.tx
  F:    arch/ia64/kernel/efi.c
  F:    arch/x86/boot/compressed/eboot.[ch]
  F:    arch/x86/include/asm/efi.h
 -F:    arch/x86/platform/efi/*
 -F:    drivers/firmware/efi/*
 +F:    arch/x86/platform/efi/
 +F:    drivers/firmware/efi/
  F:    include/linux/efi*.h
  
  EFI VARIABLE FILESYSTEM
@@@ -4262,7 -4266,7 +4266,7 @@@ F:      include/video/exynos_mipi
  
  F71805F HARDWARE MONITORING DRIVER
  M:    Jean Delvare <jdelvare@suse.com>
 -L:    lm-sensors@lm-sensors.org
 +L:    linux-hwmon@vger.kernel.org
  S:    Maintained
  F:    Documentation/hwmon/f71805f
  F:    drivers/hwmon/f71805f.c
@@@ -4341,7 -4345,7 +4345,7 @@@ F:      fs/
  
  FINTEK F75375S HARDWARE MONITOR AND FAN CONTROLLER DRIVER
  M:    Riku Voipio <riku.voipio@iki.fi>
 -L:    lm-sensors@lm-sensors.org
 +L:    linux-hwmon@vger.kernel.org
  S:    Maintained
  F:    drivers/hwmon/f75375s.c
  F:    include/linux/f75375s.h
@@@ -4883,8 -4887,8 +4887,8 @@@ F:      drivers/media/usb/hackrf
  HARDWARE MONITORING
  M:    Jean Delvare <jdelvare@suse.com>
  M:    Guenter Roeck <linux@roeck-us.net>
 -L:    lm-sensors@lm-sensors.org
 -W:    http://www.lm-sensors.org/
 +L:    linux-hwmon@vger.kernel.org
 +W:    http://hwmon.wiki.kernel.org/
  T:    quilt http://jdelvare.nerim.net/devel/linux/jdelvare-hwmon/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git
  S:    Maintained
@@@ -5393,7 -5397,7 +5397,7 @@@ F:      drivers/usb/atm/ueagle-atm.
  
  INA209 HARDWARE MONITOR DRIVER
  M:    Guenter Roeck <linux@roeck-us.net>
 -L:    lm-sensors@lm-sensors.org
 +L:    linux-hwmon@vger.kernel.org
  S:    Maintained
  F:    Documentation/hwmon/ina209
  F:    Documentation/devicetree/bindings/i2c/ina209.txt
@@@ -5401,7 -5405,7 +5405,7 @@@ F:      drivers/hwmon/ina209.
  
  INA2XX HARDWARE MONITOR DRIVER
  M:    Guenter Roeck <linux@roeck-us.net>
 -L:    lm-sensors@lm-sensors.org
 +L:    linux-hwmon@vger.kernel.org
  S:    Maintained
  F:    Documentation/hwmon/ina2xx
  F:    drivers/hwmon/ina2xx.c
@@@ -5884,7 -5888,7 +5888,7 @@@ F:      drivers/isdn/hardware/eicon
  
  IT87 HARDWARE MONITORING DRIVER
  M:    Jean Delvare <jdelvare@suse.com>
 -L:    lm-sensors@lm-sensors.org
 +L:    linux-hwmon@vger.kernel.org
  S:    Maintained
  F:    Documentation/hwmon/it87
  F:    drivers/hwmon/it87.c
@@@ -5920,7 -5924,7 +5924,7 @@@ F:      drivers/media/dvb-frontends/ix2505v
  
  JC42.4 TEMPERATURE SENSOR DRIVER
  M:    Guenter Roeck <linux@roeck-us.net>
 -L:    lm-sensors@lm-sensors.org
 +L:    linux-hwmon@vger.kernel.org
  S:    Maintained
  F:    drivers/hwmon/jc42.c
  F:    Documentation/hwmon/jc42
@@@ -5970,14 -5974,14 +5974,14 @@@ F:   drivers/tty/serial/jsm
  
  K10TEMP HARDWARE MONITORING DRIVER
  M:    Clemens Ladisch <clemens@ladisch.de>
 -L:    lm-sensors@lm-sensors.org
 +L:    linux-hwmon@vger.kernel.org
  S:    Maintained
  F:    Documentation/hwmon/k10temp
  F:    drivers/hwmon/k10temp.c
  
  K8TEMP HARDWARE MONITORING DRIVER
  M:    Rudolf Marek <r.marek@assembler.cz>
 -L:    lm-sensors@lm-sensors.org
 +L:    linux-hwmon@vger.kernel.org
  S:    Maintained
  F:    Documentation/hwmon/k8temp
  F:    drivers/hwmon/k8temp.c
@@@ -6485,27 -6489,27 +6489,27 @@@ F:   net/llc
  
  LM73 HARDWARE MONITOR DRIVER
  M:    Guillaume Ligneul <guillaume.ligneul@gmail.com>
 -L:    lm-sensors@lm-sensors.org
 +L:    linux-hwmon@vger.kernel.org
  S:    Maintained
  F:    drivers/hwmon/lm73.c
  
  LM78 HARDWARE MONITOR DRIVER
  M:    Jean Delvare <jdelvare@suse.com>
 -L:    lm-sensors@lm-sensors.org
 +L:    linux-hwmon@vger.kernel.org
  S:    Maintained
  F:    Documentation/hwmon/lm78
  F:    drivers/hwmon/lm78.c
  
  LM83 HARDWARE MONITOR DRIVER
  M:    Jean Delvare <jdelvare@suse.com>
 -L:    lm-sensors@lm-sensors.org
 +L:    linux-hwmon@vger.kernel.org
  S:    Maintained
  F:    Documentation/hwmon/lm83
  F:    drivers/hwmon/lm83.c
  
  LM90 HARDWARE MONITOR DRIVER
  M:    Jean Delvare <jdelvare@suse.com>
 -L:    lm-sensors@lm-sensors.org
 +L:    linux-hwmon@vger.kernel.org
  S:    Maintained
  F:    Documentation/hwmon/lm90
  F:    Documentation/devicetree/bindings/hwmon/lm90.txt
@@@ -6513,7 -6517,7 +6517,7 @@@ F:      drivers/hwmon/lm90.
  
  LM95234 HARDWARE MONITOR DRIVER
  M:    Guenter Roeck <linux@roeck-us.net>
 -L:    lm-sensors@lm-sensors.org
 +L:    linux-hwmon@vger.kernel.org
  S:    Maintained
  F:    Documentation/hwmon/lm95234
  F:    drivers/hwmon/lm95234.c
@@@ -6580,7 -6584,7 +6584,7 @@@ F:      drivers/scsi/sym53c8xx_2
  
  LTC4261 HARDWARE MONITOR DRIVER
  M:    Guenter Roeck <linux@roeck-us.net>
 -L:    lm-sensors@lm-sensors.org
 +L:    linux-hwmon@vger.kernel.org
  S:    Maintained
  F:    Documentation/hwmon/ltc4261
  F:    drivers/hwmon/ltc4261.c
@@@ -6749,28 -6753,28 +6753,28 @@@ F:   include/uapi/linux/matroxfb.
  
  MAX16065 HARDWARE MONITOR DRIVER
  M:    Guenter Roeck <linux@roeck-us.net>
 -L:    lm-sensors@lm-sensors.org
 +L:    linux-hwmon@vger.kernel.org
  S:    Maintained
  F:    Documentation/hwmon/max16065
  F:    drivers/hwmon/max16065.c
  
  MAX20751 HARDWARE MONITOR DRIVER
  M:    Guenter Roeck <linux@roeck-us.net>
 -L:    lm-sensors@lm-sensors.org
 +L:    linux-hwmon@vger.kernel.org
  S:    Maintained
  F:    Documentation/hwmon/max20751
  F:    drivers/hwmon/max20751.c
  
  MAX6650 HARDWARE MONITOR AND FAN CONTROLLER DRIVER
  M:    "Hans J. Koch" <hjk@hansjkoch.de>
 -L:    lm-sensors@lm-sensors.org
 +L:    linux-hwmon@vger.kernel.org
  S:    Maintained
  F:    Documentation/hwmon/max6650
  F:    drivers/hwmon/max6650.c
  
  MAX6697 HARDWARE MONITOR DRIVER
  M:    Guenter Roeck <linux@roeck-us.net>
 -L:    lm-sensors@lm-sensors.org
 +L:    linux-hwmon@vger.kernel.org
  S:    Maintained
  F:    Documentation/hwmon/max6697
  F:    Documentation/devicetree/bindings/i2c/max6697.txt
@@@ -7303,7 -7307,7 +7307,7 @@@ F:      drivers/scsi/NCR_D700.
  
  NCT6775 HARDWARE MONITOR DRIVER
  M:    Guenter Roeck <linux@roeck-us.net>
 -L:    lm-sensors@lm-sensors.org
 +L:    linux-hwmon@vger.kernel.org
  S:    Maintained
  F:    Documentation/hwmon/nct6775
  F:    drivers/hwmon/nct6775.c
@@@ -8064,7 -8068,7 +8068,7 @@@ F:      drivers/video/logo/logo_parisc
  
  PC87360 HARDWARE MONITORING DRIVER
  M:    Jim Cromie <jim.cromie@gmail.com>
 -L:    lm-sensors@lm-sensors.org
 +L:    linux-hwmon@vger.kernel.org
  S:    Maintained
  F:    Documentation/hwmon/pc87360
  F:    drivers/hwmon/pc87360.c
@@@ -8076,7 -8080,7 +8080,7 @@@ F:      drivers/char/pc8736x_gpio.
  
  PC87427 HARDWARE MONITORING DRIVER
  M:    Jean Delvare <jdelvare@suse.com>
 -L:    lm-sensors@lm-sensors.org
 +L:    linux-hwmon@vger.kernel.org
  S:    Maintained
  F:    Documentation/hwmon/pc87427
  F:    drivers/hwmon/pc87427.c
@@@ -8415,8 -8419,8 +8419,8 @@@ F:      drivers/rtc/rtc-puv3.
  
  PMBUS HARDWARE MONITORING DRIVERS
  M:    Guenter Roeck <linux@roeck-us.net>
 -L:    lm-sensors@lm-sensors.org
 -W:    http://www.lm-sensors.org/
 +L:    linux-hwmon@vger.kernel.org
 +W:    http://hwmon.wiki.kernel.org/
  W:    http://www.roeck-us.net/linux/drivers/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git
  S:    Maintained
@@@ -8610,7 -8614,7 +8614,7 @@@ F:      drivers/media/usb/pwc/
  
  PWM FAN DRIVER
  M:    Kamil Debski <k.debski@samsung.com>
 -L:    lm-sensors@lm-sensors.org
 +L:    linux-hwmon@vger.kernel.org
  S:    Supported
  F:    Documentation/devicetree/bindings/hwmon/pwm-fan.txt
  F:    Documentation/hwmon/pwm-fan
@@@ -9883,28 -9887,28 +9887,28 @@@ F:   Documentation/devicetree/bindings/me
  
  SMM665 HARDWARE MONITOR DRIVER
  M:    Guenter Roeck <linux@roeck-us.net>
 -L:    lm-sensors@lm-sensors.org
 +L:    linux-hwmon@vger.kernel.org
  S:    Maintained
  F:    Documentation/hwmon/smm665
  F:    drivers/hwmon/smm665.c
  
  SMSC EMC2103 HARDWARE MONITOR DRIVER
  M:    Steve Glendinning <steve.glendinning@shawell.net>
 -L:    lm-sensors@lm-sensors.org
 +L:    linux-hwmon@vger.kernel.org
  S:    Maintained
  F:    Documentation/hwmon/emc2103
  F:    drivers/hwmon/emc2103.c
  
  SMSC SCH5627 HARDWARE MONITOR DRIVER
  M:    Hans de Goede <hdegoede@redhat.com>
 -L:    lm-sensors@lm-sensors.org
 +L:    linux-hwmon@vger.kernel.org
  S:    Supported
  F:    Documentation/hwmon/sch5627
  F:    drivers/hwmon/sch5627.c
  
  SMSC47B397 HARDWARE MONITOR DRIVER
  M:    Jean Delvare <jdelvare@suse.com>
 -L:    lm-sensors@lm-sensors.org
 +L:    linux-hwmon@vger.kernel.org
  S:    Maintained
  F:    Documentation/hwmon/smsc47b397
  F:    drivers/hwmon/smsc47b397.c
@@@ -10290,11 -10294,9 +10294,11 @@@ S: Maintaine
  F:    drivers/net/ethernet/dlink/sundance.c
  
  SUPERH
 +M:    Yoshinori Sato <ysato@users.sourceforge.jp>
 +M:    Rich Felker <dalias@libc.org>
  L:    linux-sh@vger.kernel.org
  Q:    http://patchwork.kernel.org/project/linux-sh/list/
 -S:    Orphan
 +S:    Maintained
  F:    Documentation/sh/
  F:    arch/sh/
  F:    drivers/sh/
@@@ -10831,7 -10833,7 +10835,7 @@@ F:   include/linux/mmc/sh_mobile_sdhi.
  
  TMP401 HARDWARE MONITOR DRIVER
  M:    Guenter Roeck <linux@roeck-us.net>
 -L:    lm-sensors@lm-sensors.org
 +L:    linux-hwmon@vger.kernel.org
  S:    Maintained
  F:    Documentation/hwmon/tmp401
  F:    drivers/hwmon/tmp401.c
@@@ -11565,14 -11567,14 +11569,14 @@@ F:        Documentation/networking/vrf.tx
  
  VT1211 HARDWARE MONITOR DRIVER
  M:    Juerg Haefliger <juergh@gmail.com>
 -L:    lm-sensors@lm-sensors.org
 +L:    linux-hwmon@vger.kernel.org
  S:    Maintained
  F:    Documentation/hwmon/vt1211
  F:    drivers/hwmon/vt1211.c
  
  VT8231 HARDWARE MONITOR DRIVER
  M:    Roger Lucas <vt8231@hiddenengine.co.uk>
 -L:    lm-sensors@lm-sensors.org
 +L:    linux-hwmon@vger.kernel.org
  S:    Maintained
  F:    drivers/hwmon/vt8231.c
  
@@@ -11591,21 -11593,21 +11595,21 @@@ F:        drivers/w1
  
  W83791D HARDWARE MONITORING DRIVER
  M:    Marc Hulsman <m.hulsman@tudelft.nl>
 -L:    lm-sensors@lm-sensors.org
 +L:    linux-hwmon@vger.kernel.org
  S:    Maintained
  F:    Documentation/hwmon/w83791d
  F:    drivers/hwmon/w83791d.c
  
  W83793 HARDWARE MONITORING DRIVER
  M:    Rudolf Marek <r.marek@assembler.cz>
 -L:    lm-sensors@lm-sensors.org
 +L:    linux-hwmon@vger.kernel.org
  S:    Maintained
  F:    Documentation/hwmon/w83793
  F:    drivers/hwmon/w83793.c
  
  W83795 HARDWARE MONITORING DRIVER
  M:    Jean Delvare <jdelvare@suse.com>
 -L:    lm-sensors@lm-sensors.org
 +L:    linux-hwmon@vger.kernel.org
  S:    Maintained
  F:    drivers/hwmon/w83795.c
  
diff --combined kernel/events/core.c
index b76bb498148ea83e7cf27f7f10b9e545be4d6736,59552da6d6aac03b1f4d24a08d7676bfa5db7f25..da75e59e6642b992316c8b16eab4feebcf30d7a9
@@@ -946,7 -946,6 +946,7 @@@ static void put_ctx(struct perf_event_c
   * function.
   *
   * Lock order:
 + *    cred_guard_mutex
   *    task_struct::perf_event_mutex
   *      perf_event_context::mutex
   *        perf_event_context::lock
@@@ -1581,14 -1580,14 +1581,14 @@@ event_sched_out(struct perf_event *even
  
        perf_pmu_disable(event->pmu);
  
 +      event->tstamp_stopped = tstamp;
 +      event->pmu->del(event, 0);
 +      event->oncpu = -1;
        event->state = PERF_EVENT_STATE_INACTIVE;
        if (event->pending_disable) {
                event->pending_disable = 0;
                event->state = PERF_EVENT_STATE_OFF;
        }
 -      event->tstamp_stopped = tstamp;
 -      event->pmu->del(event, 0);
 -      event->oncpu = -1;
  
        if (!is_software_event(event))
                cpuctx->active_oncpu--;
@@@ -3447,6 -3446,7 +3447,6 @@@ static struct task_struct 
  find_lively_task_by_vpid(pid_t vpid)
  {
        struct task_struct *task;
 -      int err;
  
        rcu_read_lock();
        if (!vpid)
        if (!task)
                return ERR_PTR(-ESRCH);
  
 -      /* Reuse ptrace permission checks for now. */
 -      err = -EACCES;
 -      if (!ptrace_may_access(task, PTRACE_MODE_READ))
 -              goto errout;
 -
        return task;
 -errout:
 -      put_task_struct(task);
 -      return ERR_PTR(err);
 -
  }
  
  /*
@@@ -3720,6 -3729,9 +3720,9 @@@ static void __free_event(struct perf_ev
        if (event->destroy)
                event->destroy(event);
  
+       if (event->pmu->free_drv_configs)
+               event->pmu->free_drv_configs(event);
        if (event->ctx)
                put_ctx(event->ctx);
  
@@@ -4272,6 -4284,8 +4275,8 @@@ static int perf_event_set_output(struc
                                 struct perf_event *output_event);
  static int perf_event_set_filter(struct perf_event *event, void __user *arg);
  static int perf_event_set_bpf_prog(struct perf_event *event, u32 prog_fd);
+ static int perf_event_drv_configs(struct perf_event *event,
+                                 void __user *arg);
  
  static long _perf_ioctl(struct perf_event *event, unsigned int cmd, unsigned long arg)
  {
        case PERF_EVENT_IOC_SET_BPF:
                return perf_event_set_bpf_prog(event, arg);
  
+       case PERF_EVENT_IOC_SET_DRV_CONFIGS:
+               return perf_event_drv_configs(event, (void __user *)arg);
        default:
                return -ENOTTY;
        }
@@@ -4360,6 -4377,7 +4368,7 @@@ static long perf_compat_ioctl(struct fi
        switch (_IOC_NR(cmd)) {
        case _IOC_NR(PERF_EVENT_IOC_SET_FILTER):
        case _IOC_NR(PERF_EVENT_IOC_ID):
+       case _IOC_NR(PERF_EVENT_IOC_SET_DRV_CONFIGS):
                /* Fix up pointer size (usually 4 -> 8 in 32-on-64-bit case */
                if (_IOC_SIZE(cmd) == sizeof(compat_uptr_t)) {
                        cmd &= ~IOCSIZE_MASK;
@@@ -7259,6 -7277,15 +7268,15 @@@ void perf_bp_event(struct perf_event *b
  }
  #endif
  
+ static int perf_event_drv_configs(struct perf_event *event,
+                                 void __user *arg)
+ {
+       if (!event->pmu->get_drv_configs)
+               return -EINVAL;
+       return event->pmu->get_drv_configs(event, arg);
+ }
  /*
   * hrtimer based swevent callback
   */
@@@ -7995,6 -8022,7 +8013,7 @@@ perf_event_alloc(struct perf_event_att
        INIT_LIST_HEAD(&event->sibling_list);
        INIT_LIST_HEAD(&event->rb_entry);
        INIT_LIST_HEAD(&event->active_entry);
+       INIT_LIST_HEAD(&event->drv_configs);
        INIT_HLIST_NODE(&event->hlist_entry);
  
  
@@@ -8435,24 -8463,6 +8454,24 @@@ SYSCALL_DEFINE5(perf_event_open
  
        get_online_cpus();
  
 +      if (task) {
 +              err = mutex_lock_interruptible(&task->signal->cred_guard_mutex);
 +              if (err)
 +                      goto err_cpus;
 +
 +              /*
 +               * Reuse ptrace permission checks for now.
 +               *
 +               * We must hold cred_guard_mutex across this and any potential
 +               * perf_install_in_context() call for this new event to
 +               * serialize against exec() altering our credentials (and the
 +               * perf_event_exit_task() that could imply).
 +               */
 +              err = -EACCES;
 +              if (!ptrace_may_access(task, PTRACE_MODE_READ_REALCREDS))
 +                      goto err_cred;
 +      }
 +
        if (flags & PERF_FLAG_PID_CGROUP)
                cgroup_fd = pid;
  
                                 NULL, NULL, cgroup_fd);
        if (IS_ERR(event)) {
                err = PTR_ERR(event);
 -              goto err_cpus;
 +              goto err_cred;
        }
  
        if (is_sampling_event(event)) {
                goto err_context;
        }
  
 -      if (task) {
 -              put_task_struct(task);
 -              task = NULL;
 -      }
 -
        /*
         * Look up the group leader (we will attach this event to it):
         */
  
        WARN_ON_ONCE(ctx->parent_ctx);
  
 +      /*
 +       * This is the point on no return; we cannot fail hereafter. This is
 +       * where we start modifying current state.
 +       */
 +
        if (move_group) {
                /*
                 * See perf_event_ctx_lock() for comments on the details
                mutex_unlock(&gctx->mutex);
        mutex_unlock(&ctx->mutex);
  
 +      if (task) {
 +              mutex_unlock(&task->signal->cred_guard_mutex);
 +              put_task_struct(task);
 +      }
 +
        put_online_cpus();
  
        event->owner = current;
@@@ -8714,15 -8719,7 +8733,15 @@@ err_context
        perf_unpin_context(ctx);
        put_ctx(ctx);
  err_alloc:
 -      free_event(event);
 +      /*
 +       * If event_file is set, the fput() above will have called ->release()
 +       * and that will take care of freeing the event.
 +       */
 +      if (!event_file)
 +              free_event(event);
 +err_cred:
 +      if (task)
 +              mutex_unlock(&task->signal->cred_guard_mutex);
  err_cpus:
        put_online_cpus();
  err_task:
@@@ -9002,9 -8999,6 +9021,9 @@@ static void perf_event_exit_task_contex
  
  /*
   * When a child task exits, feed back event values to parent events.
 + *
 + * Can be called with cred_guard_mutex held when called from
 + * install_exec_creds().
   */
  void perf_event_exit_task(struct task_struct *child)
  {
diff --combined tools/perf/util/evlist.c
index aa6cf40388f122530c2c10bb3e11c0130cdb17c1,b54ee9f1cffdcdea410ffbd9c7233b93d6c007b6..b856cf0393ea96d652eb73b11c5e14af911d6f61
@@@ -1211,12 -1211,12 +1211,12 @@@ void perf_evlist__set_maps(struct perf_
         */
        if (cpus != evlist->cpus) {
                cpu_map__put(evlist->cpus);
 -              evlist->cpus = cpus;
 +              evlist->cpus = cpu_map__get(cpus);
        }
  
        if (threads != evlist->threads) {
                thread_map__put(evlist->threads);
 -              evlist->threads = threads;
 +              evlist->threads = thread_map__get(threads);
        }
  
        perf_evlist__propagate_maps(evlist);
@@@ -1247,6 -1247,30 +1247,30 @@@ int perf_evlist__apply_filters(struct p
        return err;
  }
  
+ int perf_evlist__apply_drv_configs(struct perf_evlist *evlist,
+                                  struct perf_evsel **err_evsel,
+                                  struct perf_evsel_config_term **err_term)
+ {
+       struct perf_evsel *evsel;
+       int err = 0;
+       const int ncpus = cpu_map__nr(evlist->cpus),
+                 nthreads = thread_map__nr(evlist->threads);
+       evlist__for_each(evlist, evsel) {
+               if (list_empty(&evsel->drv_config_terms))
+                       continue;
+               err = perf_evsel__apply_drv_configs(evsel, ncpus,
+                                                   nthreads, err_term);
+               if (err) {
+                       *err_evsel = evsel;
+                       break;
+               }
+       }
+       return err;
+ }
  int perf_evlist__set_filter(struct perf_evlist *evlist, const char *filter)
  {
        struct perf_evsel *evsel;
index a35db828bd0d32d09068fed2e1c451e28db90dbf,ec4ba419501aac760346b5dbbf79a3fc111da49f..854dd2105bd584786caec47344acf0636b0d990c
@@@ -285,7 -285,8 +285,8 @@@ static struct perf_evsel 
  __add_event(struct list_head *list, int *idx,
            struct perf_event_attr *attr,
            char *name, struct cpu_map *cpus,
-           struct list_head *config_terms)
+           struct list_head *config_terms,
+           struct list_head *drv_config_terms)
  {
        struct perf_evsel *evsel;
  
        if (config_terms)
                list_splice(config_terms, &evsel->config_terms);
  
+       if (drv_config_terms)
+               list_splice(drv_config_terms, &evsel->drv_config_terms);
        list_add_tail(&evsel->node, list);
        return evsel;
  }
@@@ -312,7 -316,8 +316,8 @@@ static int add_event(struct list_head *
                     struct perf_event_attr *attr, char *name,
                     struct list_head *config_terms)
  {
-       return __add_event(list, idx, attr, name, NULL, config_terms) ? 0 : -ENOMEM;
+       return __add_event(list, idx, attr, name,
+                          NULL, config_terms, NULL) ? 0 : -ENOMEM;
  }
  
  static int parse_aliases(char *str, const char *names[][PERF_EVSEL__MAX_ALIASES], int size)
@@@ -823,7 -828,8 +828,8 @@@ static int config_term_pmu(struct perf_
                           struct parse_events_term *term,
                           struct parse_events_error *err)
  {
-       if (term->type_term == PARSE_EVENTS__TERM_TYPE_USER)
+       if (term->type_term == PARSE_EVENTS__TERM_TYPE_USER ||
+           term->type_term == PARSE_EVENTS__TERM_TYPE_DRV_CFG)
                /*
                 * Always succeed for sysfs terms, as we dont know
                 * at this point what type they need to have.
@@@ -869,10 -875,7 +875,7 @@@ static int config_attr(struct perf_even
        return 0;
  }
  
- static int get_config_terms(struct list_head *head_config,
-                           struct list_head *head_terms __maybe_unused)
- {
- #define ADD_CONFIG_TERM(__type, __name, __val)                        \
+ #define ADD_CONFIG_TERM(__type, __name, __val, __head_terms)  \
  do {                                                          \
        struct perf_evsel_config_term *__t;                     \
                                                                \
        INIT_LIST_HEAD(&__t->list);                             \
        __t->type       = PERF_EVSEL__CONFIG_TERM_ ## __type;   \
        __t->val.__name = __val;                                \
-       list_add_tail(&__t->list, head_terms);                  \
+       list_add_tail(&__t->list, __head_terms);                \
  } while (0)
  
+ static int get_config_terms(struct list_head *head_config,
+                           struct list_head *head_terms __maybe_unused)
+ {
        struct parse_events_term *term;
  
        list_for_each_entry(term, head_config, list) {
                switch (term->type_term) {
                case PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD:
-                       ADD_CONFIG_TERM(PERIOD, period, term->val.num);
+                       ADD_CONFIG_TERM(PERIOD, period,
+                                       term->val.num, head_terms);
                        break;
                case PARSE_EVENTS__TERM_TYPE_SAMPLE_FREQ:
-                       ADD_CONFIG_TERM(FREQ, freq, term->val.num);
+                       ADD_CONFIG_TERM(FREQ, freq,
+                                       term->val.num, head_terms);
                        break;
                case PARSE_EVENTS__TERM_TYPE_TIME:
-                       ADD_CONFIG_TERM(TIME, time, term->val.num);
+                       ADD_CONFIG_TERM(TIME, time,
+                                       term->val.num, head_terms);
                        break;
                case PARSE_EVENTS__TERM_TYPE_CALLGRAPH:
-                       ADD_CONFIG_TERM(CALLGRAPH, callgraph, term->val.str);
+                       ADD_CONFIG_TERM(CALLGRAPH, callgraph,
+                                       term->val.str, head_terms);
                        break;
                case PARSE_EVENTS__TERM_TYPE_STACKSIZE:
-                       ADD_CONFIG_TERM(STACK_USER, stack_user, term->val.num);
+                       ADD_CONFIG_TERM(STACK_USER, stack_user,
+                                       term->val.num, head_terms);
                        break;
                case PARSE_EVENTS__TERM_TYPE_INHERIT:
-                       ADD_CONFIG_TERM(INHERIT, inherit, term->val.num ? 1 : 0);
+                       ADD_CONFIG_TERM(INHERIT, inherit,
+                                       term->val.num ? 1 : 0, head_terms);
                        break;
                case PARSE_EVENTS__TERM_TYPE_NOINHERIT:
-                       ADD_CONFIG_TERM(INHERIT, inherit, term->val.num ? 0 : 1);
+                       ADD_CONFIG_TERM(INHERIT, inherit,
+                                       term->val.num ? 0 : 1, head_terms);
                        break;
                default:
                        break;
        return 0;
  }
  
+ static int get_drv_config_terms(struct list_head *head_config,
+                               struct list_head *head_terms)
+ {
+       struct parse_events_term *term;
+       list_for_each_entry(term, head_config, list) {
+               if (term->type_term != PARSE_EVENTS__TERM_TYPE_DRV_CFG)
+                       continue;
+               ADD_CONFIG_TERM(DRV_CFG, drv_cfg, term->val.str, head_terms);
+       }
+       return 0;
+ }
  int parse_events_add_tracepoint(struct list_head *list, int *idx,
                                char *sys, char *event,
                                struct parse_events_error *err,
@@@ -989,6 -1017,7 +1017,7 @@@ int parse_events_add_pmu(struct parse_e
        struct perf_pmu *pmu;
        struct perf_evsel *evsel;
        LIST_HEAD(config_terms);
+       LIST_HEAD(drv_config_terms);
  
        pmu = perf_pmu__find(name);
        if (!pmu)
  
        if (!head_config) {
                attr.type = pmu->type;
-               evsel = __add_event(list, &data->idx, &attr, NULL, pmu->cpus, NULL);
+               evsel = __add_event(list, &data->idx, &attr,
+                                   NULL, pmu->cpus, NULL, NULL);
                return evsel ? 0 : -ENOMEM;
        }
  
        if (get_config_terms(head_config, &config_terms))
                return -ENOMEM;
  
+       if (get_drv_config_terms(head_config, &drv_config_terms))
+               return -ENOMEM;
        if (perf_pmu__config(pmu, &attr, head_config, data->error))
                return -EINVAL;
  
        evsel = __add_event(list, &data->idx, &attr,
                            pmu_event_name(head_config), pmu->cpus,
-                           &config_terms);
+                           &config_terms, &drv_config_terms);
        if (evsel) {
                evsel->unit = info.unit;
                evsel->scale = info.scale;
@@@ -2101,11 -2134,11 +2134,11 @@@ char *parse_events_formats_error_string
  
        /* valid terms */
        if (additional_terms) {
 -              if (!asprintf(&str, "valid terms: %s,%s",
 -                            additional_terms, static_terms))
 +              if (asprintf(&str, "valid terms: %s,%s",
 +                           additional_terms, static_terms) < 0)
                        goto fail;
        } else {
 -              if (!asprintf(&str, "valid terms: %s", static_terms))
 +              if (asprintf(&str, "valid terms: %s", static_terms) < 0)
                        goto fail;
        }
        return str;