lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Date:	Tue, 27 Nov 2012 08:29:00 -0600
From:	Michael Wolf <mjw@...ux.vnet.ibm.com>
To:	Gleb Natapov <gleb@...hat.com>
CC:	linux-kernel@...r.kernel.org, riel@...hat.com, kvm@...r.kernel.org,
	peterz@...radead.org, mtosatti@...hat.com, glommer@...allels.com,
	mingo@...hat.com
Subject: Re: [PATCH 5/5] Add an ioctl to communicate the consign limit to
 the host.

On 11/27/2012 12:35 AM, Gleb Natapov wrote:
> On Mon, Nov 26, 2012 at 03:06:06PM -0600, Michael Wolf wrote:
>> Add an ioctl to communicate the consign limit to the host.
>>
>> Signed-off-by: Michael Wolf <mjw@...ux.vnet.ibm.com>
> Something is very wrong with this patch.
Yep, something happened with the patch management tool I use.  I will 
fix and resend.

>
>> ---
>>   CREDITS                                            |    5
>>   Documentation/arm64/memory.txt                     |   12
>>   Documentation/cgroups/memory.txt                   |    4
>>   .../devicetree/bindings/net/mdio-gpio.txt          |    9
>>   Documentation/filesystems/proc.txt                 |   16
>>   Documentation/hwmon/fam15h_power                   |    2
>>   Documentation/kernel-parameters.txt                |   20
>>   Documentation/networking/netdev-features.txt       |    2
>>   Documentation/scheduler/numa-problem.txt           |   20
>>   MAINTAINERS                                        |   87 +
>>   Makefile                                           |    2
>>   arch/alpha/kernel/osf_sys.c                        |    6
>>   arch/arm/boot/Makefile                             |   10
>>   arch/arm/boot/dts/tegra30.dtsi                     |    4
>>   arch/arm/include/asm/io.h                          |    4
>>   arch/arm/include/asm/sched_clock.h                 |    2
>>   arch/arm/include/asm/vfpmacros.h                   |   12
>>   arch/arm/include/uapi/asm/hwcap.h                  |    3
>>   arch/arm/kernel/sched_clock.c                      |   18
>>   arch/arm/mach-at91/at91rm9200_devices.c            |    2
>>   arch/arm/mach-at91/at91sam9260_devices.c           |    2
>>   arch/arm/mach-at91/at91sam9261_devices.c           |    2
>>   arch/arm/mach-at91/at91sam9263_devices.c           |    2
>>   arch/arm/mach-at91/at91sam9g45_devices.c           |   12
>>   arch/arm/mach-davinci/dm644x.c                     |    3
>>   arch/arm/mach-highbank/system.c                    |    3
>>   arch/arm/mach-imx/clk-gate2.c                      |    2
>>   arch/arm/mach-imx/ehci-imx25.c                     |    2
>>   arch/arm/mach-imx/ehci-imx35.c                     |    2
>>   arch/arm/mach-omap2/board-igep0020.c               |    5
>>   arch/arm/mach-omap2/clockdomains44xx_data.c        |    2
>>   arch/arm/mach-omap2/devices.c                      |   79 +
>>   arch/arm/mach-omap2/omap_hwmod.c                   |   63 +
>>   arch/arm/mach-omap2/omap_hwmod_44xx_data.c         |   36
>>   arch/arm/mach-omap2/twl-common.c                   |    3
>>   arch/arm/mach-omap2/vc.c                           |    2
>>   arch/arm/mach-pxa/hx4700.c                         |    8
>>   arch/arm/mach-pxa/spitz_pm.c                       |    8
>>   arch/arm/mm/alignment.c                            |    2
>>   arch/arm/plat-omap/include/plat/omap_hwmod.h       |    6
>>   arch/arm/tools/Makefile                            |    2
>>   arch/arm/vfp/vfpmodule.c                           |    9
>>   arch/arm/xen/enlighten.c                           |   11
>>   arch/arm/xen/hypercall.S                           |   14
>>   arch/arm64/Kconfig                                 |    1
>>   arch/arm64/include/asm/elf.h                       |    5
>>   arch/arm64/include/asm/fpsimd.h                    |    5
>>   arch/arm64/include/asm/io.h                        |   10
>>   arch/arm64/include/asm/pgtable-hwdef.h             |    6
>>   arch/arm64/include/asm/pgtable.h                   |   40 -
>>   arch/arm64/include/asm/processor.h                 |    2
>>   arch/arm64/include/asm/unistd.h                    |    1
>>   arch/arm64/kernel/perf_event.c                     |   10
>>   arch/arm64/kernel/process.c                        |   18
>>   arch/arm64/kernel/smp.c                            |    3
>>   arch/arm64/mm/init.c                               |    2
>>   arch/frv/Kconfig                                   |    1
>>   arch/frv/boot/Makefile                             |   10
>>   arch/frv/include/asm/unistd.h                      |    1
>>   arch/frv/kernel/entry.S                            |   28
>>   arch/frv/kernel/process.c                          |    5
>>   arch/frv/mb93090-mb00/pci-dma-nommu.c              |    1
>>   arch/h8300/include/asm/cache.h                     |    3
>>   arch/ia64/mm/init.c                                |    1
>>   arch/m68k/include/asm/signal.h                     |    6
>>   arch/mips/cavium-octeon/executive/cvmx-l2c.c       |  900 ------------
>>   arch/unicore32/include/asm/byteorder.h             |   24
>>   arch/unicore32/include/asm/kvm_para.h              |    1
>>   arch/unicore32/include/asm/sigcontext.h            |   29
>>   arch/unicore32/include/asm/unistd.h                |   14
>>   arch/x86/kvm/x86.c                                 |    6
>>   include/linux/kvm_host.h                           |    2
>>   include/linux/raid/md_p.h                          |  301 ----
>>   include/uapi/linux/kvm.h                           |    2
>>   tools/perf/builtin-test.c                          | 1559 --------------------
>>   tools/perf/util/dso-test-data.c                    |  153 --
>>   tools/perf/util/parse-events-test.c                | 1116 --------------
>>   tools/testing/selftests/epoll/Makefile             |   11
>>   tools/testing/selftests/epoll/test_epoll.c         |  344 ----
>>   virt/kvm/kvm_main.c                                |    7
>>   80 files changed, 471 insertions(+), 4677 deletions(-)
>>   delete mode 100644 arch/mips/cavium-octeon/executive/cvmx-l2c.c
>>   delete mode 100644 arch/unicore32/include/asm/byteorder.h
>>   delete mode 100644 arch/unicore32/include/asm/kvm_para.h
>>   delete mode 100644 arch/unicore32/include/asm/sigcontext.h
>>   delete mode 100644 arch/unicore32/include/asm/unistd.h
>>   delete mode 100644 include/linux/raid/md_p.h
>>   delete mode 100644 tools/perf/builtin-test.c
>>   delete mode 100644 tools/perf/util/dso-test-data.c
>>   delete mode 100644 tools/perf/util/parse-events-test.c
>>   delete mode 100644 tools/testing/selftests/epoll/Makefile
>>   delete mode 100644 tools/testing/selftests/epoll/test_epoll.c
>>
>> diff --git a/CREDITS b/CREDITS
>> index b4cdc8f..17899e2 100644
>> --- a/CREDITS
>> +++ b/CREDITS
>> @@ -1824,6 +1824,11 @@ S: Kattreinstr 38
>>   S: D-64295
>>   S: Germany
>>   
>> +N: Avi Kivity
>> +E: avi.kivity@...il.com
>> +D: Kernel-based Virtual Machine (KVM)
>> +S: Ra'annana, Israel
>> +
>>   N: Andi Kleen
>>   E: andi@...stfloor.org
>>   U: http://www.halobates.de
>> diff --git a/Documentation/arm64/memory.txt b/Documentation/arm64/memory.txt
>> index dbbdcbb..4110cca 100644
>> --- a/Documentation/arm64/memory.txt
>> +++ b/Documentation/arm64/memory.txt
>> @@ -27,17 +27,17 @@ Start			End			Size		Use
>>   -----------------------------------------------------------------------
>>   0000000000000000	0000007fffffffff	 512GB		user
>>   
>> -ffffff8000000000	ffffffbbfffcffff	~240GB		vmalloc
>> +ffffff8000000000	ffffffbbfffeffff	~240GB		vmalloc
>>   
>> -ffffffbbfffd0000	ffffffbcfffdffff	  64KB		[guard page]
>> +ffffffbbffff0000	ffffffbbffffffff	  64KB		[guard page]
>>   
>> -ffffffbbfffe0000	ffffffbcfffeffff	  64KB		PCI I/O space
>> +ffffffbc00000000	ffffffbdffffffff	   8GB		vmemmap
>>   
>> -ffffffbbffff0000	ffffffbcffffffff	  64KB		[guard page]
>> +ffffffbe00000000	ffffffbffbbfffff	  ~8GB		[guard, future vmmemap]
>>   
>> -ffffffbc00000000	ffffffbdffffffff	   8GB		vmemmap
>> +ffffffbffbe00000	ffffffbffbe0ffff	  64KB		PCI I/O space
>>   
>> -ffffffbe00000000	ffffffbffbffffff	  ~8GB		[guard, future vmmemap]
>> +ffffffbbffff0000	ffffffbcffffffff	  ~2MB		[guard]
>>   
>>   ffffffbffc000000	ffffffbfffffffff	  64MB		modules
>>   
>> diff --git a/Documentation/cgroups/memory.txt b/Documentation/cgroups/memory.txt
>> index c07f7b4..71c4da4 100644
>> --- a/Documentation/cgroups/memory.txt
>> +++ b/Documentation/cgroups/memory.txt
>> @@ -466,6 +466,10 @@ Note:
>>   5.3 swappiness
>>   
>>   Similar to /proc/sys/vm/swappiness, but affecting a hierarchy of groups only.
>> +Please note that unlike the global swappiness, memcg knob set to 0
>> +really prevents from any swapping even if there is a swap storage
>> +available. This might lead to memcg OOM killer if there are no file
>> +pages to reclaim.
>>   
>>   Following cgroups' swappiness can't be changed.
>>   - root cgroup (uses /proc/sys/vm/swappiness).
>> diff --git a/Documentation/devicetree/bindings/net/mdio-gpio.txt b/Documentation/devicetree/bindings/net/mdio-gpio.txt
>> index bc95495..c79bab0 100644
>> --- a/Documentation/devicetree/bindings/net/mdio-gpio.txt
>> +++ b/Documentation/devicetree/bindings/net/mdio-gpio.txt
>> @@ -8,9 +8,16 @@ gpios property as described in section VIII.1 in the following order:
>>   
>>   MDC, MDIO.
>>   
>> +Note: Each gpio-mdio bus should have an alias correctly numbered in "aliases"
>> +node.
>> +
>>   Example:
>>   
>> -mdio {
>> +aliases {
>> +	mdio-gpio0 = <&mdio0>;
>> +};
>> +
>> +mdio0: mdio {
>>   	compatible = "virtual,mdio-gpio";
>>   	#address-cells = <1>;
>>   	#size-cells = <0>;
>> diff --git a/Documentation/filesystems/proc.txt b/Documentation/filesystems/proc.txt
>> index a1793d6..3844d21 100644
>> --- a/Documentation/filesystems/proc.txt
>> +++ b/Documentation/filesystems/proc.txt
>> @@ -33,7 +33,7 @@ Table of Contents
>>     2	Modifying System Parameters
>>   
>>     3	Per-Process Parameters
>> -  3.1	/proc/<pid>/oom_score_adj - Adjust the oom-killer
>> +  3.1	/proc/<pid>/oom_adj & /proc/<pid>/oom_score_adj - Adjust the oom-killer
>>   								score
>>     3.2	/proc/<pid>/oom_score - Display current oom-killer score
>>     3.3	/proc/<pid>/io - Display the IO accounting fields
>> @@ -1320,10 +1320,10 @@ of the kernel.
>>   CHAPTER 3: PER-PROCESS PARAMETERS
>>   ------------------------------------------------------------------------------
>>   
>> -3.1 /proc/<pid>/oom_score_adj- Adjust the oom-killer score
>> +3.1 /proc/<pid>/oom_adj & /proc/<pid>/oom_score_adj- Adjust the oom-killer score
>>   --------------------------------------------------------------------------------
>>   
>> -This file can be used to adjust the badness heuristic used to select which
>> +These file can be used to adjust the badness heuristic used to select which
>>   process gets killed in out of memory conditions.
>>   
>>   The badness heuristic assigns a value to each candidate task ranging from 0
>> @@ -1361,6 +1361,12 @@ same system, cpuset, mempolicy, or memory controller resources to use at least
>>   equivalent to discounting 50% of the task's allowed memory from being considered
>>   as scoring against the task.
>>   
>> +For backwards compatibility with previous kernels, /proc/<pid>/oom_adj may also
>> +be used to tune the badness score.  Its acceptable values range from -16
>> +(OOM_ADJUST_MIN) to +15 (OOM_ADJUST_MAX) and a special value of -17
>> +(OOM_DISABLE) to disable oom killing entirely for that task.  Its value is
>> +scaled linearly with /proc/<pid>/oom_score_adj.
>> +
>>   The value of /proc/<pid>/oom_score_adj may be reduced no lower than the last
>>   value set by a CAP_SYS_RESOURCE process. To reduce the value any lower
>>   requires CAP_SYS_RESOURCE.
>> @@ -1375,7 +1381,9 @@ minimal amount of work.
>>   -------------------------------------------------------------
>>   
>>   This file can be used to check the current score used by the oom-killer is for
>> -any given <pid>.
>> +any given <pid>. Use it together with /proc/<pid>/oom_score_adj to tune which
>> +process should be killed in an out-of-memory situation.
>> +
>>   
>>   3.3  /proc/<pid>/io - Display the IO accounting fields
>>   -------------------------------------------------------
>> diff --git a/Documentation/hwmon/fam15h_power b/Documentation/hwmon/fam15h_power
>> index a92918e..8065481 100644
>> --- a/Documentation/hwmon/fam15h_power
>> +++ b/Documentation/hwmon/fam15h_power
>> @@ -10,7 +10,7 @@ Supported chips:
>>     BIOS and Kernel Developer's Guide (BKDG) For AMD Family 15h Processors
>>       (not yet published)
>>   
>> -Author: Andreas Herrmann <andreas.herrmann3@....com>
>> +Author: Andreas Herrmann <herrmann.der.user@...glemail.com>
>>   
>>   Description
>>   -----------
>> diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
>> index 9776f06..52e606d 100644
>> --- a/Documentation/kernel-parameters.txt
>> +++ b/Documentation/kernel-parameters.txt
>> @@ -1304,6 +1304,10 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
>>   	lapic		[X86-32,APIC] Enable the local APIC even if BIOS
>>   			disabled it.
>>   
>> +	lapic=		[x86,APIC] "notscdeadline" Do not use TSC deadline
>> +			value for LAPIC timer one-shot implementation. Default
>> +			back to the programmable timer unit in the LAPIC.
>> +
>>   	lapic_timer_c2_ok	[X86,APIC] trust the local apic timer
>>   			in C2 power state.
>>   
>> @@ -2859,6 +2863,22 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
>>   			to facilitate early boot debugging.
>>   			See also Documentation/trace/events.txt
>>   
>> +	trace_options=[option-list]
>> +			[FTRACE] Enable or disable tracer options at boot.
>> +			The option-list is a comma delimited list of options
>> +			that can be enabled or disabled just as if you were
>> +			to echo the option name into
>> +
>> +			    /sys/kernel/debug/tracing/trace_options
>> +
>> +			For example, to enable stacktrace option (to dump the
>> +			stack trace of each event), add to the command line:
>> +
>> +			      trace_options=stacktrace
>> +
>> +			See also Documentation/trace/ftrace.txt "trace options"
>> +			section.
>> +
>>   	transparent_hugepage=
>>   			[KNL]
>>   			Format: [always|madvise|never]
>> diff --git a/Documentation/networking/netdev-features.txt b/Documentation/networking/netdev-features.txt
>> index 4164f5c..f310ede 100644
>> --- a/Documentation/networking/netdev-features.txt
>> +++ b/Documentation/networking/netdev-features.txt
>> @@ -164,4 +164,4 @@ read the CRC recorded by the NIC on receipt of the packet.
>>   This requests that the NIC receive all possible frames, including errored
>>   frames (such as bad FCS, etc).  This can be helpful when sniffing a link with
>>   bad packets on it.  Some NICs may receive more packets if also put into normal
>> -PROMISC mdoe.
>> +PROMISC mode.
>> diff --git a/Documentation/scheduler/numa-problem.txt b/Documentation/scheduler/numa-problem.txt
>> index a5d2fee..7f133e3 100644
>> --- a/Documentation/scheduler/numa-problem.txt
>> +++ b/Documentation/scheduler/numa-problem.txt
>> @@ -133,6 +133,8 @@ XXX properties of this M vs a potential optimal
>>   
>>    2b) migrate memory towards 'n_i' using 2 samples.
>>   
>> +XXX include the statistical babble on double sampling somewhere near
>> +
>>   This separates pages into those that will migrate and those that will not due
>>   to the two samples not matching. We could consider the first to be of 'p_i'
>>   (private) and the second to be of 's_i' (shared).
>> @@ -142,7 +144,17 @@ This interpretation can be motivated by the previously observed property that
>>   's_i' (shared). (here we loose the need for memory limits again, since it
>>   becomes indistinguishable from shared).
>>   
>> -XXX include the statistical babble on double sampling somewhere near
>> + 2c) use cpu samples instead of node samples
>> +
>> +The problem with sampling on node granularity is that one looses 's_i' for
>> +the local node, since one cannot distinguish between two accesses from the
>> +same node.
>> +
>> +By increasing the granularity to per-cpu we gain the ability to have both an
>> +'s_i' and 'p_i' per node. Since we do all task placement per-cpu as well this
>> +seems like a natural match. The line where we overcommit cpus is where we loose
>> +granularity again, but when we loose overcommit we naturally spread tasks.
>> +Therefore it should work out nicely.
>>   
>>   This reduces the problem further; we loose 'M' as per 2a, it further reduces
>>   the 'T_k,l' (interconnect traffic) term to only include shared (since per the
>> @@ -150,12 +162,6 @@ above all private will be local):
>>   
>>     T_k,l = \Sum_i bs_i,l for every n_i = k, l != k
>>   
>> -[ more or less matches the state of sched/numa and describes its remaining
>> -  problems and assumptions. It should work well for tasks without significant
>> -  shared memory usage between tasks. ]
>> -
>> -Possible future directions:
>> -
>>   Motivated by the form of 'T_k,l', try and obtain each term of the sum, so we
>>   can evaluate it;
>>   
>> diff --git a/MAINTAINERS b/MAINTAINERS
>> index 31c4b27..0a2068f 100644
>> --- a/MAINTAINERS
>> +++ b/MAINTAINERS
>> @@ -503,7 +503,7 @@ F:	include/linux/altera_uart.h
>>   F:	include/linux/altera_jtaguart.h
>>   
>>   AMD FAM15H PROCESSOR POWER MONITORING DRIVER
>> -M:	Andreas Herrmann <andreas.herrmann3@....com>
>> +M:	Andreas Herrmann <herrmann.der.user@...glemail.com>
>>   L:	lm-sensors@...sensors.org
>>   S:	Maintained
>>   F:	Documentation/hwmon/fam15h_power
>> @@ -526,10 +526,10 @@ F:	drivers/video/geode/
>>   F:	arch/x86/include/asm/geode.h
>>   
>>   AMD IOMMU (AMD-VI)
>> -M:	Joerg Roedel <joerg.roedel@....com>
>> +M:	Joerg Roedel <joro@...tes.org>
>>   L:	iommu@...ts.linux-foundation.org
>>   T:	git git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu.git
>> -S:	Supported
>> +S:	Maintained
>>   F:	drivers/iommu/amd_iommu*.[ch]
>>   F:	include/linux/amd-iommu.h
>>   
>> @@ -841,6 +841,14 @@ T:	git git://git.kernel.org/pub/scm/linux/kernel/git/kristoffer/linux-hpc.git
>>   F:	arch/arm/mach-sa1100/jornada720.c
>>   F:	arch/arm/mach-sa1100/include/mach/jornada720.h
>>   
>> +ARM/IGEP MACHINE SUPPORT
>> +M:	Enric Balletbo i Serra <eballetbo@...il.com>
>> +M:	Javier Martinez Canillas <javier@...hile0.org>
>> +L:	linux-omap@...r.kernel.org
>> +L:	linux-arm-kernel@...ts.infradead.org (moderated for non-subscribers)
>> +S:	Maintained
>> +F:	arch/arm/mach-omap2/board-igep0020.c
>> +
>>   ARM/INCOME PXA270 SUPPORT
>>   M:	Marek Vasut <marek.vasut@...il.com>
>>   L:	linux-arm-kernel@...ts.infradead.org (moderated for non-subscribers)
>> @@ -2507,6 +2515,7 @@ M:	Joonyoung Shim <jy0922.shim@...sung.com>
>>   M:	Seung-Woo Kim <sw0312.kim@...sung.com>
>>   M:	Kyungmin Park <kyungmin.park@...sung.com>
>>   L:	dri-devel@...ts.freedesktop.org
>> +T:	git git://git.kernel.org/pub/scm/linux/kernel/git/daeinki/drm-exynos.git
>>   S:	Supported
>>   F:	drivers/gpu/drm/exynos
>>   F:	include/drm/exynos*
>> @@ -3597,6 +3606,49 @@ F:	drivers/hid/hid-hyperv.c
>>   F:	drivers/net/hyperv/
>>   F:	drivers/staging/hv/
>>   
>> +I2C OVER PARALLEL PORT
>> +M:	Jean Delvare <khali@...ux-fr.org>
>> +L:	linux-i2c@...r.kernel.org
>> +S:	Maintained
>> +F:	Documentation/i2c/busses/i2c-parport
>> +F:	Documentation/i2c/busses/i2c-parport-light
>> +F:	drivers/i2c/busses/i2c-parport.c
>> +F:	drivers/i2c/busses/i2c-parport-light.c
>> +
>> +I2C/SMBUS CONTROLLER DRIVERS FOR PC
>> +M:	Jean Delvare <khali@...ux-fr.org>
>> +L:	linux-i2c@...r.kernel.org
>> +S:	Maintained
>> +F:	Documentation/i2c/busses/i2c-ali1535
>> +F:	Documentation/i2c/busses/i2c-ali1563
>> +F:	Documentation/i2c/busses/i2c-ali15x3
>> +F:	Documentation/i2c/busses/i2c-amd756
>> +F:	Documentation/i2c/busses/i2c-amd8111
>> +F:	Documentation/i2c/busses/i2c-i801
>> +F:	Documentation/i2c/busses/i2c-nforce2
>> +F:	Documentation/i2c/busses/i2c-piix4
>> +F:	Documentation/i2c/busses/i2c-sis5595
>> +F:	Documentation/i2c/busses/i2c-sis630
>> +F:	Documentation/i2c/busses/i2c-sis96x
>> +F:	Documentation/i2c/busses/i2c-via
>> +F:	Documentation/i2c/busses/i2c-viapro
>> +F:	drivers/i2c/busses/i2c-ali1535.c
>> +F:	drivers/i2c/busses/i2c-ali1563.c
>> +F:	drivers/i2c/busses/i2c-ali15x3.c
>> +F:	drivers/i2c/busses/i2c-amd756.c
>> +F:	drivers/i2c/busses/i2c-amd756-s4882.c
>> +F:	drivers/i2c/busses/i2c-amd8111.c
>> +F:	drivers/i2c/busses/i2c-i801.c
>> +F:	drivers/i2c/busses/i2c-isch.c
>> +F:	drivers/i2c/busses/i2c-nforce2.c
>> +F:	drivers/i2c/busses/i2c-nforce2-s4985.c
>> +F:	drivers/i2c/busses/i2c-piix4.c
>> +F:	drivers/i2c/busses/i2c-sis5595.c
>> +F:	drivers/i2c/busses/i2c-sis630.c
>> +F:	drivers/i2c/busses/i2c-sis96x.c
>> +F:	drivers/i2c/busses/i2c-via.c
>> +F:	drivers/i2c/busses/i2c-viapro.c
>> +
>>   I2C/SMBUS STUB DRIVER
>>   M:	"Mark M. Hoffman" <mhoffman@...htlink.com>
>>   L:	linux-i2c@...r.kernel.org
>> @@ -3604,9 +3656,8 @@ S:	Maintained
>>   F:	drivers/i2c/busses/i2c-stub.c
>>   
>>   I2C SUBSYSTEM
>> -M:	"Jean Delvare (PC drivers, core)" <khali@...ux-fr.org>
>> +M:	Wolfram Sang <w.sang@...gutronix.de>
>>   M:	"Ben Dooks (embedded platforms)" <ben-linux@...ff.org>
>> -M:	"Wolfram Sang (embedded platforms)" <w.sang@...gutronix.de>
>>   L:	linux-i2c@...r.kernel.org
>>   W:	http://i2c.wiki.kernel.org/
>>   T:	quilt kernel.org/pub/linux/kernel/people/jdelvare/linux-2.6/jdelvare-i2c/
>> @@ -3617,6 +3668,13 @@ F:	drivers/i2c/
>>   F:	include/linux/i2c.h
>>   F:	include/linux/i2c-*.h
>>   
>> +I2C-TAOS-EVM DRIVER
>> +M:	Jean Delvare <khali@...ux-fr.org>
>> +L:	linux-i2c@...r.kernel.org
>> +S:	Maintained
>> +F:	Documentation/i2c/busses/i2c-taos-evm
>> +F:	drivers/i2c/busses/i2c-taos-evm.c
>> +
>>   I2C-TINY-USB DRIVER
>>   M:	Till Harbaum <till@...baum.org>
>>   L:	linux-i2c@...r.kernel.org
>> @@ -4230,8 +4288,8 @@ F:	include/linux/lockd/
>>   F:	include/linux/sunrpc/
>>   
>>   KERNEL VIRTUAL MACHINE (KVM)
>> -M:	Avi Kivity <avi@...hat.com>
>>   M:	Marcelo Tosatti <mtosatti@...hat.com>
>> +M:	Gleb Natapov <gleb@...hat.com>
>>   L:	kvm@...r.kernel.org
>>   W:	http://kvm.qumranet.com
>>   S:	Supported
>> @@ -5655,7 +5713,7 @@ S:	Maintained
>>   F:	drivers/pinctrl/spear/
>>   
>>   PKTCDVD DRIVER
>> -M:	Peter Osterlund <petero2@...ia.com>
>> +M:	Jiri Kosina <jkosina@...e.cz>
>>   S:	Maintained
>>   F:	drivers/block/pktcdvd.c
>>   F:	include/linux/pktcdvd.h
>> @@ -7217,6 +7275,14 @@ L:	linux-xtensa@...ux-xtensa.org
>>   S:	Maintained
>>   F:	arch/xtensa/
>>   
>> +THERMAL
>> +M:      Zhang Rui <rui.zhang@...el.com>
>> +L:      linux-pm@...r.kernel.org
>> +T:      git git://git.kernel.org/pub/scm/linux/kernel/git/rzhang/linux.git
>> +S:      Supported
>> +F:      drivers/thermal/
>> +F:      include/linux/thermal.h
>> +
>>   THINKPAD ACPI EXTRAS DRIVER
>>   M:	Henrique de Moraes Holschuh <ibm-acpi@....eng.br>
>>   L:	ibm-acpi-devel@...ts.sourceforge.net
>> @@ -7894,13 +7960,6 @@ M:	Roger Luethi <rl@...lgate.ch>
>>   S:	Maintained
>>   F:	drivers/net/ethernet/via/via-rhine.c
>>   
>> -VIAPRO SMBUS DRIVER
>> -M:	Jean Delvare <khali@...ux-fr.org>
>> -L:	linux-i2c@...r.kernel.org
>> -S:	Maintained
>> -F:	Documentation/i2c/busses/i2c-viapro
>> -F:	drivers/i2c/busses/i2c-viapro.c
>> -
>>   VIA SD/MMC CARD CONTROLLER DRIVER
>>   M:	Bruce Chang <brucechang@....com.tw>
>>   M:	Harald Welte <HaraldWelte@...tech.com>
>> diff --git a/Makefile b/Makefile
>> index 42d0e56..9f6ca12 100644
>> --- a/Makefile
>> +++ b/Makefile
>> @@ -1,7 +1,7 @@
>>   VERSION = 3
>>   PATCHLEVEL = 7
>>   SUBLEVEL = 0
>> -EXTRAVERSION = -rc3
>> +EXTRAVERSION = -rc6
>>   NAME = Terrified Chipmunk
>>   
>>   # *DOCUMENTATION*
>> diff --git a/arch/alpha/kernel/osf_sys.c b/arch/alpha/kernel/osf_sys.c
>> index 1e6956a..14db93e 100644
>> --- a/arch/alpha/kernel/osf_sys.c
>> +++ b/arch/alpha/kernel/osf_sys.c
>> @@ -445,7 +445,7 @@ struct procfs_args {
>>    * unhappy with OSF UFS. [CHECKME]
>>    */
>>   static int
>> -osf_ufs_mount(char *dirname, struct ufs_args __user *args, int flags)
>> +osf_ufs_mount(const char *dirname, struct ufs_args __user *args, int flags)
>>   {
>>   	int retval;
>>   	struct cdfs_args tmp;
>> @@ -465,7 +465,7 @@ osf_ufs_mount(char *dirname, struct ufs_args __user *args, int flags)
>>   }
>>   
>>   static int
>> -osf_cdfs_mount(char *dirname, struct cdfs_args __user *args, int flags)
>> +osf_cdfs_mount(const char *dirname, struct cdfs_args __user *args, int flags)
>>   {
>>   	int retval;
>>   	struct cdfs_args tmp;
>> @@ -485,7 +485,7 @@ osf_cdfs_mount(char *dirname, struct cdfs_args __user *args, int flags)
>>   }
>>   
>>   static int
>> -osf_procfs_mount(char *dirname, struct procfs_args __user *args, int flags)
>> +osf_procfs_mount(const char *dirname, struct procfs_args __user *args, int flags)
>>   {
>>   	struct procfs_args tmp;
>>   
>> diff --git a/arch/arm/boot/Makefile b/arch/arm/boot/Makefile
>> index f2aa09e..9137df5 100644
>> --- a/arch/arm/boot/Makefile
>> +++ b/arch/arm/boot/Makefile
>> @@ -33,7 +33,7 @@ ifeq ($(CONFIG_XIP_KERNEL),y)
>>   
>>   $(obj)/xipImage: vmlinux FORCE
>>   	$(call if_changed,objcopy)
>> -	$(kecho) '  Kernel: $@ is ready (physical address: $(CONFIG_XIP_PHYS_ADDR))'
>> +	@$(kecho) '  Kernel: $@ is ready (physical address: $(CONFIG_XIP_PHYS_ADDR))'
>>   
>>   $(obj)/Image $(obj)/zImage: FORCE
>>   	@echo 'Kernel configured for XIP (CONFIG_XIP_KERNEL=y)'
>> @@ -48,14 +48,14 @@ $(obj)/xipImage: FORCE
>>   
>>   $(obj)/Image: vmlinux FORCE
>>   	$(call if_changed,objcopy)
>> -	$(kecho) '  Kernel: $@ is ready'
>> +	@$(kecho) '  Kernel: $@ is ready'
>>   
>>   $(obj)/compressed/vmlinux: $(obj)/Image FORCE
>>   	$(Q)$(MAKE) $(build)=$(obj)/compressed $@
>>   
>>   $(obj)/zImage:	$(obj)/compressed/vmlinux FORCE
>>   	$(call if_changed,objcopy)
>> -	$(kecho) '  Kernel: $@ is ready'
>> +	@$(kecho) '  Kernel: $@ is ready'
>>   
>>   endif
>>   
>> @@ -90,7 +90,7 @@ fi
>>   $(obj)/uImage:	$(obj)/zImage FORCE
>>   	@$(check_for_multiple_loadaddr)
>>   	$(call if_changed,uimage)
>> -	$(kecho) '  Image $@ is ready'
>> +	@$(kecho) '  Image $@ is ready'
>>   
>>   $(obj)/bootp/bootp: $(obj)/zImage initrd FORCE
>>   	$(Q)$(MAKE) $(build)=$(obj)/bootp $@
>> @@ -98,7 +98,7 @@ $(obj)/bootp/bootp: $(obj)/zImage initrd FORCE
>>   
>>   $(obj)/bootpImage: $(obj)/bootp/bootp FORCE
>>   	$(call if_changed,objcopy)
>> -	$(kecho) '  Kernel: $@ is ready'
>> +	@$(kecho) '  Kernel: $@ is ready'
>>   
>>   PHONY += initrd FORCE
>>   initrd:
>> diff --git a/arch/arm/boot/dts/tegra30.dtsi b/arch/arm/boot/dts/tegra30.dtsi
>> index b1497c7..df7f227 100644
>> --- a/arch/arm/boot/dts/tegra30.dtsi
>> +++ b/arch/arm/boot/dts/tegra30.dtsi
>> @@ -73,8 +73,8 @@
>>   
>>   	pinmux: pinmux {
>>   		compatible = "nvidia,tegra30-pinmux";
>> -		reg = <0x70000868 0xd0    /* Pad control registers */
>> -		       0x70003000 0x3e0>; /* Mux registers */
>> +		reg = <0x70000868 0xd4    /* Pad control registers */
>> +		       0x70003000 0x3e4>; /* Mux registers */
>>   	};
>>   
>>   	serial@...06000 {
>> diff --git a/arch/arm/include/asm/io.h b/arch/arm/include/asm/io.h
>> index 35c1ed8..42f042e 100644
>> --- a/arch/arm/include/asm/io.h
>> +++ b/arch/arm/include/asm/io.h
>> @@ -64,7 +64,7 @@ extern void __raw_readsl(const void __iomem *addr, void *data, int longlen);
>>   static inline void __raw_writew(u16 val, volatile void __iomem *addr)
>>   {
>>   	asm volatile("strh %1, %0"
>> -		     : "+Qo" (*(volatile u16 __force *)addr)
>> +		     : "+Q" (*(volatile u16 __force *)addr)
>>   		     : "r" (val));
>>   }
>>   
>> @@ -72,7 +72,7 @@ static inline u16 __raw_readw(const volatile void __iomem *addr)
>>   {
>>   	u16 val;
>>   	asm volatile("ldrh %1, %0"
>> -		     : "+Qo" (*(volatile u16 __force *)addr),
>> +		     : "+Q" (*(volatile u16 __force *)addr),
>>   		       "=r" (val));
>>   	return val;
>>   }
>> diff --git a/arch/arm/include/asm/sched_clock.h b/arch/arm/include/asm/sched_clock.h
>> index 05b8e82..e3f7572 100644
>> --- a/arch/arm/include/asm/sched_clock.h
>> +++ b/arch/arm/include/asm/sched_clock.h
>> @@ -10,7 +10,5 @@
>>   
>>   extern void sched_clock_postinit(void);
>>   extern void setup_sched_clock(u32 (*read)(void), int bits, unsigned long rate);
>> -extern void setup_sched_clock_needs_suspend(u32 (*read)(void), int bits,
>> -		unsigned long rate);
>>   
>>   #endif
>> diff --git a/arch/arm/include/asm/vfpmacros.h b/arch/arm/include/asm/vfpmacros.h
>> index 6a6f1e4..301c1db 100644
>> --- a/arch/arm/include/asm/vfpmacros.h
>> +++ b/arch/arm/include/asm/vfpmacros.h
>> @@ -27,9 +27,9 @@
>>   #if __LINUX_ARM_ARCH__ <= 6
>>   	ldr	\tmp, =elf_hwcap		    @ may not have MVFR regs
>>   	ldr	\tmp, [\tmp, #0]
>> -	tst	\tmp, #HWCAP_VFPv3D16
>> -	ldceql	p11, cr0, [\base],#32*4		    @ FLDMIAD \base!, {d16-d31}
>> -	addne	\base, \base, #32*4		    @ step over unused register space
>> +	tst	\tmp, #HWCAP_VFPD32
>> +	ldcnel	p11, cr0, [\base],#32*4		    @ FLDMIAD \base!, {d16-d31}
>> +	addeq	\base, \base, #32*4		    @ step over unused register space
>>   #else
>>   	VFPFMRX	\tmp, MVFR0			    @ Media and VFP Feature Register 0
>>   	and	\tmp, \tmp, #MVFR0_A_SIMD_MASK	    @ A_SIMD field
>> @@ -51,9 +51,9 @@
>>   #if __LINUX_ARM_ARCH__ <= 6
>>   	ldr	\tmp, =elf_hwcap		    @ may not have MVFR regs
>>   	ldr	\tmp, [\tmp, #0]
>> -	tst	\tmp, #HWCAP_VFPv3D16
>> -	stceql	p11, cr0, [\base],#32*4		    @ FSTMIAD \base!, {d16-d31}
>> -	addne	\base, \base, #32*4		    @ step over unused register space
>> +	tst	\tmp, #HWCAP_VFPD32
>> +	stcnel	p11, cr0, [\base],#32*4		    @ FSTMIAD \base!, {d16-d31}
>> +	addeq	\base, \base, #32*4		    @ step over unused register space
>>   #else
>>   	VFPFMRX	\tmp, MVFR0			    @ Media and VFP Feature Register 0
>>   	and	\tmp, \tmp, #MVFR0_A_SIMD_MASK	    @ A_SIMD field
>> diff --git a/arch/arm/include/uapi/asm/hwcap.h b/arch/arm/include/uapi/asm/hwcap.h
>> index f254f65..3688fd1 100644
>> --- a/arch/arm/include/uapi/asm/hwcap.h
>> +++ b/arch/arm/include/uapi/asm/hwcap.h
>> @@ -18,11 +18,12 @@
>>   #define HWCAP_THUMBEE	(1 << 11)
>>   #define HWCAP_NEON	(1 << 12)
>>   #define HWCAP_VFPv3	(1 << 13)
>> -#define HWCAP_VFPv3D16	(1 << 14)
>> +#define HWCAP_VFPv3D16	(1 << 14)	/* also set for VFPv4-D16 */
>>   #define HWCAP_TLS	(1 << 15)
>>   #define HWCAP_VFPv4	(1 << 16)
>>   #define HWCAP_IDIVA	(1 << 17)
>>   #define HWCAP_IDIVT	(1 << 18)
>> +#define HWCAP_VFPD32	(1 << 19)	/* set if VFP has 32 regs (not 16) */
>>   #define HWCAP_IDIV	(HWCAP_IDIVA | HWCAP_IDIVT)
>>   
>>   
>> diff --git a/arch/arm/kernel/sched_clock.c b/arch/arm/kernel/sched_clock.c
>> index e21bac2..fc6692e 100644
>> --- a/arch/arm/kernel/sched_clock.c
>> +++ b/arch/arm/kernel/sched_clock.c
>> @@ -107,13 +107,6 @@ static void sched_clock_poll(unsigned long wrap_ticks)
>>   	update_sched_clock();
>>   }
>>   
>> -void __init setup_sched_clock_needs_suspend(u32 (*read)(void), int bits,
>> -		unsigned long rate)
>> -{
>> -	setup_sched_clock(read, bits, rate);
>> -	cd.needs_suspend = true;
>> -}
>> -
>>   void __init setup_sched_clock(u32 (*read)(void), int bits, unsigned long rate)
>>   {
>>   	unsigned long r, w;
>> @@ -189,18 +182,15 @@ void __init sched_clock_postinit(void)
>>   static int sched_clock_suspend(void)
>>   {
>>   	sched_clock_poll(sched_clock_timer.data);
>> -	if (cd.needs_suspend)
>> -		cd.suspended = true;
>> +	cd.suspended = true;
>>   	return 0;
>>   }
>>   
>>   static void sched_clock_resume(void)
>>   {
>> -	if (cd.needs_suspend) {
>> -		cd.epoch_cyc = read_sched_clock();
>> -		cd.epoch_cyc_copy = cd.epoch_cyc;
>> -		cd.suspended = false;
>> -	}
>> +	cd.epoch_cyc = read_sched_clock();
>> +	cd.epoch_cyc_copy = cd.epoch_cyc;
>> +	cd.suspended = false;
>>   }
>>   
>>   static struct syscore_ops sched_clock_ops = {
>> diff --git a/arch/arm/mach-at91/at91rm9200_devices.c b/arch/arm/mach-at91/at91rm9200_devices.c
>> index 1e122bc..3cee0e6 100644
>> --- a/arch/arm/mach-at91/at91rm9200_devices.c
>> +++ b/arch/arm/mach-at91/at91rm9200_devices.c
>> @@ -68,7 +68,7 @@ void __init at91_add_device_usbh(struct at91_usbh_data *data)
>>   
>>   	/* Enable overcurrent notification */
>>   	for (i = 0; i < data->ports; i++) {
>> -		if (data->overcurrent_pin[i])
>> +		if (gpio_is_valid(data->overcurrent_pin[i]))
>>   			at91_set_gpio_input(data->overcurrent_pin[i], 1);
>>   	}
>>   
>> diff --git a/arch/arm/mach-at91/at91sam9260_devices.c b/arch/arm/mach-at91/at91sam9260_devices.c
>> index aa1e587..414bd85 100644
>> --- a/arch/arm/mach-at91/at91sam9260_devices.c
>> +++ b/arch/arm/mach-at91/at91sam9260_devices.c
>> @@ -72,7 +72,7 @@ void __init at91_add_device_usbh(struct at91_usbh_data *data)
>>   
>>   	/* Enable overcurrent notification */
>>   	for (i = 0; i < data->ports; i++) {
>> -		if (data->overcurrent_pin[i])
>> +		if (gpio_is_valid(data->overcurrent_pin[i]))
>>   			at91_set_gpio_input(data->overcurrent_pin[i], 1);
>>   	}
>>   
>> diff --git a/arch/arm/mach-at91/at91sam9261_devices.c b/arch/arm/mach-at91/at91sam9261_devices.c
>> index b948769..cd604aa 100644
>> --- a/arch/arm/mach-at91/at91sam9261_devices.c
>> +++ b/arch/arm/mach-at91/at91sam9261_devices.c
>> @@ -72,7 +72,7 @@ void __init at91_add_device_usbh(struct at91_usbh_data *data)
>>   
>>   	/* Enable overcurrent notification */
>>   	for (i = 0; i < data->ports; i++) {
>> -		if (data->overcurrent_pin[i])
>> +		if (gpio_is_valid(data->overcurrent_pin[i]))
>>   			at91_set_gpio_input(data->overcurrent_pin[i], 1);
>>   	}
>>   
>> diff --git a/arch/arm/mach-at91/at91sam9263_devices.c b/arch/arm/mach-at91/at91sam9263_devices.c
>> index cb85da2..9c61e59 100644
>> --- a/arch/arm/mach-at91/at91sam9263_devices.c
>> +++ b/arch/arm/mach-at91/at91sam9263_devices.c
>> @@ -78,7 +78,7 @@ void __init at91_add_device_usbh(struct at91_usbh_data *data)
>>   
>>   	/* Enable overcurrent notification */
>>   	for (i = 0; i < data->ports; i++) {
>> -		if (data->overcurrent_pin[i])
>> +		if (gpio_is_valid(data->overcurrent_pin[i]))
>>   			at91_set_gpio_input(data->overcurrent_pin[i], 1);
>>   	}
>>   
>> diff --git a/arch/arm/mach-at91/at91sam9g45_devices.c b/arch/arm/mach-at91/at91sam9g45_devices.c
>> index b159607..fcd233c 100644
>> --- a/arch/arm/mach-at91/at91sam9g45_devices.c
>> +++ b/arch/arm/mach-at91/at91sam9g45_devices.c
>> @@ -1841,8 +1841,8 @@ static struct resource sha_resources[] = {
>>   		.flags	= IORESOURCE_MEM,
>>   	},
>>   	[1] = {
>> -		.start	= AT91SAM9G45_ID_AESTDESSHA,
>> -		.end	= AT91SAM9G45_ID_AESTDESSHA,
>> +		.start	= NR_IRQS_LEGACY + AT91SAM9G45_ID_AESTDESSHA,
>> +		.end	= NR_IRQS_LEGACY + AT91SAM9G45_ID_AESTDESSHA,
>>   		.flags	= IORESOURCE_IRQ,
>>   	},
>>   };
>> @@ -1874,8 +1874,8 @@ static struct resource tdes_resources[] = {
>>   		.flags	= IORESOURCE_MEM,
>>   	},
>>   	[1] = {
>> -		.start	= AT91SAM9G45_ID_AESTDESSHA,
>> -		.end	= AT91SAM9G45_ID_AESTDESSHA,
>> +		.start	= NR_IRQS_LEGACY + AT91SAM9G45_ID_AESTDESSHA,
>> +		.end	= NR_IRQS_LEGACY + AT91SAM9G45_ID_AESTDESSHA,
>>   		.flags	= IORESOURCE_IRQ,
>>   	},
>>   };
>> @@ -1910,8 +1910,8 @@ static struct resource aes_resources[] = {
>>   		.flags	= IORESOURCE_MEM,
>>   	},
>>   	[1] = {
>> -		.start	= AT91SAM9G45_ID_AESTDESSHA,
>> -		.end	= AT91SAM9G45_ID_AESTDESSHA,
>> +		.start	= NR_IRQS_LEGACY + AT91SAM9G45_ID_AESTDESSHA,
>> +		.end	= NR_IRQS_LEGACY + AT91SAM9G45_ID_AESTDESSHA,
>>   		.flags	= IORESOURCE_IRQ,
>>   	},
>>   };
>> diff --git a/arch/arm/mach-davinci/dm644x.c b/arch/arm/mach-davinci/dm644x.c
>> index cd0c8b1..14e9947 100644
>> --- a/arch/arm/mach-davinci/dm644x.c
>> +++ b/arch/arm/mach-davinci/dm644x.c
>> @@ -713,8 +713,7 @@ static int dm644x_venc_setup_clock(enum vpbe_enc_timings_type type,
>>   		break;
>>   	case VPBE_ENC_CUSTOM_TIMINGS:
>>   		if (pclock <= 27000000) {
>> -			v |= DM644X_VPSS_MUXSEL_PLL2_MODE |
>> -			     DM644X_VPSS_DACCLKEN;
>> +			v |= DM644X_VPSS_DACCLKEN;
>>   			writel(v, DAVINCI_SYSMOD_VIRT(SYSMOD_VPSS_CLKCTL));
>>   		} else {
>>   			/*
>> diff --git a/arch/arm/mach-highbank/system.c b/arch/arm/mach-highbank/system.c
>> index 82c2723..86e37cd 100644
>> --- a/arch/arm/mach-highbank/system.c
>> +++ b/arch/arm/mach-highbank/system.c
>> @@ -28,6 +28,7 @@ void highbank_restart(char mode, const char *cmd)
>>   		hignbank_set_pwr_soft_reset();
>>   
>>   	scu_power_mode(scu_base_addr, SCU_PM_POWEROFF);
>> -	cpu_do_idle();
>> +	while (1)
>> +		cpu_do_idle();
>>   }
>>   
>> diff --git a/arch/arm/mach-imx/clk-gate2.c b/arch/arm/mach-imx/clk-gate2.c
>> index 3c1b8ff..cc49c7a 100644
>> --- a/arch/arm/mach-imx/clk-gate2.c
>> +++ b/arch/arm/mach-imx/clk-gate2.c
>> @@ -112,7 +112,7 @@ struct clk *clk_register_gate2(struct device *dev, const char *name,
>>   
>>   	clk = clk_register(dev, &gate->hw);
>>   	if (IS_ERR(clk))
>> -		kfree(clk);
>> +		kfree(gate);
>>   
>>   	return clk;
>>   }
>> diff --git a/arch/arm/mach-imx/ehci-imx25.c b/arch/arm/mach-imx/ehci-imx25.c
>> index 412c583..576af74 100644
>> --- a/arch/arm/mach-imx/ehci-imx25.c
>> +++ b/arch/arm/mach-imx/ehci-imx25.c
>> @@ -30,7 +30,7 @@
>>   #define MX25_H1_SIC_SHIFT	21
>>   #define MX25_H1_SIC_MASK	(0x3 << MX25_H1_SIC_SHIFT)
>>   #define MX25_H1_PP_BIT		(1 << 18)
>> -#define MX25_H1_PM_BIT		(1 << 8)
>> +#define MX25_H1_PM_BIT		(1 << 16)
>>   #define MX25_H1_IPPUE_UP_BIT	(1 << 7)
>>   #define MX25_H1_IPPUE_DOWN_BIT	(1 << 6)
>>   #define MX25_H1_TLL_BIT		(1 << 5)
>> diff --git a/arch/arm/mach-imx/ehci-imx35.c b/arch/arm/mach-imx/ehci-imx35.c
>> index 779e16e..2933978 100644
>> --- a/arch/arm/mach-imx/ehci-imx35.c
>> +++ b/arch/arm/mach-imx/ehci-imx35.c
>> @@ -30,7 +30,7 @@
>>   #define MX35_H1_SIC_SHIFT	21
>>   #define MX35_H1_SIC_MASK	(0x3 << MX35_H1_SIC_SHIFT)
>>   #define MX35_H1_PP_BIT		(1 << 18)
>> -#define MX35_H1_PM_BIT		(1 << 8)
>> +#define MX35_H1_PM_BIT		(1 << 16)
>>   #define MX35_H1_IPPUE_UP_BIT	(1 << 7)
>>   #define MX35_H1_IPPUE_DOWN_BIT	(1 << 6)
>>   #define MX35_H1_TLL_BIT		(1 << 5)
>> diff --git a/arch/arm/mach-omap2/board-igep0020.c b/arch/arm/mach-omap2/board-igep0020.c
>> index 48d5e41..3785906 100644
>> --- a/arch/arm/mach-omap2/board-igep0020.c
>> +++ b/arch/arm/mach-omap2/board-igep0020.c
>> @@ -580,6 +580,11 @@ static void __init igep_wlan_bt_init(void)
>>   	} else
>>   		return;
>>   
>> +	/* Make sure that the GPIO pins are muxed correctly */
>> +	omap_mux_init_gpio(igep_wlan_bt_gpios[0].gpio, OMAP_PIN_OUTPUT);
>> +	omap_mux_init_gpio(igep_wlan_bt_gpios[1].gpio, OMAP_PIN_OUTPUT);
>> +	omap_mux_init_gpio(igep_wlan_bt_gpios[2].gpio, OMAP_PIN_OUTPUT);
>> +
>>   	err = gpio_request_array(igep_wlan_bt_gpios,
>>   				 ARRAY_SIZE(igep_wlan_bt_gpios));
>>   	if (err) {
>> diff --git a/arch/arm/mach-omap2/clockdomains44xx_data.c b/arch/arm/mach-omap2/clockdomains44xx_data.c
>> index b56d06b..95192a0 100644
>> --- a/arch/arm/mach-omap2/clockdomains44xx_data.c
>> +++ b/arch/arm/mach-omap2/clockdomains44xx_data.c
>> @@ -359,7 +359,7 @@ static struct clockdomain iss_44xx_clkdm = {
>>   	.clkdm_offs	  = OMAP4430_CM2_CAM_CAM_CDOFFS,
>>   	.wkdep_srcs	  = iss_wkup_sleep_deps,
>>   	.sleepdep_srcs	  = iss_wkup_sleep_deps,
>> -	.flags		  = CLKDM_CAN_HWSUP_SWSUP,
>> +	.flags		  = CLKDM_CAN_SWSUP,
>>   };
>>   
>>   static struct clockdomain l3_dss_44xx_clkdm = {
>> diff --git a/arch/arm/mach-omap2/devices.c b/arch/arm/mach-omap2/devices.c
>> index cba60e0..c72b5a7 100644
>> --- a/arch/arm/mach-omap2/devices.c
>> +++ b/arch/arm/mach-omap2/devices.c
>> @@ -19,6 +19,7 @@
>>   #include <linux/of.h>
>>   #include <linux/pinctrl/machine.h>
>>   #include <linux/platform_data/omap4-keypad.h>
>> +#include <linux/platform_data/omap_ocp2scp.h>
>>   
>>   #include <asm/mach-types.h>
>>   #include <asm/mach/map.h>
>> @@ -613,6 +614,83 @@ static void omap_init_vout(void)
>>   static inline void omap_init_vout(void) {}
>>   #endif
>>   
>> +#if defined(CONFIG_OMAP_OCP2SCP) || defined(CONFIG_OMAP_OCP2SCP_MODULE)
>> +static int count_ocp2scp_devices(struct omap_ocp2scp_dev *ocp2scp_dev)
>> +{
>> +	int cnt	= 0;
>> +
>> +	while (ocp2scp_dev->drv_name != NULL) {
>> +		cnt++;
>> +		ocp2scp_dev++;
>> +	}
>> +
>> +	return cnt;
>> +}
>> +
>> +static void omap_init_ocp2scp(void)
>> +{
>> +	struct omap_hwmod	*oh;
>> +	struct platform_device	*pdev;
>> +	int			bus_id = -1, dev_cnt = 0, i;
>> +	struct omap_ocp2scp_dev	*ocp2scp_dev;
>> +	const char		*oh_name, *name;
>> +	struct omap_ocp2scp_platform_data *pdata;
>> +
>> +	if (!cpu_is_omap44xx())
>> +		return;
>> +
>> +	oh_name = "ocp2scp_usb_phy";
>> +	name	= "omap-ocp2scp";
>> +
>> +	oh = omap_hwmod_lookup(oh_name);
>> +	if (!oh) {
>> +		pr_err("%s: could not find omap_hwmod for %s\n", __func__,
>> +								oh_name);
>> +		return;
>> +	}
>> +
>> +	pdata = kzalloc(sizeof(*pdata), GFP_KERNEL);
>> +	if (!pdata) {
>> +		pr_err("%s: No memory for ocp2scp pdata\n", __func__);
>> +		return;
>> +	}
>> +
>> +	ocp2scp_dev = oh->dev_attr;
>> +	dev_cnt = count_ocp2scp_devices(ocp2scp_dev);
>> +
>> +	if (!dev_cnt) {
>> +		pr_err("%s: No devices connected to ocp2scp\n", __func__);
>> +		kfree(pdata);
>> +		return;
>> +	}
>> +
>> +	pdata->devices = kzalloc(sizeof(struct omap_ocp2scp_dev *)
>> +					* dev_cnt, GFP_KERNEL);
>> +	if (!pdata->devices) {
>> +		pr_err("%s: No memory for ocp2scp pdata devices\n", __func__);
>> +		kfree(pdata);
>> +		return;
>> +	}
>> +
>> +	for (i = 0; i < dev_cnt; i++, ocp2scp_dev++)
>> +		pdata->devices[i] = ocp2scp_dev;
>> +
>> +	pdata->dev_cnt	= dev_cnt;
>> +
>> +	pdev = omap_device_build(name, bus_id, oh, pdata, sizeof(*pdata), NULL,
>> +								0, false);
>> +	if (IS_ERR(pdev)) {
>> +		pr_err("Could not build omap_device for %s %s\n",
>> +						name, oh_name);
>> +		kfree(pdata->devices);
>> +		kfree(pdata);
>> +		return;
>> +	}
>> +}
>> +#else
>> +static inline void omap_init_ocp2scp(void) { }
>> +#endif
>> +
>>   /*-------------------------------------------------------------------------*/
>>   
>>   static int __init omap2_init_devices(void)
>> @@ -640,6 +718,7 @@ static int __init omap2_init_devices(void)
>>   	omap_init_sham();
>>   	omap_init_aes();
>>   	omap_init_vout();
>> +	omap_init_ocp2scp();
>>   
>>   	return 0;
>>   }
>> diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c
>> index b969ab1..87cc6d0 100644
>> --- a/arch/arm/mach-omap2/omap_hwmod.c
>> +++ b/arch/arm/mach-omap2/omap_hwmod.c
>> @@ -422,6 +422,38 @@ static int _set_softreset(struct omap_hwmod *oh, u32 *v)
>>   }
>>   
>>   /**
>> + * _wait_softreset_complete - wait for an OCP softreset to complete
>> + * @oh: struct omap_hwmod * to wait on
>> + *
>> + * Wait until the IP block represented by @oh reports that its OCP
>> + * softreset is complete.  This can be triggered by software (see
>> + * _ocp_softreset()) or by hardware upon returning from off-mode (one
>> + * example is HSMMC).  Waits for up to MAX_MODULE_SOFTRESET_WAIT
>> + * microseconds.  Returns the number of microseconds waited.
>> + */
>> +static int _wait_softreset_complete(struct omap_hwmod *oh)
>> +{
>> +	struct omap_hwmod_class_sysconfig *sysc;
>> +	u32 softrst_mask;
>> +	int c = 0;
>> +
>> +	sysc = oh->class->sysc;
>> +
>> +	if (sysc->sysc_flags & SYSS_HAS_RESET_STATUS)
>> +		omap_test_timeout((omap_hwmod_read(oh, sysc->syss_offs)
>> +				   & SYSS_RESETDONE_MASK),
>> +				  MAX_MODULE_SOFTRESET_WAIT, c);
>> +	else if (sysc->sysc_flags & SYSC_HAS_RESET_STATUS) {
>> +		softrst_mask = (0x1 << sysc->sysc_fields->srst_shift);
>> +		omap_test_timeout(!(omap_hwmod_read(oh, sysc->sysc_offs)
>> +				    & softrst_mask),
>> +				  MAX_MODULE_SOFTRESET_WAIT, c);
>> +	}
>> +
>> +	return c;
>> +}
>> +
>> +/**
>>    * _set_dmadisable: set OCP_SYSCONFIG.DMADISABLE bit in @v
>>    * @oh: struct omap_hwmod *
>>    *
>> @@ -1282,6 +1314,18 @@ static void _enable_sysc(struct omap_hwmod *oh)
>>   	if (!oh->class->sysc)
>>   		return;
>>   
>> +	/*
>> +	 * Wait until reset has completed, this is needed as the IP
>> +	 * block is reset automatically by hardware in some cases
>> +	 * (off-mode for example), and the drivers require the
>> +	 * IP to be ready when they access it
>> +	 */
>> +	if (oh->flags & HWMOD_CONTROL_OPT_CLKS_IN_RESET)
>> +		_enable_optional_clocks(oh);
>> +	_wait_softreset_complete(oh);
>> +	if (oh->flags & HWMOD_CONTROL_OPT_CLKS_IN_RESET)
>> +		_disable_optional_clocks(oh);
>> +
>>   	v = oh->_sysc_cache;
>>   	sf = oh->class->sysc->sysc_flags;
>>   
>> @@ -1804,7 +1848,7 @@ static int _am33xx_disable_module(struct omap_hwmod *oh)
>>    */
>>   static int _ocp_softreset(struct omap_hwmod *oh)
>>   {
>> -	u32 v, softrst_mask;
>> +	u32 v;
>>   	int c = 0;
>>   	int ret = 0;
>>   
>> @@ -1834,19 +1878,7 @@ static int _ocp_softreset(struct omap_hwmod *oh)
>>   	if (oh->class->sysc->srst_udelay)
>>   		udelay(oh->class->sysc->srst_udelay);
>>   
>> -	if (oh->class->sysc->sysc_flags & SYSS_HAS_RESET_STATUS)
>> -		omap_test_timeout((omap_hwmod_read(oh,
>> -						    oh->class->sysc->syss_offs)
>> -				   & SYSS_RESETDONE_MASK),
>> -				  MAX_MODULE_SOFTRESET_WAIT, c);
>> -	else if (oh->class->sysc->sysc_flags & SYSC_HAS_RESET_STATUS) {
>> -		softrst_mask = (0x1 << oh->class->sysc->sysc_fields->srst_shift);
>> -		omap_test_timeout(!(omap_hwmod_read(oh,
>> -						     oh->class->sysc->sysc_offs)
>> -				   & softrst_mask),
>> -				  MAX_MODULE_SOFTRESET_WAIT, c);
>> -	}
>> -
>> +	c = _wait_softreset_complete(oh);
>>   	if (c == MAX_MODULE_SOFTRESET_WAIT)
>>   		pr_warning("omap_hwmod: %s: softreset failed (waited %d usec)\n",
>>   			   oh->name, MAX_MODULE_SOFTRESET_WAIT);
>> @@ -2352,6 +2384,9 @@ static int __init _setup_reset(struct omap_hwmod *oh)
>>   	if (oh->_state != _HWMOD_STATE_INITIALIZED)
>>   		return -EINVAL;
>>   
>> +	if (oh->flags & HWMOD_EXT_OPT_MAIN_CLK)
>> +		return -EPERM;
>> +
>>   	if (oh->rst_lines_cnt == 0) {
>>   		r = _enable(oh);
>>   		if (r) {
>> diff --git a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c
>> index 652d028..0b1249e 100644
>> --- a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c
>> +++ b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c
>> @@ -21,6 +21,7 @@
>>   #include <linux/io.h>
>>   #include <linux/platform_data/gpio-omap.h>
>>   #include <linux/power/smartreflex.h>
>> +#include <linux/platform_data/omap_ocp2scp.h>
>>   
>>   #include <plat/omap_hwmod.h>
>>   #include <plat/i2c.h>
>> @@ -2125,6 +2126,14 @@ static struct omap_hwmod omap44xx_mcpdm_hwmod = {
>>   	.name		= "mcpdm",
>>   	.class		= &omap44xx_mcpdm_hwmod_class,
>>   	.clkdm_name	= "abe_clkdm",
>> +	/*
>> +	 * It's suspected that the McPDM requires an off-chip main
>> +	 * functional clock, controlled via I2C.  This IP block is
>> +	 * currently reset very early during boot, before I2C is
>> +	 * available, so it doesn't seem that we have any choice in
>> +	 * the kernel other than to avoid resetting it.
>> +	 */
>> +	.flags		= HWMOD_EXT_OPT_MAIN_CLK,
>>   	.mpu_irqs	= omap44xx_mcpdm_irqs,
>>   	.sdma_reqs	= omap44xx_mcpdm_sdma_reqs,
>>   	.main_clk	= "mcpdm_fck",
>> @@ -2681,6 +2690,32 @@ static struct omap_hwmod_class omap44xx_ocp2scp_hwmod_class = {
>>   	.sysc	= &omap44xx_ocp2scp_sysc,
>>   };
>>   
>> +/* ocp2scp dev_attr */
>> +static struct resource omap44xx_usb_phy_and_pll_addrs[] = {
>> +	{
>> +		.name		= "usb_phy",
>> +		.start		= 0x4a0ad080,
>> +		.end		= 0x4a0ae000,
>> +		.flags		= IORESOURCE_MEM,
>> +	},
>> +	{
>> +		/* XXX: Remove this once control module driver is in place */
>> +		.name		= "ctrl_dev",
>> +		.start		= 0x4a002300,
>> +		.end		= 0x4a002303,
>> +		.flags		= IORESOURCE_MEM,
>> +	},
>> +	{ }
>> +};
>> +
>> +static struct omap_ocp2scp_dev ocp2scp_dev_attr[] = {
>> +	{
>> +		.drv_name       = "omap-usb2",
>> +		.res		= omap44xx_usb_phy_and_pll_addrs,
>> +	},
>> +	{ }
>> +};
>> +
>>   /* ocp2scp_usb_phy */
>>   static struct omap_hwmod omap44xx_ocp2scp_usb_phy_hwmod = {
>>   	.name		= "ocp2scp_usb_phy",
>> @@ -2694,6 +2729,7 @@ static struct omap_hwmod omap44xx_ocp2scp_usb_phy_hwmod = {
>>   			.modulemode   = MODULEMODE_HWCTRL,
>>   		},
>>   	},
>> +	.dev_attr	= ocp2scp_dev_attr,
>>   };
>>   
>>   /*
>> diff --git a/arch/arm/mach-omap2/twl-common.c b/arch/arm/mach-omap2/twl-common.c
>> index 635e109..a256135 100644
>> --- a/arch/arm/mach-omap2/twl-common.c
>> +++ b/arch/arm/mach-omap2/twl-common.c
>> @@ -73,6 +73,7 @@ void __init omap4_pmic_init(const char *pmic_type,
>>   {
>>   	/* PMIC part*/
>>   	omap_mux_init_signal("sys_nirq1", OMAP_PIN_INPUT_PULLUP | OMAP_PIN_OFF_WAKEUPENABLE);
>> +	omap_mux_init_signal("fref_clk0_out.sys_drm_msecure", OMAP_PIN_OUTPUT);
>>   	omap_pmic_init(1, 400, pmic_type, 7 + OMAP44XX_IRQ_GIC_START, pmic_data);
>>   
>>   	/* Register additional devices on i2c1 bus if needed */
>> @@ -366,7 +367,7 @@ static struct regulator_init_data omap4_clk32kg_idata = {
>>   };
>>   
>>   static struct regulator_consumer_supply omap4_vdd1_supply[] = {
>> -	REGULATOR_SUPPLY("vcc", "mpu.0"),
>> +	REGULATOR_SUPPLY("vcc", "cpu0"),
>>   };
>>   
>>   static struct regulator_consumer_supply omap4_vdd2_supply[] = {
>> diff --git a/arch/arm/mach-omap2/vc.c b/arch/arm/mach-omap2/vc.c
>> index 880249b..75878c3 100644
>> --- a/arch/arm/mach-omap2/vc.c
>> +++ b/arch/arm/mach-omap2/vc.c
>> @@ -264,7 +264,7 @@ static void __init omap_vc_i2c_init(struct voltagedomain *voltdm)
>>   
>>   	if (initialized) {
>>   		if (voltdm->pmic->i2c_high_speed != i2c_high_speed)
>> -			pr_warn("%s: I2C config for vdd_%s does not match other channels (%u).",
>> +			pr_warn("%s: I2C config for vdd_%s does not match other channels (%u).\n",
>>   				__func__, voltdm->name, i2c_high_speed);
>>   		return;
>>   	}
>> diff --git a/arch/arm/mach-pxa/hx4700.c b/arch/arm/mach-pxa/hx4700.c
>> index 5ecbd17..e2c6391 100644
>> --- a/arch/arm/mach-pxa/hx4700.c
>> +++ b/arch/arm/mach-pxa/hx4700.c
>> @@ -28,6 +28,7 @@
>>   #include <linux/mfd/asic3.h>
>>   #include <linux/mtd/physmap.h>
>>   #include <linux/pda_power.h>
>> +#include <linux/pwm.h>
>>   #include <linux/pwm_backlight.h>
>>   #include <linux/regulator/driver.h>
>>   #include <linux/regulator/gpio-regulator.h>
>> @@ -556,7 +557,7 @@ static struct platform_device hx4700_lcd = {
>>    */
>>   
>>   static struct platform_pwm_backlight_data backlight_data = {
>> -	.pwm_id         = 1,
>> +	.pwm_id         = -1,	/* Superseded by pwm_lookup */
>>   	.max_brightness = 200,
>>   	.dft_brightness = 100,
>>   	.pwm_period_ns  = 30923,
>> @@ -571,6 +572,10 @@ static struct platform_device backlight = {
>>   	},
>>   };
>>   
>> +static struct pwm_lookup hx4700_pwm_lookup[] = {
>> +	PWM_LOOKUP("pxa27x-pwm.1", 0, "pwm-backlight", NULL),
>> +};
>> +
>>   /*
>>    * USB "Transceiver"
>>    */
>> @@ -872,6 +877,7 @@ static void __init hx4700_init(void)
>>   	pxa_set_stuart_info(NULL);
>>   
>>   	platform_add_devices(devices, ARRAY_SIZE(devices));
>> +	pwm_add_table(hx4700_pwm_lookup, ARRAY_SIZE(hx4700_pwm_lookup));
>>   
>>   	pxa_set_ficp_info(&ficp_info);
>>   	pxa27x_set_i2c_power_info(NULL);
>> diff --git a/arch/arm/mach-pxa/spitz_pm.c b/arch/arm/mach-pxa/spitz_pm.c
>> index 438f02f..842596d 100644
>> --- a/arch/arm/mach-pxa/spitz_pm.c
>> +++ b/arch/arm/mach-pxa/spitz_pm.c
>> @@ -86,10 +86,7 @@ static void spitz_discharge1(int on)
>>   	gpio_set_value(SPITZ_GPIO_LED_GREEN, on);
>>   }
>>   
>> -static unsigned long gpio18_config[] = {
>> -	GPIO18_RDY,
>> -	GPIO18_GPIO,
>> -};
>> +static unsigned long gpio18_config = GPIO18_GPIO;
>>   
>>   static void spitz_presuspend(void)
>>   {
>> @@ -112,7 +109,7 @@ static void spitz_presuspend(void)
>>   	PGSR3 &= ~SPITZ_GPIO_G3_STROBE_BIT;
>>   	PGSR2 |= GPIO_bit(SPITZ_GPIO_KEY_STROBE0);
>>   
>> -	pxa2xx_mfp_config(&gpio18_config[0], 1);
>> +	pxa2xx_mfp_config(&gpio18_config, 1);
>>   	gpio_request_one(18, GPIOF_OUT_INIT_HIGH, "Unknown");
>>   	gpio_free(18);
>>   
>> @@ -131,7 +128,6 @@ static void spitz_presuspend(void)
>>   
>>   static void spitz_postsuspend(void)
>>   {
>> -	pxa2xx_mfp_config(&gpio18_config[1], 1);
>>   }
>>   
>>   static int spitz_should_wakeup(unsigned int resume_on_alarm)
>> diff --git a/arch/arm/mm/alignment.c b/arch/arm/mm/alignment.c
>> index 023f4437..b820eda 100644
>> --- a/arch/arm/mm/alignment.c
>> +++ b/arch/arm/mm/alignment.c
>> @@ -745,7 +745,7 @@ do_alignment_t32_to_handler(unsigned long *pinstr, struct pt_regs *regs,
>>   static int
>>   do_alignment(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
>>   {
>> -	union offset_union offset;
>> +	union offset_union uninitialized_var(offset);
>>   	unsigned long instr = 0, instrptr;
>>   	int (*handler)(unsigned long addr, unsigned long instr, struct pt_regs *regs);
>>   	unsigned int type;
>> diff --git a/arch/arm/plat-omap/include/plat/omap_hwmod.h b/arch/arm/plat-omap/include/plat/omap_hwmod.h
>> index b3349f7..1db0294 100644
>> --- a/arch/arm/plat-omap/include/plat/omap_hwmod.h
>> +++ b/arch/arm/plat-omap/include/plat/omap_hwmod.h
>> @@ -443,6 +443,11 @@ struct omap_hwmod_omap4_prcm {
>>    *     in order to complete the reset. Optional clocks will be disabled
>>    *     again after the reset.
>>    * HWMOD_16BIT_REG: Module has 16bit registers
>> + * HWMOD_EXT_OPT_MAIN_CLK: The only main functional clock source for
>> + *     this IP block comes from an off-chip source and is not always
>> + *     enabled.  This prevents the hwmod code from being able to
>> + *     enable and reset the IP block early.  XXX Eventually it should
>> + *     be possible to query the clock framework for this information.
>>    */
>>   #define HWMOD_SWSUP_SIDLE			(1 << 0)
>>   #define HWMOD_SWSUP_MSTANDBY			(1 << 1)
>> @@ -453,6 +458,7 @@ struct omap_hwmod_omap4_prcm {
>>   #define HWMOD_NO_IDLEST				(1 << 6)
>>   #define HWMOD_CONTROL_OPT_CLKS_IN_RESET		(1 << 7)
>>   #define HWMOD_16BIT_REG				(1 << 8)
>> +#define HWMOD_EXT_OPT_MAIN_CLK			(1 << 9)
>>   
>>   /*
>>    * omap_hwmod._int_flags definitions
>> diff --git a/arch/arm/tools/Makefile b/arch/arm/tools/Makefile
>> index cd60a81..32d05c8 100644
>> --- a/arch/arm/tools/Makefile
>> +++ b/arch/arm/tools/Makefile
>> @@ -5,6 +5,6 @@
>>   #
>>   
>>   include/generated/mach-types.h: $(src)/gen-mach-types $(src)/mach-types
>> -	$(kecho) '  Generating $@'
>> +	@$(kecho) '  Generating $@'
>>   	@mkdir -p $(dir $@)
>>   	$(Q)$(AWK) -f $^ > $@ || { rm -f $@; /bin/false; }
>> diff --git a/arch/arm/vfp/vfpmodule.c b/arch/arm/vfp/vfpmodule.c
>> index c834b32..3b44e0d 100644
>> --- a/arch/arm/vfp/vfpmodule.c
>> +++ b/arch/arm/vfp/vfpmodule.c
>> @@ -701,11 +701,14 @@ static int __init vfp_init(void)
>>   			elf_hwcap |= HWCAP_VFPv3;
>>   
>>   			/*
>> -			 * Check for VFPv3 D16. CPUs in this configuration
>> -			 * only have 16 x 64bit registers.
>> +			 * Check for VFPv3 D16 and VFPv4 D16.  CPUs in
>> +			 * this configuration only have 16 x 64bit
>> +			 * registers.
>>   			 */
>>   			if (((fmrx(MVFR0) & MVFR0_A_SIMD_MASK)) == 1)
>> -				elf_hwcap |= HWCAP_VFPv3D16;
>> +				elf_hwcap |= HWCAP_VFPv3D16; /* also v4-D16 */
>> +			else
>> +				elf_hwcap |= HWCAP_VFPD32;
>>   		}
>>   #endif
>>   		/*
>> diff --git a/arch/arm/xen/enlighten.c b/arch/arm/xen/enlighten.c
>> index 59bcb96..f576092 100644
>> --- a/arch/arm/xen/enlighten.c
>> +++ b/arch/arm/xen/enlighten.c
>> @@ -166,3 +166,14 @@ void free_xenballooned_pages(int nr_pages, struct page **pages)
>>   	*pages = NULL;
>>   }
>>   EXPORT_SYMBOL_GPL(free_xenballooned_pages);
>> +
>> +/* In the hypervisor.S file. */
>> +EXPORT_SYMBOL_GPL(HYPERVISOR_event_channel_op);
>> +EXPORT_SYMBOL_GPL(HYPERVISOR_grant_table_op);
>> +EXPORT_SYMBOL_GPL(HYPERVISOR_xen_version);
>> +EXPORT_SYMBOL_GPL(HYPERVISOR_console_io);
>> +EXPORT_SYMBOL_GPL(HYPERVISOR_sched_op);
>> +EXPORT_SYMBOL_GPL(HYPERVISOR_hvm_op);
>> +EXPORT_SYMBOL_GPL(HYPERVISOR_memory_op);
>> +EXPORT_SYMBOL_GPL(HYPERVISOR_physdev_op);
>> +EXPORT_SYMBOL_GPL(privcmd_call);
>> diff --git a/arch/arm/xen/hypercall.S b/arch/arm/xen/hypercall.S
>> index 074f5ed..71f7239 100644
>> --- a/arch/arm/xen/hypercall.S
>> +++ b/arch/arm/xen/hypercall.S
>> @@ -48,20 +48,16 @@
>>   
>>   #include <linux/linkage.h>
>>   #include <asm/assembler.h>
>> +#include <asm/opcodes-virt.h>
>>   #include <xen/interface/xen.h>
>>   
>>   
>> -/* HVC 0xEA1 */
>> -#ifdef CONFIG_THUMB2_KERNEL
>> -#define xen_hvc .word 0xf7e08ea1
>> -#else
>> -#define xen_hvc .word 0xe140ea71
>> -#endif
>> +#define XEN_IMM 0xEA1
>>   
>>   #define HYPERCALL_SIMPLE(hypercall)		\
>>   ENTRY(HYPERVISOR_##hypercall)			\
>>   	mov r12, #__HYPERVISOR_##hypercall;	\
>> -	xen_hvc;							\
>> +	__HVC(XEN_IMM);						\
>>   	mov pc, lr;							\
>>   ENDPROC(HYPERVISOR_##hypercall)
>>   
>> @@ -76,7 +72,7 @@ ENTRY(HYPERVISOR_##hypercall)			\
>>   	stmdb sp!, {r4}						\
>>   	ldr r4, [sp, #4]					\
>>   	mov r12, #__HYPERVISOR_##hypercall;	\
>> -	xen_hvc								\
>> +	__HVC(XEN_IMM);						\
>>   	ldm sp!, {r4}						\
>>   	mov pc, lr							\
>>   ENDPROC(HYPERVISOR_##hypercall)
>> @@ -100,7 +96,7 @@ ENTRY(privcmd_call)
>>   	mov r2, r3
>>   	ldr r3, [sp, #8]
>>   	ldr r4, [sp, #4]
>> -	xen_hvc
>> +	__HVC(XEN_IMM)
>>   	ldm sp!, {r4}
>>   	mov pc, lr
>>   ENDPROC(privcmd_call);
>> diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
>> index ef54a59..15ac18a 100644
>> --- a/arch/arm64/Kconfig
>> +++ b/arch/arm64/Kconfig
>> @@ -1,6 +1,7 @@
>>   config ARM64
>>   	def_bool y
>>   	select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE
>> +	select ARCH_WANT_COMPAT_IPC_PARSE_VERSION
>>   	select GENERIC_CLOCKEVENTS
>>   	select GENERIC_HARDIRQS_NO_DEPRECATED
>>   	select GENERIC_IOMAP
>> diff --git a/arch/arm64/include/asm/elf.h b/arch/arm64/include/asm/elf.h
>> index cf28464..07fea29 100644
>> --- a/arch/arm64/include/asm/elf.h
>> +++ b/arch/arm64/include/asm/elf.h
>> @@ -25,12 +25,10 @@
>>   #include <asm/user.h>
>>   
>>   typedef unsigned long elf_greg_t;
>> -typedef unsigned long elf_freg_t[3];
>>   
>>   #define ELF_NGREG (sizeof (struct pt_regs) / sizeof(elf_greg_t))
>>   typedef elf_greg_t elf_gregset_t[ELF_NGREG];
>> -
>> -typedef struct user_fp elf_fpregset_t;
>> +typedef struct user_fpsimd_state elf_fpregset_t;
>>   
>>   #define EM_AARCH64		183
>>   
>> @@ -87,7 +85,6 @@ typedef struct user_fp elf_fpregset_t;
>>   #define R_AARCH64_MOVW_PREL_G2_NC	292
>>   #define R_AARCH64_MOVW_PREL_G3		293
>>   
>> -
>>   /*
>>    * These are used to set parameters in the core dumps.
>>    */
>> diff --git a/arch/arm64/include/asm/fpsimd.h b/arch/arm64/include/asm/fpsimd.h
>> index b42fab9..c43b4ac 100644
>> --- a/arch/arm64/include/asm/fpsimd.h
>> +++ b/arch/arm64/include/asm/fpsimd.h
>> @@ -25,9 +25,8 @@
>>    *  - FPSR and FPCR
>>    *  - 32 128-bit data registers
>>    *
>> - * Note that user_fp forms a prefix of this structure, which is relied
>> - * upon in the ptrace FP/SIMD accessors. struct user_fpsimd_state must
>> - * form a prefix of struct fpsimd_state.
>> + * Note that user_fpsimd forms a prefix of this structure, which is
>> + * relied upon in the ptrace FP/SIMD accessors.
>>    */
>>   struct fpsimd_state {
>>   	union {
>> diff --git a/arch/arm64/include/asm/io.h b/arch/arm64/include/asm/io.h
>> index 74a2a7d..d2f05a6 100644
>> --- a/arch/arm64/include/asm/io.h
>> +++ b/arch/arm64/include/asm/io.h
>> @@ -114,7 +114,7 @@ static inline u64 __raw_readq(const volatile void __iomem *addr)
>>    *  I/O port access primitives.
>>    */
>>   #define IO_SPACE_LIMIT		0xffff
>> -#define PCI_IOBASE		((void __iomem *)0xffffffbbfffe0000UL)
>> +#define PCI_IOBASE		((void __iomem *)(MODULES_VADDR - SZ_2M))
>>   
>>   static inline u8 inb(unsigned long addr)
>>   {
>> @@ -222,12 +222,12 @@ extern void __iomem *__ioremap(phys_addr_t phys_addr, size_t size, pgprot_t prot
>>   extern void __iounmap(volatile void __iomem *addr);
>>   
>>   #define PROT_DEFAULT		(PTE_TYPE_PAGE | PTE_AF | PTE_DIRTY)
>> -#define PROT_DEVICE_nGnRE	(PROT_DEFAULT | PTE_XN | PTE_ATTRINDX(MT_DEVICE_nGnRE))
>> +#define PROT_DEVICE_nGnRE	(PROT_DEFAULT | PTE_PXN | PTE_UXN | PTE_ATTRINDX(MT_DEVICE_nGnRE))
>>   #define PROT_NORMAL_NC		(PROT_DEFAULT | PTE_ATTRINDX(MT_NORMAL_NC))
>>   
>> -#define ioremap(addr, size)		__ioremap((addr), (size), PROT_DEVICE_nGnRE)
>> -#define ioremap_nocache(addr, size)	__ioremap((addr), (size), PROT_DEVICE_nGnRE)
>> -#define ioremap_wc(addr, size)		__ioremap((addr), (size), PROT_NORMAL_NC)
>> +#define ioremap(addr, size)		__ioremap((addr), (size), __pgprot(PROT_DEVICE_nGnRE))
>> +#define ioremap_nocache(addr, size)	__ioremap((addr), (size), __pgprot(PROT_DEVICE_nGnRE))
>> +#define ioremap_wc(addr, size)		__ioremap((addr), (size), __pgprot(PROT_NORMAL_NC))
>>   #define iounmap				__iounmap
>>   
>>   #define ARCH_HAS_IOREMAP_WC
>> diff --git a/arch/arm64/include/asm/pgtable-hwdef.h b/arch/arm64/include/asm/pgtable-hwdef.h
>> index 0f3b458..75fd13d 100644
>> --- a/arch/arm64/include/asm/pgtable-hwdef.h
>> +++ b/arch/arm64/include/asm/pgtable-hwdef.h
>> @@ -38,7 +38,8 @@
>>   #define PMD_SECT_S		(_AT(pmdval_t, 3) << 8)
>>   #define PMD_SECT_AF		(_AT(pmdval_t, 1) << 10)
>>   #define PMD_SECT_NG		(_AT(pmdval_t, 1) << 11)
>> -#define PMD_SECT_XN		(_AT(pmdval_t, 1) << 54)
>> +#define PMD_SECT_PXN		(_AT(pmdval_t, 1) << 53)
>> +#define PMD_SECT_UXN		(_AT(pmdval_t, 1) << 54)
>>   
>>   /*
>>    * AttrIndx[2:0] encoding (mapping attributes defined in the MAIR* registers).
>> @@ -57,7 +58,8 @@
>>   #define PTE_SHARED		(_AT(pteval_t, 3) << 8)		/* SH[1:0], inner shareable */
>>   #define PTE_AF			(_AT(pteval_t, 1) << 10)	/* Access Flag */
>>   #define PTE_NG			(_AT(pteval_t, 1) << 11)	/* nG */
>> -#define PTE_XN			(_AT(pteval_t, 1) << 54)	/* XN */
>> +#define PTE_PXN			(_AT(pteval_t, 1) << 53)	/* Privileged XN */
>> +#define PTE_UXN			(_AT(pteval_t, 1) << 54)	/* User XN */
>>   
>>   /*
>>    * AttrIndx[2:0] encoding (mapping attributes defined in the MAIR* registers).
>> diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h
>> index 8960239..14aba2d 100644
>> --- a/arch/arm64/include/asm/pgtable.h
>> +++ b/arch/arm64/include/asm/pgtable.h
>> @@ -62,23 +62,23 @@ extern pgprot_t pgprot_default;
>>   
>>   #define _MOD_PROT(p, b)	__pgprot(pgprot_val(p) | (b))
>>   
>> -#define PAGE_NONE		_MOD_PROT(pgprot_default, PTE_NG | PTE_XN | PTE_RDONLY)
>> -#define PAGE_SHARED		_MOD_PROT(pgprot_default, PTE_USER | PTE_NG | PTE_XN)
>> -#define PAGE_SHARED_EXEC	_MOD_PROT(pgprot_default, PTE_USER | PTE_NG)
>> -#define PAGE_COPY		_MOD_PROT(pgprot_default, PTE_USER | PTE_NG | PTE_XN | PTE_RDONLY)
>> -#define PAGE_COPY_EXEC		_MOD_PROT(pgprot_default, PTE_USER | PTE_NG | PTE_RDONLY)
>> -#define PAGE_READONLY		_MOD_PROT(pgprot_default, PTE_USER | PTE_NG | PTE_XN | PTE_RDONLY)
>> -#define PAGE_READONLY_EXEC	_MOD_PROT(pgprot_default, PTE_USER | PTE_NG | PTE_RDONLY)
>> -#define PAGE_KERNEL		_MOD_PROT(pgprot_default, PTE_XN | PTE_DIRTY)
>> -#define PAGE_KERNEL_EXEC	_MOD_PROT(pgprot_default, PTE_DIRTY)
>> -
>> -#define __PAGE_NONE		__pgprot(_PAGE_DEFAULT | PTE_NG | PTE_XN | PTE_RDONLY)
>> -#define __PAGE_SHARED		__pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_XN)
>> -#define __PAGE_SHARED_EXEC	__pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG)
>> -#define __PAGE_COPY		__pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_XN | PTE_RDONLY)
>> -#define __PAGE_COPY_EXEC	__pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_RDONLY)
>> -#define __PAGE_READONLY		__pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_XN | PTE_RDONLY)
>> -#define __PAGE_READONLY_EXEC	__pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_RDONLY)
>> +#define PAGE_NONE		_MOD_PROT(pgprot_default, PTE_NG | PTE_PXN | PTE_UXN | PTE_RDONLY)
>> +#define PAGE_SHARED		_MOD_PROT(pgprot_default, PTE_USER | PTE_NG | PTE_PXN | PTE_UXN)
>> +#define PAGE_SHARED_EXEC	_MOD_PROT(pgprot_default, PTE_USER | PTE_NG | PTE_PXN)
>> +#define PAGE_COPY		_MOD_PROT(pgprot_default, PTE_USER | PTE_NG | PTE_PXN | PTE_UXN | PTE_RDONLY)
>> +#define PAGE_COPY_EXEC		_MOD_PROT(pgprot_default, PTE_USER | PTE_NG | PTE_PXN | PTE_RDONLY)
>> +#define PAGE_READONLY		_MOD_PROT(pgprot_default, PTE_USER | PTE_NG | PTE_PXN | PTE_UXN | PTE_RDONLY)
>> +#define PAGE_READONLY_EXEC	_MOD_PROT(pgprot_default, PTE_USER | PTE_NG | PTE_PXN | PTE_RDONLY)
>> +#define PAGE_KERNEL		_MOD_PROT(pgprot_default, PTE_PXN | PTE_UXN | PTE_DIRTY)
>> +#define PAGE_KERNEL_EXEC	_MOD_PROT(pgprot_default, PTE_UXN | PTE_DIRTY)
>> +
>> +#define __PAGE_NONE		__pgprot(_PAGE_DEFAULT | PTE_NG | PTE_PXN | PTE_UXN | PTE_RDONLY)
>> +#define __PAGE_SHARED		__pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN | PTE_UXN)
>> +#define __PAGE_SHARED_EXEC	__pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN)
>> +#define __PAGE_COPY		__pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN | PTE_UXN | PTE_RDONLY)
>> +#define __PAGE_COPY_EXEC	__pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN | PTE_RDONLY)
>> +#define __PAGE_READONLY		__pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN | PTE_UXN | PTE_RDONLY)
>> +#define __PAGE_READONLY_EXEC	__pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN | PTE_RDONLY)
>>   
>>   #endif /* __ASSEMBLY__ */
>>   
>> @@ -130,10 +130,10 @@ extern struct page *empty_zero_page;
>>   #define pte_young(pte)		(pte_val(pte) & PTE_AF)
>>   #define pte_special(pte)	(pte_val(pte) & PTE_SPECIAL)
>>   #define pte_write(pte)		(!(pte_val(pte) & PTE_RDONLY))
>> -#define pte_exec(pte)		(!(pte_val(pte) & PTE_XN))
>> +#define pte_exec(pte)		(!(pte_val(pte) & PTE_UXN))
>>   
>>   #define pte_present_exec_user(pte) \
>> -	((pte_val(pte) & (PTE_VALID | PTE_USER | PTE_XN)) == \
>> +	((pte_val(pte) & (PTE_VALID | PTE_USER | PTE_UXN)) == \
>>   	 (PTE_VALID | PTE_USER))
>>   
>>   #define PTE_BIT_FUNC(fn,op) \
>> @@ -262,7 +262,7 @@ static inline pmd_t *pmd_offset(pud_t *pud, unsigned long addr)
>>   
>>   static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
>>   {
>> -	const pteval_t mask = PTE_USER | PTE_XN | PTE_RDONLY;
>> +	const pteval_t mask = PTE_USER | PTE_PXN | PTE_UXN | PTE_RDONLY;
>>   	pte_val(pte) = (pte_val(pte) & ~mask) | (pgprot_val(newprot) & mask);
>>   	return pte;
>>   }
>> diff --git a/arch/arm64/include/asm/processor.h b/arch/arm64/include/asm/processor.h
>> index 5d81004..77f696c 100644
>> --- a/arch/arm64/include/asm/processor.h
>> +++ b/arch/arm64/include/asm/processor.h
>> @@ -43,6 +43,8 @@
>>   #else
>>   #define STACK_TOP		STACK_TOP_MAX
>>   #endif /* CONFIG_COMPAT */
>> +
>> +#define ARCH_LOW_ADDRESS_LIMIT	PHYS_MASK
>>   #endif /* __KERNEL__ */
>>   
>>   struct debug_info {
>> diff --git a/arch/arm64/include/asm/unistd.h b/arch/arm64/include/asm/unistd.h
>> index 63f853f..68aff28 100644
>> --- a/arch/arm64/include/asm/unistd.h
>> +++ b/arch/arm64/include/asm/unistd.h
>> @@ -14,7 +14,6 @@
>>    * along with this program.  If not, see <http://www.gnu.org/licenses/>.
>>    */
>>   #ifdef CONFIG_COMPAT
>> -#define __ARCH_WANT_COMPAT_IPC_PARSE_VERSION
>>   #define __ARCH_WANT_COMPAT_STAT64
>>   #define __ARCH_WANT_SYS_GETHOSTNAME
>>   #define __ARCH_WANT_SYS_PAUSE
>> diff --git a/arch/arm64/kernel/perf_event.c b/arch/arm64/kernel/perf_event.c
>> index ecbf2d8..c76c724 100644
>> --- a/arch/arm64/kernel/perf_event.c
>> +++ b/arch/arm64/kernel/perf_event.c
>> @@ -613,17 +613,11 @@ enum armv8_pmuv3_perf_types {
>>   	ARMV8_PMUV3_PERFCTR_BUS_ACCESS				= 0x19,
>>   	ARMV8_PMUV3_PERFCTR_MEM_ERROR				= 0x1A,
>>   	ARMV8_PMUV3_PERFCTR_BUS_CYCLES				= 0x1D,
>> -
>> -	/*
>> -	 * This isn't an architected event.
>> -	 * We detect this event number and use the cycle counter instead.
>> -	 */
>> -	ARMV8_PMUV3_PERFCTR_CPU_CYCLES				= 0xFF,
>>   };
>>   
>>   /* PMUv3 HW events mapping. */
>>   static const unsigned armv8_pmuv3_perf_map[PERF_COUNT_HW_MAX] = {
>> -	[PERF_COUNT_HW_CPU_CYCLES]		= ARMV8_PMUV3_PERFCTR_CPU_CYCLES,
>> +	[PERF_COUNT_HW_CPU_CYCLES]		= ARMV8_PMUV3_PERFCTR_CLOCK_CYCLES,
>>   	[PERF_COUNT_HW_INSTRUCTIONS]		= ARMV8_PMUV3_PERFCTR_INSTR_EXECUTED,
>>   	[PERF_COUNT_HW_CACHE_REFERENCES]	= ARMV8_PMUV3_PERFCTR_L1_DCACHE_ACCESS,
>>   	[PERF_COUNT_HW_CACHE_MISSES]		= ARMV8_PMUV3_PERFCTR_L1_DCACHE_REFILL,
>> @@ -1106,7 +1100,7 @@ static int armv8pmu_get_event_idx(struct pmu_hw_events *cpuc,
>>   	unsigned long evtype = event->config_base & ARMV8_EVTYPE_EVENT;
>>   
>>   	/* Always place a cycle counter into the cycle counter. */
>> -	if (evtype == ARMV8_PMUV3_PERFCTR_CPU_CYCLES) {
>> +	if (evtype == ARMV8_PMUV3_PERFCTR_CLOCK_CYCLES) {
>>   		if (test_and_set_bit(ARMV8_IDX_CYCLE_COUNTER, cpuc->used_mask))
>>   			return -EAGAIN;
>>   
>> diff --git a/arch/arm64/kernel/process.c b/arch/arm64/kernel/process.c
>> index f22965e..e04cebd 100644
>> --- a/arch/arm64/kernel/process.c
>> +++ b/arch/arm64/kernel/process.c
>> @@ -310,24 +310,6 @@ struct task_struct *__switch_to(struct task_struct *prev,
>>   }
>>   
>>   /*
>> - * Fill in the task's elfregs structure for a core dump.
>> - */
>> -int dump_task_regs(struct task_struct *t, elf_gregset_t *elfregs)
>> -{
>> -	elf_core_copy_regs(elfregs, task_pt_regs(t));
>> -	return 1;
>> -}
>> -
>> -/*
>> - * fill in the fpe structure for a core dump...
>> - */
>> -int dump_fpu (struct pt_regs *regs, struct user_fp *fp)
>> -{
>> -	return 0;
>> -}
>> -EXPORT_SYMBOL(dump_fpu);
>> -
>> -/*
>>    * Shuffle the argument into the correct register before calling the
>>    * thread function.  x1 is the thread argument, x2 is the pointer to
>>    * the thread function, and x3 points to the exit function.
>> diff --git a/arch/arm64/kernel/smp.c b/arch/arm64/kernel/smp.c
>> index 226b6bf..538300f 100644
>> --- a/arch/arm64/kernel/smp.c
>> +++ b/arch/arm64/kernel/smp.c
>> @@ -211,8 +211,7 @@ asmlinkage void __cpuinit secondary_start_kernel(void)
>>   	 * before we continue.
>>   	 */
>>   	set_cpu_online(cpu, true);
>> -	while (!cpu_active(cpu))
>> -		cpu_relax();
>> +	complete(&cpu_running);
>>   
>>   	/*
>>   	 * OK, it's off to the idle thread for us
>> diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c
>> index efbf7df..4cd2893 100644
>> --- a/arch/arm64/mm/init.c
>> +++ b/arch/arm64/mm/init.c
>> @@ -80,7 +80,7 @@ static void __init zone_sizes_init(unsigned long min, unsigned long max)
>>   #ifdef CONFIG_ZONE_DMA32
>>   	/* 4GB maximum for 32-bit only capable devices */
>>   	max_dma32 = min(max, MAX_DMA32_PFN);
>> -	zone_size[ZONE_DMA32] = max_dma32 - min;
>> +	zone_size[ZONE_DMA32] = max(min, max_dma32) - min;
>>   #endif
>>   	zone_size[ZONE_NORMAL] = max - max_dma32;
>>   
>> diff --git a/arch/frv/Kconfig b/arch/frv/Kconfig
>> index b741250..df2eb4b 100644
>> --- a/arch/frv/Kconfig
>> +++ b/arch/frv/Kconfig
>> @@ -13,6 +13,7 @@ config FRV
>>   	select GENERIC_CPU_DEVICES
>>   	select ARCH_WANT_IPC_PARSE_VERSION
>>   	select GENERIC_KERNEL_THREAD
>> +	select GENERIC_KERNEL_EXECVE
>>   
>>   config ZONE_DMA
>>   	bool
>> diff --git a/arch/frv/boot/Makefile b/arch/frv/boot/Makefile
>> index 6ae3254..636d5bb 100644
>> --- a/arch/frv/boot/Makefile
>> +++ b/arch/frv/boot/Makefile
>> @@ -17,6 +17,8 @@ PARAMS_PHYS	 = 0x0207c000
>>   INITRD_PHYS	 = 0x02180000
>>   INITRD_VIRT	 = 0x02180000
>>   
>> +OBJCOPYFLAGS	:=-O binary -R .note -R .note.gnu.build-id -R .comment
>> +
>>   #
>>   # If you don't define ZRELADDR above,
>>   # then it defaults to ZTEXTADDR
>> @@ -32,18 +34,18 @@ Image: $(obj)/Image
>>   targets: $(obj)/Image
>>   
>>   $(obj)/Image: vmlinux FORCE
>> -	$(OBJCOPY) -O binary -R .note -R .comment -S vmlinux $@
>> +	$(OBJCOPY) $(OBJCOPYFLAGS) -S vmlinux $@
>>   
>>   #$(obj)/Image:	$(CONFIGURE) $(SYSTEM)
>> -#	$(OBJCOPY) -O binary -R .note -R .comment -g -S $(SYSTEM) $@
>> +#	$(OBJCOPY) $(OBJCOPYFLAGS) -g -S $(SYSTEM) $@
>>   
>>   bzImage: zImage
>>   
>>   zImage:	$(CONFIGURE) compressed/$(LINUX)
>> -	$(OBJCOPY) -O binary -R .note -R .comment -S compressed/$(LINUX) $@
>> +	$(OBJCOPY) $(OBJCOPYFLAGS) -S compressed/$(LINUX) $@
>>   
>>   bootpImage: bootp/bootp
>> -	$(OBJCOPY) -O binary -R .note -R .comment -S bootp/bootp $@
>> +	$(OBJCOPY) $(OBJCOPYFLAGS) -S bootp/bootp $@
>>   
>>   compressed/$(LINUX): $(LINUX) dep
>>   	@$(MAKE) -C compressed $(LINUX)
>> diff --git a/arch/frv/include/asm/unistd.h b/arch/frv/include/asm/unistd.h
>> index 266a5b2..2358634 100644
>> --- a/arch/frv/include/asm/unistd.h
>> +++ b/arch/frv/include/asm/unistd.h
>> @@ -30,7 +30,6 @@
>>   #define __ARCH_WANT_SYS_RT_SIGACTION
>>   #define __ARCH_WANT_SYS_RT_SIGSUSPEND
>>   #define __ARCH_WANT_SYS_EXECVE
>> -#define __ARCH_WANT_KERNEL_EXECVE
>>   
>>   /*
>>    * "Conditional" syscalls
>> diff --git a/arch/frv/kernel/entry.S b/arch/frv/kernel/entry.S
>> index ee0beb3..dfcd263 100644
>> --- a/arch/frv/kernel/entry.S
>> +++ b/arch/frv/kernel/entry.S
>> @@ -869,11 +869,6 @@ ret_from_kernel_thread:
>>   	call		schedule_tail
>>   	calll.p		@(gr21,gr0)
>>   	or		gr20,gr20,gr8
>> -	bra		sys_exit
>> -
>> -	.globl		ret_from_kernel_execve
>> -ret_from_kernel_execve:
>> -	ori		gr28,0,sp
>>   	bra		__syscall_exit
>>   
>>   ###################################################################################################
>> @@ -1080,27 +1075,10 @@ __entry_return_from_kernel_interrupt:
>>   	subicc		gr5,#0,gr0,icc0
>>   	beq		icc0,#0,__entry_return_direct
>>   
>> -__entry_preempt_need_resched:
>> -	ldi		@(gr15,#TI_FLAGS),gr4
>> -	andicc		gr4,#_TIF_NEED_RESCHED,gr0,icc0
>> -	beq		icc0,#1,__entry_return_direct
>> -
>> -	setlos		#PREEMPT_ACTIVE,gr5
>> -	sti		gr5,@(gr15,#TI_FLAGS)
>> -
>> -	andi		gr23,#~PSR_PIL,gr23
>> -	movgs		gr23,psr
>> -
>> -	call		schedule
>> -	sti		gr0,@(gr15,#TI_PRE_COUNT)
>> -
>> -	movsg		psr,gr23
>> -	ori		gr23,#PSR_PIL_14,gr23
>> -	movgs		gr23,psr
>> -	bra		__entry_preempt_need_resched
>> -#else
>> -	bra		__entry_return_direct
>> +	subcc		gr0,gr0,gr0,icc2		/* set Z and clear C */
>> +	call		preempt_schedule_irq
>>   #endif
>> +	bra		__entry_return_direct
>>   
>>   
>>   ###############################################################################
>> diff --git a/arch/frv/kernel/process.c b/arch/frv/kernel/process.c
>> index e1e3aa1..7e33215 100644
>> --- a/arch/frv/kernel/process.c
>> +++ b/arch/frv/kernel/process.c
>> @@ -181,6 +181,9 @@ int copy_thread(unsigned long clone_flags,
>>   	childregs = (struct pt_regs *)
>>   		(task_stack_page(p) + THREAD_SIZE - FRV_FRAME0_SIZE);
>>   
>> +	/* set up the userspace frame (the only place that the USP is stored) */
>> +	*childregs = *__kernel_frame0_ptr;
>> +
>>   	p->set_child_tid = p->clear_child_tid = NULL;
>>   
>>   	p->thread.frame	 = childregs;
>> @@ -191,10 +194,8 @@ int copy_thread(unsigned long clone_flags,
>>   	p->thread.frame0 = childregs;
>>   
>>   	if (unlikely(!regs)) {
>> -		memset(childregs, 0, sizeof(struct pt_regs));
>>   		childregs->gr9 = usp; /* function */
>>   		childregs->gr8 = arg;
>> -		childregs->psr = PSR_S;
>>   		p->thread.pc = (unsigned long) ret_from_kernel_thread;
>>   		save_user_regs(p->thread.user);
>>   		return 0;
>> diff --git a/arch/frv/mb93090-mb00/pci-dma-nommu.c b/arch/frv/mb93090-mb00/pci-dma-nommu.c
>> index e47857f..b99c2a7 100644
>> --- a/arch/frv/mb93090-mb00/pci-dma-nommu.c
>> +++ b/arch/frv/mb93090-mb00/pci-dma-nommu.c
>> @@ -11,6 +11,7 @@
>>   
>>   #include <linux/types.h>
>>   #include <linux/slab.h>
>> +#include <linux/export.h>
>>   #include <linux/dma-mapping.h>
>>   #include <linux/list.h>
>>   #include <linux/pci.h>
>> diff --git a/arch/h8300/include/asm/cache.h b/arch/h8300/include/asm/cache.h
>> index c635028..05887a1 100644
>> --- a/arch/h8300/include/asm/cache.h
>> +++ b/arch/h8300/include/asm/cache.h
>> @@ -2,7 +2,8 @@
>>   #define __ARCH_H8300_CACHE_H
>>   
>>   /* bytes per L1 cache line */
>> -#define        L1_CACHE_BYTES  4
>> +#define        L1_CACHE_SHIFT  2
>> +#define        L1_CACHE_BYTES  (1 << L1_CACHE_SHIFT)
>>   
>>   /* m68k-elf-gcc  2.95.2 doesn't like these */
>>   
>> diff --git a/arch/ia64/mm/init.c b/arch/ia64/mm/init.c
>> index acd5b68..082e383 100644
>> --- a/arch/ia64/mm/init.c
>> +++ b/arch/ia64/mm/init.c
>> @@ -637,7 +637,6 @@ mem_init (void)
>>   
>>   	high_memory = __va(max_low_pfn * PAGE_SIZE);
>>   
>> -	reset_zone_present_pages();
>>   	for_each_online_pgdat(pgdat)
>>   		if (pgdat->bdata->node_bootmem_map)
>>   			totalram_pages += free_all_bootmem_node(pgdat);
>> diff --git a/arch/m68k/include/asm/signal.h b/arch/m68k/include/asm/signal.h
>> index 67e489d..2df26b5 100644
>> --- a/arch/m68k/include/asm/signal.h
>> +++ b/arch/m68k/include/asm/signal.h
>> @@ -41,7 +41,7 @@ struct k_sigaction {
>>   static inline void sigaddset(sigset_t *set, int _sig)
>>   {
>>   	asm ("bfset %0{%1,#1}"
>> -		: "+od" (*set)
>> +		: "+o" (*set)
>>   		: "id" ((_sig - 1) ^ 31)
>>   		: "cc");
>>   }
>> @@ -49,7 +49,7 @@ static inline void sigaddset(sigset_t *set, int _sig)
>>   static inline void sigdelset(sigset_t *set, int _sig)
>>   {
>>   	asm ("bfclr %0{%1,#1}"
>> -		: "+od" (*set)
>> +		: "+o" (*set)
>>   		: "id" ((_sig - 1) ^ 31)
>>   		: "cc");
>>   }
>> @@ -65,7 +65,7 @@ static inline int __gen_sigismember(sigset_t *set, int _sig)
>>   	int ret;
>>   	asm ("bfextu %1{%2,#1},%0"
>>   		: "=d" (ret)
>> -		: "od" (*set), "id" ((_sig-1) ^ 31)
>> +		: "o" (*set), "id" ((_sig-1) ^ 31)
>>   		: "cc");
>>   	return ret;
>>   }
>> diff --git a/arch/mips/cavium-octeon/executive/cvmx-l2c.c b/arch/mips/cavium-octeon/executive/cvmx-l2c.c
>> deleted file mode 100644
>> index d38246e..0000000
>> --- a/arch/mips/cavium-octeon/executive/cvmx-l2c.c
>> +++ /dev/null
>> @@ -1,900 +0,0 @@
>> -/***********************license start***************
>> - * Author: Cavium Networks
>> - *
>> - * Contact: support@...iumnetworks.com
>> - * This file is part of the OCTEON SDK
>> - *
>> - * Copyright (c) 2003-2010 Cavium Networks
>> - *
>> - * This file is free software; you can redistribute it and/or modify
>> - * it under the terms of the GNU General Public License, Version 2, as
>> - * published by the Free Software Foundation.
>> - *
>> - * This file is distributed in the hope that it will be useful, but
>> - * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
>> - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
>> - * NONINFRINGEMENT.  See the GNU General Public License for more
>> - * details.
>> - *
>> - * You should have received a copy of the GNU General Public License
>> - * along with this file; if not, write to the Free Software
>> - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
>> - * or visit http://www.gnu.org/licenses/.
>> - *
>> - * This file may also be available under a different license from Cavium.
>> - * Contact Cavium Networks for more information
>> - ***********************license end**************************************/
>> -
>> -/*
>> - * Implementation of the Level 2 Cache (L2C) control,
>> - * measurement, and debugging facilities.
>> - */
>> -
>> -#include <asm/octeon/cvmx.h>
>> -#include <asm/octeon/cvmx-l2c.h>
>> -#include <asm/octeon/cvmx-spinlock.h>
>> -
>> -/*
>> - * This spinlock is used internally to ensure that only one core is
>> - * performing certain L2 operations at a time.
>> - *
>> - * NOTE: This only protects calls from within a single application -
>> - * if multiple applications or operating systems are running, then it
>> - * is up to the user program to coordinate between them.
>> - */
>> -cvmx_spinlock_t cvmx_l2c_spinlock;
>> -
>> -int cvmx_l2c_get_core_way_partition(uint32_t core)
>> -{
>> -	uint32_t field;
>> -
>> -	/* Validate the core number */
>> -	if (core >= cvmx_octeon_num_cores())
>> -		return -1;
>> -
>> -	if (OCTEON_IS_MODEL(OCTEON_CN63XX))
>> -		return cvmx_read_csr(CVMX_L2C_WPAR_PPX(core)) & 0xffff;
>> -
>> -	/*
>> -	 * Use the lower two bits of the coreNumber to determine the
>> -	 * bit offset of the UMSK[] field in the L2C_SPAR register.
>> -	 */
>> -	field = (core & 0x3) * 8;
>> -
>> -	/*
>> -	 * Return the UMSK[] field from the appropriate L2C_SPAR
>> -	 * register based on the coreNumber.
>> -	 */
>> -
>> -	switch (core & 0xC) {
>> -	case 0x0:
>> -		return (cvmx_read_csr(CVMX_L2C_SPAR0) & (0xFF << field)) >> field;
>> -	case 0x4:
>> -		return (cvmx_read_csr(CVMX_L2C_SPAR1) & (0xFF << field)) >> field;
>> -	case 0x8:
>> -		return (cvmx_read_csr(CVMX_L2C_SPAR2) & (0xFF << field)) >> field;
>> -	case 0xC:
>> -		return (cvmx_read_csr(CVMX_L2C_SPAR3) & (0xFF << field)) >> field;
>> -	}
>> -	return 0;
>> -}
>> -
>> -int cvmx_l2c_set_core_way_partition(uint32_t core, uint32_t mask)
>> -{
>> -	uint32_t field;
>> -	uint32_t valid_mask;
>> -
>> -	valid_mask = (0x1 << cvmx_l2c_get_num_assoc()) - 1;
>> -
>> -	mask &= valid_mask;
>> -
>> -	/* A UMSK setting which blocks all L2C Ways is an error on some chips */
>> -	if (mask == valid_mask && !OCTEON_IS_MODEL(OCTEON_CN63XX))
>> -		return -1;
>> -
>> -	/* Validate the core number */
>> -	if (core >= cvmx_octeon_num_cores())
>> -		return -1;
>> -
>> -	if (OCTEON_IS_MODEL(OCTEON_CN63XX)) {
>> -		cvmx_write_csr(CVMX_L2C_WPAR_PPX(core), mask);
>> -		return 0;
>> -	}
>> -
>> -	/*
>> -	 * Use the lower two bits of core to determine the bit offset of the
>> -	 * UMSK[] field in the L2C_SPAR register.
>> -	 */
>> -	field = (core & 0x3) * 8;
>> -
>> -	/*
>> -	 * Assign the new mask setting to the UMSK[] field in the appropriate
>> -	 * L2C_SPAR register based on the core_num.
>> -	 *
>> -	 */
>> -	switch (core & 0xC) {
>> -	case 0x0:
>> -		cvmx_write_csr(CVMX_L2C_SPAR0,
>> -			       (cvmx_read_csr(CVMX_L2C_SPAR0) & ~(0xFF << field)) |
>> -			       mask << field);
>> -		break;
>> -	case 0x4:
>> -		cvmx_write_csr(CVMX_L2C_SPAR1,
>> -			       (cvmx_read_csr(CVMX_L2C_SPAR1) & ~(0xFF << field)) |
>> -			       mask << field);
>> -		break;
>> -	case 0x8:
>> -		cvmx_write_csr(CVMX_L2C_SPAR2,
>> -			       (cvmx_read_csr(CVMX_L2C_SPAR2) & ~(0xFF << field)) |
>> -			       mask << field);
>> -		break;
>> -	case 0xC:
>> -		cvmx_write_csr(CVMX_L2C_SPAR3,
>> -			       (cvmx_read_csr(CVMX_L2C_SPAR3) & ~(0xFF << field)) |
>> -			       mask << field);
>> -		break;
>> -	}
>> -	return 0;
>> -}
>> -
>> -int cvmx_l2c_set_hw_way_partition(uint32_t mask)
>> -{
>> -	uint32_t valid_mask;
>> -
>> -	valid_mask = (0x1 << cvmx_l2c_get_num_assoc()) - 1;
>> -	mask &= valid_mask;
>> -
>> -	/* A UMSK setting which blocks all L2C Ways is an error on some chips */
>> -	if (mask == valid_mask  && !OCTEON_IS_MODEL(OCTEON_CN63XX))
>> -		return -1;
>> -
>> -	if (OCTEON_IS_MODEL(OCTEON_CN63XX))
>> -		cvmx_write_csr(CVMX_L2C_WPAR_IOBX(0), mask);
>> -	else
>> -		cvmx_write_csr(CVMX_L2C_SPAR4,
>> -			       (cvmx_read_csr(CVMX_L2C_SPAR4) & ~0xFF) | mask);
>> -	return 0;
>> -}
>> -
>> -int cvmx_l2c_get_hw_way_partition(void)
>> -{
>> -	if (OCTEON_IS_MODEL(OCTEON_CN63XX))
>> -		return cvmx_read_csr(CVMX_L2C_WPAR_IOBX(0)) & 0xffff;
>> -	else
>> -		return cvmx_read_csr(CVMX_L2C_SPAR4) & (0xFF);
>> -}
>> -
>> -void cvmx_l2c_config_perf(uint32_t counter, enum cvmx_l2c_event event,
>> -			  uint32_t clear_on_read)
>> -{
>> -	if (OCTEON_IS_MODEL(OCTEON_CN5XXX) || OCTEON_IS_MODEL(OCTEON_CN3XXX)) {
>> -		union cvmx_l2c_pfctl pfctl;
>> -
>> -		pfctl.u64 = cvmx_read_csr(CVMX_L2C_PFCTL);
>> -
>> -		switch (counter) {
>> -		case 0:
>> -			pfctl.s.cnt0sel = event;
>> -			pfctl.s.cnt0ena = 1;
>> -			pfctl.s.cnt0rdclr = clear_on_read;
>> -			break;
>> -		case 1:
>> -			pfctl.s.cnt1sel = event;
>> -			pfctl.s.cnt1ena = 1;
>> -			pfctl.s.cnt1rdclr = clear_on_read;
>> -			break;
>> -		case 2:
>> -			pfctl.s.cnt2sel = event;
>> -			pfctl.s.cnt2ena = 1;
>> -			pfctl.s.cnt2rdclr = clear_on_read;
>> -			break;
>> -		case 3:
>> -		default:
>> -			pfctl.s.cnt3sel = event;
>> -			pfctl.s.cnt3ena = 1;
>> -			pfctl.s.cnt3rdclr = clear_on_read;
>> -			break;
>> -		}
>> -
>> -		cvmx_write_csr(CVMX_L2C_PFCTL, pfctl.u64);
>> -	} else {
>> -		union cvmx_l2c_tadx_prf l2c_tadx_prf;
>> -		int tad;
>> -
>> -		cvmx_dprintf("L2C performance counter events are different for this chip, mapping 'event' to cvmx_l2c_tad_event_t\n");
>> -		if (clear_on_read)
>> -			cvmx_dprintf("L2C counters don't support clear on read for this chip\n");
>> -
>> -		l2c_tadx_prf.u64 = cvmx_read_csr(CVMX_L2C_TADX_PRF(0));
>> -
>> -		switch (counter) {
>> -		case 0:
>> -			l2c_tadx_prf.s.cnt0sel = event;
>> -			break;
>> -		case 1:
>> -			l2c_tadx_prf.s.cnt1sel = event;
>> -			break;
>> -		case 2:
>> -			l2c_tadx_prf.s.cnt2sel = event;
>> -			break;
>> -		default:
>> -		case 3:
>> -			l2c_tadx_prf.s.cnt3sel = event;
>> -			break;
>> -		}
>> -		for (tad = 0; tad < CVMX_L2C_TADS; tad++)
>> -			cvmx_write_csr(CVMX_L2C_TADX_PRF(tad),
>> -				       l2c_tadx_prf.u64);
>> -	}
>> -}
>> -
>> -uint64_t cvmx_l2c_read_perf(uint32_t counter)
>> -{
>> -	switch (counter) {
>> -	case 0:
>> -		if (OCTEON_IS_MODEL(OCTEON_CN5XXX) || OCTEON_IS_MODEL(OCTEON_CN3XXX))
>> -			return cvmx_read_csr(CVMX_L2C_PFC0);
>> -		else {
>> -			uint64_t counter = 0;
>> -			int tad;
>> -			for (tad = 0; tad < CVMX_L2C_TADS; tad++)
>> -				counter += cvmx_read_csr(CVMX_L2C_TADX_PFC0(tad));
>> -			return counter;
>> -		}
>> -	case 1:
>> -		if (OCTEON_IS_MODEL(OCTEON_CN5XXX) || OCTEON_IS_MODEL(OCTEON_CN3XXX))
>> -			return cvmx_read_csr(CVMX_L2C_PFC1);
>> -		else {
>> -			uint64_t counter = 0;
>> -			int tad;
>> -			for (tad = 0; tad < CVMX_L2C_TADS; tad++)
>> -				counter += cvmx_read_csr(CVMX_L2C_TADX_PFC1(tad));
>> -			return counter;
>> -		}
>> -	case 2:
>> -		if (OCTEON_IS_MODEL(OCTEON_CN5XXX) || OCTEON_IS_MODEL(OCTEON_CN3XXX))
>> -			return cvmx_read_csr(CVMX_L2C_PFC2);
>> -		else {
>> -			uint64_t counter = 0;
>> -			int tad;
>> -			for (tad = 0; tad < CVMX_L2C_TADS; tad++)
>> -				counter += cvmx_read_csr(CVMX_L2C_TADX_PFC2(tad));
>> -			return counter;
>> -		}
>> -	case 3:
>> -	default:
>> -		if (OCTEON_IS_MODEL(OCTEON_CN5XXX) || OCTEON_IS_MODEL(OCTEON_CN3XXX))
>> -			return cvmx_read_csr(CVMX_L2C_PFC3);
>> -		else {
>> -			uint64_t counter = 0;
>> -			int tad;
>> -			for (tad = 0; tad < CVMX_L2C_TADS; tad++)
>> -				counter += cvmx_read_csr(CVMX_L2C_TADX_PFC3(tad));
>> -			return counter;
>> -		}
>> -	}
>> -}
>> -
>> -/**
>> - * @INTERNAL
>> - * Helper function use to fault in cache lines for L2 cache locking
>> - *
>> - * @addr:   Address of base of memory region to read into L2 cache
>> - * @len:    Length (in bytes) of region to fault in
>> - */
>> -static void fault_in(uint64_t addr, int len)
>> -{
>> -	volatile char *ptr;
>> -	volatile char dummy;
>> -	/*
>> -	 * Adjust addr and length so we get all cache lines even for
>> -	 * small ranges spanning two cache lines.
>> -	 */
>> -	len += addr & CVMX_CACHE_LINE_MASK;
>> -	addr &= ~CVMX_CACHE_LINE_MASK;
>> -	ptr = (volatile char *)cvmx_phys_to_ptr(addr);
>> -	/*
>> -	 * Invalidate L1 cache to make sure all loads result in data
>> -	 * being in L2.
>> -	 */
>> -	CVMX_DCACHE_INVALIDATE;
>> -	while (len > 0) {
>> -		dummy += *ptr;
>> -		len -= CVMX_CACHE_LINE_SIZE;
>> -		ptr += CVMX_CACHE_LINE_SIZE;
>> -	}
>> -}
>> -
>> -int cvmx_l2c_lock_line(uint64_t addr)
>> -{
>> -	if (OCTEON_IS_MODEL(OCTEON_CN63XX)) {
>> -		int shift = CVMX_L2C_TAG_ADDR_ALIAS_SHIFT;
>> -		uint64_t assoc = cvmx_l2c_get_num_assoc();
>> -		uint64_t tag = addr >> shift;
>> -		uint64_t index = CVMX_ADD_SEG(CVMX_MIPS_SPACE_XKPHYS, cvmx_l2c_address_to_index(addr) << CVMX_L2C_IDX_ADDR_SHIFT);
>> -		uint64_t way;
>> -		union cvmx_l2c_tadx_tag l2c_tadx_tag;
>> -
>> -		CVMX_CACHE_LCKL2(CVMX_ADD_SEG(CVMX_MIPS_SPACE_XKPHYS, addr), 0);
>> -
>> -		/* Make sure we were able to lock the line */
>> -		for (way = 0; way < assoc; way++) {
>> -			CVMX_CACHE_LTGL2I(index | (way << shift), 0);
>> -			/* make sure CVMX_L2C_TADX_TAG is updated */
>> -			CVMX_SYNC;
>> -			l2c_tadx_tag.u64 = cvmx_read_csr(CVMX_L2C_TADX_TAG(0));
>> -			if (l2c_tadx_tag.s.valid && l2c_tadx_tag.s.tag == tag)
>> -				break;
>> -		}
>> -
>> -		/* Check if a valid line is found */
>> -		if (way >= assoc) {
>> -			/* cvmx_dprintf("ERROR: cvmx_l2c_lock_line: line not found for locking at 0x%llx address\n", (unsigned long long)addr); */
>> -			return -1;
>> -		}
>> -
>> -		/* Check if lock bit is not set */
>> -		if (!l2c_tadx_tag.s.lock) {
>> -			/* cvmx_dprintf("ERROR: cvmx_l2c_lock_line: Not able to lock at 0x%llx address\n", (unsigned long long)addr); */
>> -			return -1;
>> -		}
>> -		return way;
>> -	} else {
>> -		int retval = 0;
>> -		union cvmx_l2c_dbg l2cdbg;
>> -		union cvmx_l2c_lckbase lckbase;
>> -		union cvmx_l2c_lckoff lckoff;
>> -		union cvmx_l2t_err l2t_err;
>> -
>> -		cvmx_spinlock_lock(&cvmx_l2c_spinlock);
>> -
>> -		l2cdbg.u64 = 0;
>> -		lckbase.u64 = 0;
>> -		lckoff.u64 = 0;
>> -
>> -		/* Clear l2t error bits if set */
>> -		l2t_err.u64 = cvmx_read_csr(CVMX_L2T_ERR);
>> -		l2t_err.s.lckerr = 1;
>> -		l2t_err.s.lckerr2 = 1;
>> -		cvmx_write_csr(CVMX_L2T_ERR, l2t_err.u64);
>> -
>> -		addr &= ~CVMX_CACHE_LINE_MASK;
>> -
>> -		/* Set this core as debug core */
>> -		l2cdbg.s.ppnum = cvmx_get_core_num();
>> -		CVMX_SYNC;
>> -		cvmx_write_csr(CVMX_L2C_DBG, l2cdbg.u64);
>> -		cvmx_read_csr(CVMX_L2C_DBG);
>> -
>> -		lckoff.s.lck_offset = 0; /* Only lock 1 line at a time */
>> -		cvmx_write_csr(CVMX_L2C_LCKOFF, lckoff.u64);
>> -		cvmx_read_csr(CVMX_L2C_LCKOFF);
>> -
>> -		if (((union cvmx_l2c_cfg)(cvmx_read_csr(CVMX_L2C_CFG))).s.idxalias) {
>> -			int alias_shift = CVMX_L2C_IDX_ADDR_SHIFT + 2 * CVMX_L2_SET_BITS - 1;
>> -			uint64_t addr_tmp = addr ^ (addr & ((1 << alias_shift) - 1)) >> CVMX_L2_SET_BITS;
>> -			lckbase.s.lck_base = addr_tmp >> 7;
>> -		} else {
>> -			lckbase.s.lck_base = addr >> 7;
>> -		}
>> -
>> -		lckbase.s.lck_ena = 1;
>> -		cvmx_write_csr(CVMX_L2C_LCKBASE, lckbase.u64);
>> -		/* Make sure it gets there */
>> -		cvmx_read_csr(CVMX_L2C_LCKBASE);
>> -
>> -		fault_in(addr, CVMX_CACHE_LINE_SIZE);
>> -
>> -		lckbase.s.lck_ena = 0;
>> -		cvmx_write_csr(CVMX_L2C_LCKBASE, lckbase.u64);
>> -		/* Make sure it gets there */
>> -		cvmx_read_csr(CVMX_L2C_LCKBASE);
>> -
>> -		/* Stop being debug core */
>> -		cvmx_write_csr(CVMX_L2C_DBG, 0);
>> -		cvmx_read_csr(CVMX_L2C_DBG);
>> -
>> -		l2t_err.u64 = cvmx_read_csr(CVMX_L2T_ERR);
>> -		if (l2t_err.s.lckerr || l2t_err.s.lckerr2)
>> -			retval = 1;  /* We were unable to lock the line */
>> -
>> -		cvmx_spinlock_unlock(&cvmx_l2c_spinlock);
>> -		return retval;
>> -	}
>> -}
>> -
>> -int cvmx_l2c_lock_mem_region(uint64_t start, uint64_t len)
>> -{
>> -	int retval = 0;
>> -
>> -	/* Round start/end to cache line boundaries */
>> -	len += start & CVMX_CACHE_LINE_MASK;
>> -	start &= ~CVMX_CACHE_LINE_MASK;
>> -	len = (len + CVMX_CACHE_LINE_MASK) & ~CVMX_CACHE_LINE_MASK;
>> -
>> -	while (len) {
>> -		retval += cvmx_l2c_lock_line(start);
>> -		start += CVMX_CACHE_LINE_SIZE;
>> -		len -= CVMX_CACHE_LINE_SIZE;
>> -	}
>> -	return retval;
>> -}
>> -
>> -void cvmx_l2c_flush(void)
>> -{
>> -	uint64_t assoc, set;
>> -	uint64_t n_assoc, n_set;
>> -
>> -	n_set = cvmx_l2c_get_num_sets();
>> -	n_assoc = cvmx_l2c_get_num_assoc();
>> -
>> -	if (OCTEON_IS_MODEL(OCTEON_CN6XXX)) {
>> -		uint64_t address;
>> -		/* These may look like constants, but they aren't... */
>> -		int assoc_shift = CVMX_L2C_TAG_ADDR_ALIAS_SHIFT;
>> -		int set_shift = CVMX_L2C_IDX_ADDR_SHIFT;
>> -		for (set = 0; set < n_set; set++) {
>> -			for (assoc = 0; assoc < n_assoc; assoc++) {
>> -				address = CVMX_ADD_SEG(CVMX_MIPS_SPACE_XKPHYS,
>> -						       (assoc << assoc_shift) |	(set << set_shift));
>> -				CVMX_CACHE_WBIL2I(address, 0);
>> -			}
>> -		}
>> -	} else {
>> -		for (set = 0; set < n_set; set++)
>> -			for (assoc = 0; assoc < n_assoc; assoc++)
>> -				cvmx_l2c_flush_line(assoc, set);
>> -	}
>> -}
>> -
>> -
>> -int cvmx_l2c_unlock_line(uint64_t address)
>> -{
>> -
>> -	if (OCTEON_IS_MODEL(OCTEON_CN63XX)) {
>> -		int assoc;
>> -		union cvmx_l2c_tag tag;
>> -		uint32_t tag_addr;
>> -		uint32_t index = cvmx_l2c_address_to_index(address);
>> -
>> -		tag_addr = ((address >> CVMX_L2C_TAG_ADDR_ALIAS_SHIFT) & ((1 << CVMX_L2C_TAG_ADDR_ALIAS_SHIFT) - 1));
>> -
>> -		/*
>> -		 * For 63XX, we can flush a line by using the physical
>> -		 * address directly, so finding the cache line used by
>> -		 * the address is only required to provide the proper
>> -		 * return value for the function.
>> -		 */
>> -		for (assoc = 0; assoc < CVMX_L2_ASSOC; assoc++) {
>> -			tag = cvmx_l2c_get_tag(assoc, index);
>> -
>> -			if (tag.s.V && (tag.s.addr == tag_addr)) {
>> -				CVMX_CACHE_WBIL2(CVMX_ADD_SEG(CVMX_MIPS_SPACE_XKPHYS, address), 0);
>> -				return tag.s.L;
>> -			}
>> -		}
>> -	} else {
>> -		int assoc;
>> -		union cvmx_l2c_tag tag;
>> -		uint32_t tag_addr;
>> -
>> -		uint32_t index = cvmx_l2c_address_to_index(address);
>> -
>> -		/* Compute portion of address that is stored in tag */
>> -		tag_addr = ((address >> CVMX_L2C_TAG_ADDR_ALIAS_SHIFT) & ((1 << CVMX_L2C_TAG_ADDR_ALIAS_SHIFT) - 1));
>> -		for (assoc = 0; assoc < CVMX_L2_ASSOC; assoc++) {
>> -			tag = cvmx_l2c_get_tag(assoc, index);
>> -
>> -			if (tag.s.V && (tag.s.addr == tag_addr)) {
>> -				cvmx_l2c_flush_line(assoc, index);
>> -				return tag.s.L;
>> -			}
>> -		}
>> -	}
>> -	return 0;
>> -}
>> -
>> -int cvmx_l2c_unlock_mem_region(uint64_t start, uint64_t len)
>> -{
>> -	int num_unlocked = 0;
>> -	/* Round start/end to cache line boundaries */
>> -	len += start & CVMX_CACHE_LINE_MASK;
>> -	start &= ~CVMX_CACHE_LINE_MASK;
>> -	len = (len + CVMX_CACHE_LINE_MASK) & ~CVMX_CACHE_LINE_MASK;
>> -	while (len > 0) {
>> -		num_unlocked += cvmx_l2c_unlock_line(start);
>> -		start += CVMX_CACHE_LINE_SIZE;
>> -		len -= CVMX_CACHE_LINE_SIZE;
>> -	}
>> -
>> -	return num_unlocked;
>> -}
>> -
>> -/*
>> - * Internal l2c tag types.  These are converted to a generic structure
>> - * that can be used on all chips.
>> - */
>> -union __cvmx_l2c_tag {
>> -	uint64_t u64;
>> -	struct cvmx_l2c_tag_cn50xx {
>> -		uint64_t reserved:40;
>> -		uint64_t V:1;		/* Line valid */
>> -		uint64_t D:1;		/* Line dirty */
>> -		uint64_t L:1;		/* Line locked */
>> -		uint64_t U:1;		/* Use, LRU eviction */
>> -		uint64_t addr:20;	/* Phys mem addr (33..14) */
>> -	} cn50xx;
>> -	struct cvmx_l2c_tag_cn30xx {
>> -		uint64_t reserved:41;
>> -		uint64_t V:1;		/* Line valid */
>> -		uint64_t D:1;		/* Line dirty */
>> -		uint64_t L:1;		/* Line locked */
>> -		uint64_t U:1;		/* Use, LRU eviction */
>> -		uint64_t addr:19;	/* Phys mem addr (33..15) */
>> -	} cn30xx;
>> -	struct cvmx_l2c_tag_cn31xx {
>> -		uint64_t reserved:42;
>> -		uint64_t V:1;		/* Line valid */
>> -		uint64_t D:1;		/* Line dirty */
>> -		uint64_t L:1;		/* Line locked */
>> -		uint64_t U:1;		/* Use, LRU eviction */
>> -		uint64_t addr:18;	/* Phys mem addr (33..16) */
>> -	} cn31xx;
>> -	struct cvmx_l2c_tag_cn38xx {
>> -		uint64_t reserved:43;
>> -		uint64_t V:1;		/* Line valid */
>> -		uint64_t D:1;		/* Line dirty */
>> -		uint64_t L:1;		/* Line locked */
>> -		uint64_t U:1;		/* Use, LRU eviction */
>> -		uint64_t addr:17;	/* Phys mem addr (33..17) */
>> -	} cn38xx;
>> -	struct cvmx_l2c_tag_cn58xx {
>> -		uint64_t reserved:44;
>> -		uint64_t V:1;		/* Line valid */
>> -		uint64_t D:1;		/* Line dirty */
>> -		uint64_t L:1;		/* Line locked */
>> -		uint64_t U:1;		/* Use, LRU eviction */
>> -		uint64_t addr:16;	/* Phys mem addr (33..18) */
>> -	} cn58xx;
>> -	struct cvmx_l2c_tag_cn58xx cn56xx;	/* 2048 sets */
>> -	struct cvmx_l2c_tag_cn31xx cn52xx;	/* 512 sets */
>> -};
>> -
>> -
>> -/**
>> - * @INTERNAL
>> - * Function to read a L2C tag.  This code make the current core
>> - * the 'debug core' for the L2.  This code must only be executed by
>> - * 1 core at a time.
>> - *
>> - * @assoc:  Association (way) of the tag to dump
>> - * @index:  Index of the cacheline
>> - *
>> - * Returns The Octeon model specific tag structure.  This is
>> - *         translated by a wrapper function to a generic form that is
>> - *         easier for applications to use.
>> - */
>> -static union __cvmx_l2c_tag __read_l2_tag(uint64_t assoc, uint64_t index)
>> -{
>> -
>> -	uint64_t debug_tag_addr = CVMX_ADD_SEG(CVMX_MIPS_SPACE_XKPHYS, (index << 7) + 96);
>> -	uint64_t core = cvmx_get_core_num();
>> -	union __cvmx_l2c_tag tag_val;
>> -	uint64_t dbg_addr = CVMX_L2C_DBG;
>> -	unsigned long flags;
>> -
>> -	union cvmx_l2c_dbg debug_val;
>> -	debug_val.u64 = 0;
>> -	/*
>> -	 * For low core count parts, the core number is always small
>> -	 * enough to stay in the correct field and not set any
>> -	 * reserved bits.
>> -	 */
>> -	debug_val.s.ppnum = core;
>> -	debug_val.s.l2t = 1;
>> -	debug_val.s.set = assoc;
>> -
>> -	local_irq_save(flags);
>> -	/*
>> -	 * Make sure core is quiet (no prefetches, etc.) before
>> -	 * entering debug mode.
>> -	 */
>> -	CVMX_SYNC;
>> -	/* Flush L1 to make sure debug load misses L1 */
>> -	CVMX_DCACHE_INVALIDATE;
>> -
>> -	/*
>> -	 * The following must be done in assembly as when in debug
>> -	 * mode all data loads from L2 return special debug data, not
>> -	 * normal memory contents.  Also, interrupts must be disabled,
>> -	 * since if an interrupt occurs while in debug mode the ISR
>> -	 * will get debug data from all its memory * reads instead of
>> -	 * the contents of memory.
>> -	 */
>> -
>> -	asm volatile (
>> -		".set push\n\t"
>> -		".set mips64\n\t"
>> -		".set noreorder\n\t"
>> -		"sd    %[dbg_val], 0(%[dbg_addr])\n\t"   /* Enter debug mode, wait for store */
>> -		"ld    $0, 0(%[dbg_addr])\n\t"
>> -		"ld    %[tag_val], 0(%[tag_addr])\n\t"   /* Read L2C tag data */
>> -		"sd    $0, 0(%[dbg_addr])\n\t"          /* Exit debug mode, wait for store */
>> -		"ld    $0, 0(%[dbg_addr])\n\t"
>> -		"cache 9, 0($0)\n\t"             /* Invalidate dcache to discard debug data */
>> -		".set pop"
>> -		: [tag_val] "=r" (tag_val)
>> -		: [dbg_addr] "r" (dbg_addr), [dbg_val] "r" (debug_val), [tag_addr] "r" (debug_tag_addr)
>> -		: "memory");
>> -
>> -	local_irq_restore(flags);
>> -
>> -	return tag_val;
>> -}
>> -
>> -
>> -union cvmx_l2c_tag cvmx_l2c_get_tag(uint32_t association, uint32_t index)
>> -{
>> -	union cvmx_l2c_tag tag;
>> -	tag.u64 = 0;
>> -
>> -	if ((int)association >= cvmx_l2c_get_num_assoc()) {
>> -		cvmx_dprintf("ERROR: cvmx_l2c_get_tag association out of range\n");
>> -		return tag;
>> -	}
>> -	if ((int)index >= cvmx_l2c_get_num_sets()) {
>> -		cvmx_dprintf("ERROR: cvmx_l2c_get_tag index out of range (arg: %d, max: %d)\n",
>> -			     (int)index, cvmx_l2c_get_num_sets());
>> -		return tag;
>> -	}
>> -	if (OCTEON_IS_MODEL(OCTEON_CN63XX)) {
>> -		union cvmx_l2c_tadx_tag l2c_tadx_tag;
>> -		uint64_t address = CVMX_ADD_SEG(CVMX_MIPS_SPACE_XKPHYS,
>> -						(association << CVMX_L2C_TAG_ADDR_ALIAS_SHIFT) |
>> -						(index << CVMX_L2C_IDX_ADDR_SHIFT));
>> -		/*
>> -		 * Use L2 cache Index load tag cache instruction, as
>> -		 * hardware loads the virtual tag for the L2 cache
>> -		 * block with the contents of L2C_TAD0_TAG
>> -		 * register.
>> -		 */
>> -		CVMX_CACHE_LTGL2I(address, 0);
>> -		CVMX_SYNC;   /* make sure CVMX_L2C_TADX_TAG is updated */
>> -		l2c_tadx_tag.u64 = cvmx_read_csr(CVMX_L2C_TADX_TAG(0));
>> -
>> -		tag.s.V     = l2c_tadx_tag.s.valid;
>> -		tag.s.D     = l2c_tadx_tag.s.dirty;
>> -		tag.s.L     = l2c_tadx_tag.s.lock;
>> -		tag.s.U     = l2c_tadx_tag.s.use;
>> -		tag.s.addr  = l2c_tadx_tag.s.tag;
>> -	} else {
>> -		union __cvmx_l2c_tag tmp_tag;
>> -		/* __read_l2_tag is intended for internal use only */
>> -		tmp_tag = __read_l2_tag(association, index);
>> -
>> -		/*
>> -		 * Convert all tag structure types to generic version,
>> -		 * as it can represent all models.
>> -		 */
>> -		if (OCTEON_IS_MODEL(OCTEON_CN58XX) || OCTEON_IS_MODEL(OCTEON_CN56XX)) {
>> -			tag.s.V    = tmp_tag.cn58xx.V;
>> -			tag.s.D    = tmp_tag.cn58xx.D;
>> -			tag.s.L    = tmp_tag.cn58xx.L;
>> -			tag.s.U    = tmp_tag.cn58xx.U;
>> -			tag.s.addr = tmp_tag.cn58xx.addr;
>> -		} else if (OCTEON_IS_MODEL(OCTEON_CN38XX)) {
>> -			tag.s.V    = tmp_tag.cn38xx.V;
>> -			tag.s.D    = tmp_tag.cn38xx.D;
>> -			tag.s.L    = tmp_tag.cn38xx.L;
>> -			tag.s.U    = tmp_tag.cn38xx.U;
>> -			tag.s.addr = tmp_tag.cn38xx.addr;
>> -		} else if (OCTEON_IS_MODEL(OCTEON_CN31XX) || OCTEON_IS_MODEL(OCTEON_CN52XX)) {
>> -			tag.s.V    = tmp_tag.cn31xx.V;
>> -			tag.s.D    = tmp_tag.cn31xx.D;
>> -			tag.s.L    = tmp_tag.cn31xx.L;
>> -			tag.s.U    = tmp_tag.cn31xx.U;
>> -			tag.s.addr = tmp_tag.cn31xx.addr;
>> -		} else if (OCTEON_IS_MODEL(OCTEON_CN30XX)) {
>> -			tag.s.V    = tmp_tag.cn30xx.V;
>> -			tag.s.D    = tmp_tag.cn30xx.D;
>> -			tag.s.L    = tmp_tag.cn30xx.L;
>> -			tag.s.U    = tmp_tag.cn30xx.U;
>> -			tag.s.addr = tmp_tag.cn30xx.addr;
>> -		} else if (OCTEON_IS_MODEL(OCTEON_CN50XX)) {
>> -			tag.s.V    = tmp_tag.cn50xx.V;
>> -			tag.s.D    = tmp_tag.cn50xx.D;
>> -			tag.s.L    = tmp_tag.cn50xx.L;
>> -			tag.s.U    = tmp_tag.cn50xx.U;
>> -			tag.s.addr = tmp_tag.cn50xx.addr;
>> -		} else {
>> -			cvmx_dprintf("Unsupported OCTEON Model in %s\n", __func__);
>> -		}
>> -	}
>> -	return tag;
>> -}
>> -
>> -uint32_t cvmx_l2c_address_to_index(uint64_t addr)
>> -{
>> -	uint64_t idx = addr >> CVMX_L2C_IDX_ADDR_SHIFT;
>> -	int indxalias = 0;
>> -
>> -	if (OCTEON_IS_MODEL(OCTEON_CN6XXX)) {
>> -		union cvmx_l2c_ctl l2c_ctl;
>> -		l2c_ctl.u64 = cvmx_read_csr(CVMX_L2C_CTL);
>> -		indxalias = !l2c_ctl.s.disidxalias;
>> -	} else {
>> -		union cvmx_l2c_cfg l2c_cfg;
>> -		l2c_cfg.u64 = cvmx_read_csr(CVMX_L2C_CFG);
>> -		indxalias = l2c_cfg.s.idxalias;
>> -	}
>> -
>> -	if (indxalias) {
>> -		if (OCTEON_IS_MODEL(OCTEON_CN63XX)) {
>> -			uint32_t a_14_12 = (idx / (CVMX_L2C_MEMBANK_SELECT_SIZE/(1<<CVMX_L2C_IDX_ADDR_SHIFT))) & 0x7;
>> -			idx ^= idx / cvmx_l2c_get_num_sets();
>> -			idx ^= a_14_12;
>> -		} else {
>> -			idx ^= ((addr & CVMX_L2C_ALIAS_MASK) >> CVMX_L2C_TAG_ADDR_ALIAS_SHIFT);
>> -		}
>> -	}
>> -	idx &= CVMX_L2C_IDX_MASK;
>> -	return idx;
>> -}
>> -
>> -int cvmx_l2c_get_cache_size_bytes(void)
>> -{
>> -	return cvmx_l2c_get_num_sets() * cvmx_l2c_get_num_assoc() *
>> -		CVMX_CACHE_LINE_SIZE;
>> -}
>> -
>> -/**
>> - * Return log base 2 of the number of sets in the L2 cache
>> - * Returns
>> - */
>> -int cvmx_l2c_get_set_bits(void)
>> -{
>> -	int l2_set_bits;
>> -	if (OCTEON_IS_MODEL(OCTEON_CN56XX) || OCTEON_IS_MODEL(OCTEON_CN58XX))
>> -		l2_set_bits = 11;	/* 2048 sets */
>> -	else if (OCTEON_IS_MODEL(OCTEON_CN38XX) || OCTEON_IS_MODEL(OCTEON_CN63XX))
>> -		l2_set_bits = 10;	/* 1024 sets */
>> -	else if (OCTEON_IS_MODEL(OCTEON_CN31XX) || OCTEON_IS_MODEL(OCTEON_CN52XX))
>> -		l2_set_bits = 9;	/* 512 sets */
>> -	else if (OCTEON_IS_MODEL(OCTEON_CN30XX))
>> -		l2_set_bits = 8;	/* 256 sets */
>> -	else if (OCTEON_IS_MODEL(OCTEON_CN50XX))
>> -		l2_set_bits = 7;	/* 128 sets */
>> -	else {
>> -		cvmx_dprintf("Unsupported OCTEON Model in %s\n", __func__);
>> -		l2_set_bits = 11;	/* 2048 sets */
>> -	}
>> -	return l2_set_bits;
>> -}
>> -
>> -/* Return the number of sets in the L2 Cache */
>> -int cvmx_l2c_get_num_sets(void)
>> -{
>> -	return 1 << cvmx_l2c_get_set_bits();
>> -}
>> -
>> -/* Return the number of associations in the L2 Cache */
>> -int cvmx_l2c_get_num_assoc(void)
>> -{
>> -	int l2_assoc;
>> -	if (OCTEON_IS_MODEL(OCTEON_CN56XX) ||
>> -	    OCTEON_IS_MODEL(OCTEON_CN52XX) ||
>> -	    OCTEON_IS_MODEL(OCTEON_CN58XX) ||
>> -	    OCTEON_IS_MODEL(OCTEON_CN50XX) ||
>> -	    OCTEON_IS_MODEL(OCTEON_CN38XX))
>> -		l2_assoc = 8;
>> -	else if (OCTEON_IS_MODEL(OCTEON_CN63XX))
>> -		l2_assoc = 16;
>> -	else if (OCTEON_IS_MODEL(OCTEON_CN31XX) ||
>> -		 OCTEON_IS_MODEL(OCTEON_CN30XX))
>> -		l2_assoc = 4;
>> -	else {
>> -		cvmx_dprintf("Unsupported OCTEON Model in %s\n", __func__);
>> -		l2_assoc = 8;
>> -	}
>> -
>> -	/* Check to see if part of the cache is disabled */
>> -	if (OCTEON_IS_MODEL(OCTEON_CN63XX)) {
>> -		union cvmx_mio_fus_dat3 mio_fus_dat3;
>> -
>> -		mio_fus_dat3.u64 = cvmx_read_csr(CVMX_MIO_FUS_DAT3);
>> -		/*
>> -		 * cvmx_mio_fus_dat3.s.l2c_crip fuses map as follows
>> -		 * <2> will be not used for 63xx
>> -		 * <1> disables 1/2 ways
>> -		 * <0> disables 1/4 ways
>> -		 * They are cumulative, so for 63xx:
>> -		 * <1> <0>
>> -		 * 0 0 16-way 2MB cache
>> -		 * 0 1 12-way 1.5MB cache
>> -		 * 1 0 8-way 1MB cache
>> -		 * 1 1 4-way 512KB cache
>> -		 */
>> -
>> -		if (mio_fus_dat3.s.l2c_crip == 3)
>> -			l2_assoc = 4;
>> -		else if (mio_fus_dat3.s.l2c_crip == 2)
>> -			l2_assoc = 8;
>> -		else if (mio_fus_dat3.s.l2c_crip == 1)
>> -			l2_assoc = 12;
>> -	} else {
>> -		union cvmx_l2d_fus3 val;
>> -		val.u64 = cvmx_read_csr(CVMX_L2D_FUS3);
>> -		/*
>> -		 * Using shifts here, as bit position names are
>> -		 * different for each model but they all mean the
>> -		 * same.
>> -		 */
>> -		if ((val.u64 >> 35) & 0x1)
>> -			l2_assoc = l2_assoc >> 2;
>> -		else if ((val.u64 >> 34) & 0x1)
>> -			l2_assoc = l2_assoc >> 1;
>> -	}
>> -	return l2_assoc;
>> -}
>> -
>> -/**
>> - * Flush a line from the L2 cache
>> - * This should only be called from one core at a time, as this routine
>> - * sets the core to the 'debug' core in order to flush the line.
>> - *
>> - * @assoc:  Association (or way) to flush
>> - * @index:  Index to flush
>> - */
>> -void cvmx_l2c_flush_line(uint32_t assoc, uint32_t index)
>> -{
>> -	/* Check the range of the index. */
>> -	if (index > (uint32_t)cvmx_l2c_get_num_sets()) {
>> -		cvmx_dprintf("ERROR: cvmx_l2c_flush_line index out of range.\n");
>> -		return;
>> -	}
>> -
>> -	/* Check the range of association. */
>> -	if (assoc > (uint32_t)cvmx_l2c_get_num_assoc()) {
>> -		cvmx_dprintf("ERROR: cvmx_l2c_flush_line association out of range.\n");
>> -		return;
>> -	}
>> -
>> -	if (OCTEON_IS_MODEL(OCTEON_CN63XX)) {
>> -		uint64_t address;
>> -		/* Create the address based on index and association.
>> -		 * Bits<20:17> select the way of the cache block involved in
>> -		 *             the operation
>> -		 * Bits<16:7> of the effect address select the index
>> -		 */
>> -		address = CVMX_ADD_SEG(CVMX_MIPS_SPACE_XKPHYS,
>> -				(assoc << CVMX_L2C_TAG_ADDR_ALIAS_SHIFT) |
>> -				(index << CVMX_L2C_IDX_ADDR_SHIFT));
>> -		CVMX_CACHE_WBIL2I(address, 0);
>> -	} else {
>> -		union cvmx_l2c_dbg l2cdbg;
>> -
>> -		l2cdbg.u64 = 0;
>> -		if (!OCTEON_IS_MODEL(OCTEON_CN30XX))
>> -			l2cdbg.s.ppnum = cvmx_get_core_num();
>> -		l2cdbg.s.finv = 1;
>> -
>> -		l2cdbg.s.set = assoc;
>> -		cvmx_spinlock_lock(&cvmx_l2c_spinlock);
>> -		/*
>> -		 * Enter debug mode, and make sure all other writes
>> -		 * complete before we enter debug mode
>> -		 */
>> -		CVMX_SYNC;
>> -		cvmx_write_csr(CVMX_L2C_DBG, l2cdbg.u64);
>> -		cvmx_read_csr(CVMX_L2C_DBG);
>> -
>> -		CVMX_PREPARE_FOR_STORE(CVMX_ADD_SEG(CVMX_MIPS_SPACE_XKPHYS,
>> -						    index * CVMX_CACHE_LINE_SIZE),
>> -				       0);
>> -		/* Exit debug mode */
>> -		CVMX_SYNC;
>> -		cvmx_write_csr(CVMX_L2C_DBG, 0);
>> -		cvmx_read_csr(CVMX_L2C_DBG);
>> -		cvmx_spinlock_unlock(&cvmx_l2c_spinlock);
>> -	}
>> -}
>> diff --git a/arch/unicore32/include/asm/byteorder.h b/arch/unicore32/include/asm/byteorder.h
>> deleted file mode 100644
>> index ebe1b3f..0000000
>> --- a/arch/unicore32/include/asm/byteorder.h
>> +++ /dev/null
>> @@ -1,24 +0,0 @@
>> -/*
>> - * linux/arch/unicore32/include/asm/byteorder.h
>> - *
>> - * Code specific to PKUnity SoC and UniCore ISA
>> - *
>> - * Copyright (C) 2001-2010 GUAN Xue-tao
>> - *
>> - * This program is free software; you can redistribute it and/or modify
>> - * it under the terms of the GNU General Public License version 2 as
>> - * published by the Free Software Foundation.
>> - *
>> - * UniCore ONLY support Little Endian mode, the data bus is connected such
>> - * that byte accesses appear as:
>> - *  0 = d0...d7, 1 = d8...d15, 2 = d16...d23, 3 = d24...d31
>> - * and word accesses (data or instruction) appear as:
>> - *  d0...d31
>> - */
>> -#ifndef __UNICORE_BYTEORDER_H__
>> -#define __UNICORE_BYTEORDER_H__
>> -
>> -#include <linux/byteorder/little_endian.h>
>> -
>> -#endif
>> -
>> diff --git a/arch/unicore32/include/asm/kvm_para.h b/arch/unicore32/include/asm/kvm_para.h
>> deleted file mode 100644
>> index 14fab8f..0000000
>> --- a/arch/unicore32/include/asm/kvm_para.h
>> +++ /dev/null
>> @@ -1 +0,0 @@
>> -#include <asm-generic/kvm_para.h>
>> diff --git a/arch/unicore32/include/asm/sigcontext.h b/arch/unicore32/include/asm/sigcontext.h
>> deleted file mode 100644
>> index 6a2d767..0000000
>> --- a/arch/unicore32/include/asm/sigcontext.h
>> +++ /dev/null
>> @@ -1,29 +0,0 @@
>> -/*
>> - * linux/arch/unicore32/include/asm/sigcontext.h
>> - *
>> - * Code specific to PKUnity SoC and UniCore ISA
>> - *
>> - * Copyright (C) 2001-2010 GUAN Xue-tao
>> - *
>> - * This program is free software; you can redistribute it and/or modify
>> - * it under the terms of the GNU General Public License version 2 as
>> - * published by the Free Software Foundation.
>> - */
>> -#ifndef __UNICORE_SIGCONTEXT_H__
>> -#define __UNICORE_SIGCONTEXT_H__
>> -
>> -#include <asm/ptrace.h>
>> -/*
>> - * Signal context structure - contains all info to do with the state
>> - * before the signal handler was invoked.  Note: only add new entries
>> - * to the end of the structure.
>> - */
>> -struct sigcontext {
>> -	unsigned long trap_no;
>> -	unsigned long error_code;
>> -	unsigned long oldmask;
>> -	unsigned long fault_address;
>> -	struct pt_regs regs;
>> -};
>> -
>> -#endif
>> diff --git a/arch/unicore32/include/asm/unistd.h b/arch/unicore32/include/asm/unistd.h
>> deleted file mode 100644
>> index 2abcf61..0000000
>> --- a/arch/unicore32/include/asm/unistd.h
>> +++ /dev/null
>> @@ -1,14 +0,0 @@
>> -/*
>> - * linux/arch/unicore32/include/asm/unistd.h
>> - *
>> - * Code specific to PKUnity SoC and UniCore ISA
>> - *
>> - * Copyright (C) 2001-2010 GUAN Xue-tao
>> - *
>> - * This program is free software; you can redistribute it and/or modify
>> - * it under the terms of the GNU General Public License version 2 as
>> - * published by the Free Software Foundation.
>> - */
>> -
>> -/* Use the standard ABI for syscalls. */
>> -#include <asm-generic/unistd.h>
>> diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
>> index c91f4c9..5d57469 100644
>> --- a/arch/x86/kvm/x86.c
>> +++ b/arch/x86/kvm/x86.c
>> @@ -5938,6 +5938,12 @@ int kvm_arch_vcpu_ioctl_translate(struct kvm_vcpu *vcpu,
>>   	return 0;
>>   }
>>   
>> +int kvm_arch_vcpu_ioctl_set_entitlement(struct kvm_vcpu *vcpu, long entitlement)
>> +{
>> +	vcpu->arch.consigned_limit = entitlement;
>> +	return 0;
>> +}
>> +
>>   int kvm_arch_vcpu_ioctl_get_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu)
>>   {
>>   	struct i387_fxsave_struct *fxsave =
>> diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
>> index 0e2212f..de13648 100644
>> --- a/include/linux/kvm_host.h
>> +++ b/include/linux/kvm_host.h
>> @@ -590,6 +590,8 @@ void kvm_arch_hardware_unsetup(void);
>>   void kvm_arch_check_processor_compat(void *rtn);
>>   int kvm_arch_vcpu_runnable(struct kvm_vcpu *vcpu);
>>   int kvm_arch_vcpu_should_kick(struct kvm_vcpu *vcpu);
>> +int kvm_arch_vcpu_ioctl_set_entitlement(struct kvm_vcpu *vcpu,
>> +					long entitlement);
>>   
>>   void kvm_free_physmem(struct kvm *kvm);
>>   
>> diff --git a/include/linux/raid/md_p.h b/include/linux/raid/md_p.h
>> deleted file mode 100644
>> index ee75353..0000000
>> --- a/include/linux/raid/md_p.h
>> +++ /dev/null
>> @@ -1,301 +0,0 @@
>> -/*
>> -   md_p.h : physical layout of Linux RAID devices
>> -          Copyright (C) 1996-98 Ingo Molnar, Gadi Oxman
>> -	
>> -   This program is free software; you can redistribute it and/or modify
>> -   it under the terms of the GNU General Public License as published by
>> -   the Free Software Foundation; either version 2, or (at your option)
>> -   any later version.
>> -
>> -   You should have received a copy of the GNU General Public License
>> -   (for example /usr/src/linux/COPYING); if not, write to the Free
>> -   Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
>> -*/
>> -
>> -#ifndef _MD_P_H
>> -#define _MD_P_H
>> -
>> -#include <linux/types.h>
>> -
>> -/*
>> - * RAID superblock.
>> - *
>> - * The RAID superblock maintains some statistics on each RAID configuration.
>> - * Each real device in the RAID set contains it near the end of the device.
>> - * Some of the ideas are copied from the ext2fs implementation.
>> - *
>> - * We currently use 4096 bytes as follows:
>> - *
>> - *	word offset	function
>> - *
>> - *	   0  -    31	Constant generic RAID device information.
>> - *        32  -    63   Generic state information.
>> - *	  64  -   127	Personality specific information.
>> - *	 128  -   511	12 32-words descriptors of the disks in the raid set.
>> - *	 512  -   911	Reserved.
>> - *	 912  -  1023	Disk specific descriptor.
>> - */
>> -
>> -/*
>> - * If x is the real device size in bytes, we return an apparent size of:
>> - *
>> - *	y = (x & ~(MD_RESERVED_BYTES - 1)) - MD_RESERVED_BYTES
>> - *
>> - * and place the 4kB superblock at offset y.
>> - */
>> -#define MD_RESERVED_BYTES		(64 * 1024)
>> -#define MD_RESERVED_SECTORS		(MD_RESERVED_BYTES / 512)
>> -
>> -#define MD_NEW_SIZE_SECTORS(x)		((x & ~(MD_RESERVED_SECTORS - 1)) - MD_RESERVED_SECTORS)
>> -
>> -#define MD_SB_BYTES			4096
>> -#define MD_SB_WORDS			(MD_SB_BYTES / 4)
>> -#define MD_SB_SECTORS			(MD_SB_BYTES / 512)
>> -
>> -/*
>> - * The following are counted in 32-bit words
>> - */
>> -#define	MD_SB_GENERIC_OFFSET		0
>> -#define MD_SB_PERSONALITY_OFFSET	64
>> -#define MD_SB_DISKS_OFFSET		128
>> -#define MD_SB_DESCRIPTOR_OFFSET		992
>> -
>> -#define MD_SB_GENERIC_CONSTANT_WORDS	32
>> -#define MD_SB_GENERIC_STATE_WORDS	32
>> -#define MD_SB_GENERIC_WORDS		(MD_SB_GENERIC_CONSTANT_WORDS + MD_SB_GENERIC_STATE_WORDS)
>> -#define MD_SB_PERSONALITY_WORDS		64
>> -#define MD_SB_DESCRIPTOR_WORDS		32
>> -#define MD_SB_DISKS			27
>> -#define MD_SB_DISKS_WORDS		(MD_SB_DISKS*MD_SB_DESCRIPTOR_WORDS)
>> -#define MD_SB_RESERVED_WORDS		(1024 - MD_SB_GENERIC_WORDS - MD_SB_PERSONALITY_WORDS - MD_SB_DISKS_WORDS - MD_SB_DESCRIPTOR_WORDS)
>> -#define MD_SB_EQUAL_WORDS		(MD_SB_GENERIC_WORDS + MD_SB_PERSONALITY_WORDS + MD_SB_DISKS_WORDS)
>> -
>> -/*
>> - * Device "operational" state bits
>> - */
>> -#define MD_DISK_FAULTY		0 /* disk is faulty / operational */
>> -#define MD_DISK_ACTIVE		1 /* disk is running or spare disk */
>> -#define MD_DISK_SYNC		2 /* disk is in sync with the raid set */
>> -#define MD_DISK_REMOVED		3 /* disk is in sync with the raid set */
>> -
>> -#define	MD_DISK_WRITEMOSTLY	9 /* disk is "write-mostly" is RAID1 config.
>> -				   * read requests will only be sent here in
>> -				   * dire need
>> -				   */
>> -
>> -typedef struct mdp_device_descriptor_s {
>> -	__u32 number;		/* 0 Device number in the entire set	      */
>> -	__u32 major;		/* 1 Device major number		      */
>> -	__u32 minor;		/* 2 Device minor number		      */
>> -	__u32 raid_disk;	/* 3 The role of the device in the raid set   */
>> -	__u32 state;		/* 4 Operational state			      */
>> -	__u32 reserved[MD_SB_DESCRIPTOR_WORDS - 5];
>> -} mdp_disk_t;
>> -
>> -#define MD_SB_MAGIC		0xa92b4efc
>> -
>> -/*
>> - * Superblock state bits
>> - */
>> -#define MD_SB_CLEAN		0
>> -#define MD_SB_ERRORS		1
>> -
>> -#define	MD_SB_BITMAP_PRESENT	8 /* bitmap may be present nearby */
>> -
>> -/*
>> - * Notes:
>> - * - if an array is being reshaped (restriped) in order to change the
>> - *   the number of active devices in the array, 'raid_disks' will be
>> - *   the larger of the old and new numbers.  'delta_disks' will
>> - *   be the "new - old".  So if +ve, raid_disks is the new value, and
>> - *   "raid_disks-delta_disks" is the old.  If -ve, raid_disks is the
>> - *   old value and "raid_disks+delta_disks" is the new (smaller) value.
>> - */
>> -
>> -
>> -typedef struct mdp_superblock_s {
>> -	/*
>> -	 * Constant generic information
>> -	 */
>> -	__u32 md_magic;		/*  0 MD identifier 			      */
>> -	__u32 major_version;	/*  1 major version to which the set conforms */
>> -	__u32 minor_version;	/*  2 minor version ...			      */
>> -	__u32 patch_version;	/*  3 patchlevel version ...		      */
>> -	__u32 gvalid_words;	/*  4 Number of used words in this section    */
>> -	__u32 set_uuid0;	/*  5 Raid set identifier		      */
>> -	__u32 ctime;		/*  6 Creation time			      */
>> -	__u32 level;		/*  7 Raid personality			      */
>> -	__u32 size;		/*  8 Apparent size of each individual disk   */
>> -	__u32 nr_disks;		/*  9 total disks in the raid set	      */
>> -	__u32 raid_disks;	/* 10 disks in a fully functional raid set    */
>> -	__u32 md_minor;		/* 11 preferred MD minor device number	      */
>> -	__u32 not_persistent;	/* 12 does it have a persistent superblock    */
>> -	__u32 set_uuid1;	/* 13 Raid set identifier #2		      */
>> -	__u32 set_uuid2;	/* 14 Raid set identifier #3		      */
>> -	__u32 set_uuid3;	/* 15 Raid set identifier #4		      */
>> -	__u32 gstate_creserved[MD_SB_GENERIC_CONSTANT_WORDS - 16];
>> -
>> -	/*
>> -	 * Generic state information
>> -	 */
>> -	__u32 utime;		/*  0 Superblock update time		      */
>> -	__u32 state;		/*  1 State bits (clean, ...)		      */
>> -	__u32 active_disks;	/*  2 Number of currently active disks	      */
>> -	__u32 working_disks;	/*  3 Number of working disks		      */
>> -	__u32 failed_disks;	/*  4 Number of failed disks		      */
>> -	__u32 spare_disks;	/*  5 Number of spare disks		      */
>> -	__u32 sb_csum;		/*  6 checksum of the whole superblock        */
>> -#ifdef __BIG_ENDIAN
>> -	__u32 events_hi;	/*  7 high-order of superblock update count   */
>> -	__u32 events_lo;	/*  8 low-order of superblock update count    */
>> -	__u32 cp_events_hi;	/*  9 high-order of checkpoint update count   */
>> -	__u32 cp_events_lo;	/* 10 low-order of checkpoint update count    */
>> -#else
>> -	__u32 events_lo;	/*  7 low-order of superblock update count    */
>> -	__u32 events_hi;	/*  8 high-order of superblock update count   */
>> -	__u32 cp_events_lo;	/*  9 low-order of checkpoint update count    */
>> -	__u32 cp_events_hi;	/* 10 high-order of checkpoint update count   */
>> -#endif
>> -	__u32 recovery_cp;	/* 11 recovery checkpoint sector count	      */
>> -	/* There are only valid for minor_version > 90 */
>> -	__u64 reshape_position;	/* 12,13 next address in array-space for reshape */
>> -	__u32 new_level;	/* 14 new level we are reshaping to	      */
>> -	__u32 delta_disks;	/* 15 change in number of raid_disks	      */
>> -	__u32 new_layout;	/* 16 new layout			      */
>> -	__u32 new_chunk;	/* 17 new chunk size (bytes)		      */
>> -	__u32 gstate_sreserved[MD_SB_GENERIC_STATE_WORDS - 18];
>> -
>> -	/*
>> -	 * Personality information
>> -	 */
>> -	__u32 layout;		/*  0 the array's physical layout	      */
>> -	__u32 chunk_size;	/*  1 chunk size in bytes		      */
>> -	__u32 root_pv;		/*  2 LV root PV */
>> -	__u32 root_block;	/*  3 LV root block */
>> -	__u32 pstate_reserved[MD_SB_PERSONALITY_WORDS - 4];
>> -
>> -	/*
>> -	 * Disks information
>> -	 */
>> -	mdp_disk_t disks[MD_SB_DISKS];
>> -
>> -	/*
>> -	 * Reserved
>> -	 */
>> -	__u32 reserved[MD_SB_RESERVED_WORDS];
>> -
>> -	/*
>> -	 * Active descriptor
>> -	 */
>> -	mdp_disk_t this_disk;
>> -
>> -} mdp_super_t;
>> -
>> -static inline __u64 md_event(mdp_super_t *sb) {
>> -	__u64 ev = sb->events_hi;
>> -	return (ev<<32)| sb->events_lo;
>> -}
>> -
>> -#define MD_SUPERBLOCK_1_TIME_SEC_MASK ((1ULL<<40) - 1)
>> -
>> -/*
>> - * The version-1 superblock :
>> - * All numeric fields are little-endian.
>> - *
>> - * total size: 256 bytes plus 2 per device.
>> - *  1K allows 384 devices.
>> - */
>> -struct mdp_superblock_1 {
>> -	/* constant array information - 128 bytes */
>> -	__le32	magic;		/* MD_SB_MAGIC: 0xa92b4efc - little endian */
>> -	__le32	major_version;	/* 1 */
>> -	__le32	feature_map;	/* bit 0 set if 'bitmap_offset' is meaningful */
>> -	__le32	pad0;		/* always set to 0 when writing */
>> -
>> -	__u8	set_uuid[16];	/* user-space generated. */
>> -	char	set_name[32];	/* set and interpreted by user-space */
>> -
>> -	__le64	ctime;		/* lo 40 bits are seconds, top 24 are microseconds or 0*/
>> -	__le32	level;		/* -4 (multipath), -1 (linear), 0,1,4,5 */
>> -	__le32	layout;		/* only for raid5 and raid10 currently */
>> -	__le64	size;		/* used size of component devices, in 512byte sectors */
>> -
>> -	__le32	chunksize;	/* in 512byte sectors */
>> -	__le32	raid_disks;
>> -	__le32	bitmap_offset;	/* sectors after start of superblock that bitmap starts
>> -				 * NOTE: signed, so bitmap can be before superblock
>> -				 * only meaningful of feature_map[0] is set.
>> -				 */
>> -
>> -	/* These are only valid with feature bit '4' */
>> -	__le32	new_level;	/* new level we are reshaping to		*/
>> -	__le64	reshape_position;	/* next address in array-space for reshape */
>> -	__le32	delta_disks;	/* change in number of raid_disks		*/
>> -	__le32	new_layout;	/* new layout					*/
>> -	__le32	new_chunk;	/* new chunk size (512byte sectors)		*/
>> -	__le32  new_offset;	/* signed number to add to data_offset in new
>> -				 * layout.  0 == no-change.  This can be
>> -				 * different on each device in the array.
>> -				 */
>> -
>> -	/* constant this-device information - 64 bytes */
>> -	__le64	data_offset;	/* sector start of data, often 0 */
>> -	__le64	data_size;	/* sectors in this device that can be used for data */
>> -	__le64	super_offset;	/* sector start of this superblock */
>> -	__le64	recovery_offset;/* sectors before this offset (from data_offset) have been recovered */
>> -	__le32	dev_number;	/* permanent identifier of this  device - not role in raid */
>> -	__le32	cnt_corrected_read; /* number of read errors that were corrected by re-writing */
>> -	__u8	device_uuid[16]; /* user-space setable, ignored by kernel */
>> -	__u8	devflags;	/* per-device flags.  Only one defined...*/
>> -#define	WriteMostly1	1	/* mask for writemostly flag in above */
>> -	/* Bad block log.  If there are any bad blocks the feature flag is set.
>> -	 * If offset and size are non-zero, that space is reserved and available
>> -	 */
>> -	__u8	bblog_shift;	/* shift from sectors to block size */
>> -	__le16	bblog_size;	/* number of sectors reserved for list */
>> -	__le32	bblog_offset;	/* sector offset from superblock to bblog,
>> -				 * signed - not unsigned */
>> -
>> -	/* array state information - 64 bytes */
>> -	__le64	utime;		/* 40 bits second, 24 bits microseconds */
>> -	__le64	events;		/* incremented when superblock updated */
>> -	__le64	resync_offset;	/* data before this offset (from data_offset) known to be in sync */
>> -	__le32	sb_csum;	/* checksum up to devs[max_dev] */
>> -	__le32	max_dev;	/* size of devs[] array to consider */
>> -	__u8	pad3[64-32];	/* set to 0 when writing */
>> -
>> -	/* device state information. Indexed by dev_number.
>> -	 * 2 bytes per device
>> -	 * Note there are no per-device state flags. State information is rolled
>> -	 * into the 'roles' value.  If a device is spare or faulty, then it doesn't
>> -	 * have a meaningful role.
>> -	 */
>> -	__le16	dev_roles[0];	/* role in array, or 0xffff for a spare, or 0xfffe for faulty */
>> -};
>> -
>> -/* feature_map bits */
>> -#define MD_FEATURE_BITMAP_OFFSET	1
>> -#define	MD_FEATURE_RECOVERY_OFFSET	2 /* recovery_offset is present and
>> -					   * must be honoured
>> -					   */
>> -#define	MD_FEATURE_RESHAPE_ACTIVE	4
>> -#define	MD_FEATURE_BAD_BLOCKS		8 /* badblock list is not empty */
>> -#define	MD_FEATURE_REPLACEMENT		16 /* This device is replacing an
>> -					    * active device with same 'role'.
>> -					    * 'recovery_offset' is also set.
>> -					    */
>> -#define	MD_FEATURE_RESHAPE_BACKWARDS	32 /* Reshape doesn't change number
>> -					    * of devices, but is going
>> -					    * backwards anyway.
>> -					    */
>> -#define	MD_FEATURE_NEW_OFFSET		64 /* new_offset must be honoured */
>> -#define	MD_FEATURE_ALL			(MD_FEATURE_BITMAP_OFFSET	\
>> -					|MD_FEATURE_RECOVERY_OFFSET	\
>> -					|MD_FEATURE_RESHAPE_ACTIVE	\
>> -					|MD_FEATURE_BAD_BLOCKS		\
>> -					|MD_FEATURE_REPLACEMENT		\
>> -					|MD_FEATURE_RESHAPE_BACKWARDS	\
>> -					|MD_FEATURE_NEW_OFFSET		\
>> -					)
>> -
>> -#endif
>> diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h
>> index 0a6d6ba..86f24bb 100644
>> --- a/include/uapi/linux/kvm.h
>> +++ b/include/uapi/linux/kvm.h
>> @@ -921,6 +921,8 @@ struct kvm_s390_ucas_mapping {
>>   #define KVM_SET_ONE_REG		  _IOW(KVMIO,  0xac, struct kvm_one_reg)
>>   /* VM is being stopped by host */
>>   #define KVM_KVMCLOCK_CTRL	  _IO(KVMIO,   0xad)
>> +/* Set the consignment limit which will be used to separete steal time */
>> +#define KVM_SET_ENTITLEMENT	  _IOW(KVMIO, 0xae, unsigned long)
>>   
>>   #define KVM_DEV_ASSIGN_ENABLE_IOMMU	(1 << 0)
>>   #define KVM_DEV_ASSIGN_PCI_2_3		(1 << 1)
>> diff --git a/tools/perf/builtin-test.c b/tools/perf/builtin-test.c
>> deleted file mode 100644
>> index a04276e..0000000
>> --- a/tools/perf/builtin-test.c
>> +++ /dev/null
>> @@ -1,1559 +0,0 @@
>> -/*
>> - * builtin-test.c
>> - *
>> - * Builtin regression testing command: ever growing number of sanity tests
>> - */
>> -#include "builtin.h"
>> -
>> -#include "util/cache.h"
>> -#include "util/color.h"
>> -#include "util/debug.h"
>> -#include "util/debugfs.h"
>> -#include "util/evlist.h"
>> -#include "util/parse-options.h"
>> -#include "util/parse-events.h"
>> -#include "util/symbol.h"
>> -#include "util/thread_map.h"
>> -#include "util/pmu.h"
>> -#include "event-parse.h"
>> -#include "../../include/linux/hw_breakpoint.h"
>> -
>> -#include <sys/mman.h>
>> -
>> -static int vmlinux_matches_kallsyms_filter(struct map *map __maybe_unused,
>> -					   struct symbol *sym)
>> -{
>> -	bool *visited = symbol__priv(sym);
>> -	*visited = true;
>> -	return 0;
>> -}
>> -
>> -static int test__vmlinux_matches_kallsyms(void)
>> -{
>> -	int err = -1;
>> -	struct rb_node *nd;
>> -	struct symbol *sym;
>> -	struct map *kallsyms_map, *vmlinux_map;
>> -	struct machine kallsyms, vmlinux;
>> -	enum map_type type = MAP__FUNCTION;
>> -	struct ref_reloc_sym ref_reloc_sym = { .name = "_stext", };
>> -
>> -	/*
>> -	 * Step 1:
>> -	 *
>> -	 * Init the machines that will hold kernel, modules obtained from
>> -	 * both vmlinux + .ko files and from /proc/kallsyms split by modules.
>> -	 */
>> -	machine__init(&kallsyms, "", HOST_KERNEL_ID);
>> -	machine__init(&vmlinux, "", HOST_KERNEL_ID);
>> -
>> -	/*
>> -	 * Step 2:
>> -	 *
>> -	 * Create the kernel maps for kallsyms and the DSO where we will then
>> -	 * load /proc/kallsyms. Also create the modules maps from /proc/modules
>> -	 * and find the .ko files that match them in /lib/modules/`uname -r`/.
>> -	 */
>> -	if (machine__create_kernel_maps(&kallsyms) < 0) {
>> -		pr_debug("machine__create_kernel_maps ");
>> -		return -1;
>> -	}
>> -
>> -	/*
>> -	 * Step 3:
>> -	 *
>> -	 * Load and split /proc/kallsyms into multiple maps, one per module.
>> -	 */
>> -	if (machine__load_kallsyms(&kallsyms, "/proc/kallsyms", type, NULL) <= 0) {
>> -		pr_debug("dso__load_kallsyms ");
>> -		goto out;
>> -	}
>> -
>> -	/*
>> -	 * Step 4:
>> -	 *
>> -	 * kallsyms will be internally on demand sorted by name so that we can
>> -	 * find the reference relocation * symbol, i.e. the symbol we will use
>> -	 * to see if the running kernel was relocated by checking if it has the
>> -	 * same value in the vmlinux file we load.
>> -	 */
>> -	kallsyms_map = machine__kernel_map(&kallsyms, type);
>> -
>> -	sym = map__find_symbol_by_name(kallsyms_map, ref_reloc_sym.name, NULL);
>> -	if (sym == NULL) {
>> -		pr_debug("dso__find_symbol_by_name ");
>> -		goto out;
>> -	}
>> -
>> -	ref_reloc_sym.addr = sym->start;
>> -
>> -	/*
>> -	 * Step 5:
>> -	 *
>> -	 * Now repeat step 2, this time for the vmlinux file we'll auto-locate.
>> -	 */
>> -	if (machine__create_kernel_maps(&vmlinux) < 0) {
>> -		pr_debug("machine__create_kernel_maps ");
>> -		goto out;
>> -	}
>> -
>> -	vmlinux_map = machine__kernel_map(&vmlinux, type);
>> -	map__kmap(vmlinux_map)->ref_reloc_sym = &ref_reloc_sym;
>> -
>> -	/*
>> -	 * Step 6:
>> -	 *
>> -	 * Locate a vmlinux file in the vmlinux path that has a buildid that
>> -	 * matches the one of the running kernel.
>> -	 *
>> -	 * While doing that look if we find the ref reloc symbol, if we find it
>> -	 * we'll have its ref_reloc_symbol.unrelocated_addr and then
>> -	 * maps__reloc_vmlinux will notice and set proper ->[un]map_ip routines
>> -	 * to fixup the symbols.
>> -	 */
>> -	if (machine__load_vmlinux_path(&vmlinux, type,
>> -				       vmlinux_matches_kallsyms_filter) <= 0) {
>> -		pr_debug("machine__load_vmlinux_path ");
>> -		goto out;
>> -	}
>> -
>> -	err = 0;
>> -	/*
>> -	 * Step 7:
>> -	 *
>> -	 * Now look at the symbols in the vmlinux DSO and check if we find all of them
>> -	 * in the kallsyms dso. For the ones that are in both, check its names and
>> -	 * end addresses too.
>> -	 */
>> -	for (nd = rb_first(&vmlinux_map->dso->symbols[type]); nd; nd = rb_next(nd)) {
>> -		struct symbol *pair, *first_pair;
>> -		bool backwards = true;
>> -
>> -		sym  = rb_entry(nd, struct symbol, rb_node);
>> -
>> -		if (sym->start == sym->end)
>> -			continue;
>> -
>> -		first_pair = machine__find_kernel_symbol(&kallsyms, type, sym->start, NULL, NULL);
>> -		pair = first_pair;
>> -
>> -		if (pair && pair->start == sym->start) {
>> -next_pair:
>> -			if (strcmp(sym->name, pair->name) == 0) {
>> -				/*
>> -				 * kallsyms don't have the symbol end, so we
>> -				 * set that by using the next symbol start - 1,
>> -				 * in some cases we get this up to a page
>> -				 * wrong, trace_kmalloc when I was developing
>> -				 * this code was one such example, 2106 bytes
>> -				 * off the real size. More than that and we
>> -				 * _really_ have a problem.
>> -				 */
>> -				s64 skew = sym->end - pair->end;
>> -				if (llabs(skew) < page_size)
>> -					continue;
>> -
>> -				pr_debug("%#" PRIx64 ": diff end addr for %s v: %#" PRIx64 " k: %#" PRIx64 "\n",
>> -					 sym->start, sym->name, sym->end, pair->end);
>> -			} else {
>> -				struct rb_node *nnd;
>> -detour:
>> -				nnd = backwards ? rb_prev(&pair->rb_node) :
>> -						  rb_next(&pair->rb_node);
>> -				if (nnd) {
>> -					struct symbol *next = rb_entry(nnd, struct symbol, rb_node);
>> -
>> -					if (next->start == sym->start) {
>> -						pair = next;
>> -						goto next_pair;
>> -					}
>> -				}
>> -
>> -				if (backwards) {
>> -					backwards = false;
>> -					pair = first_pair;
>> -					goto detour;
>> -				}
>> -
>> -				pr_debug("%#" PRIx64 ": diff name v: %s k: %s\n",
>> -					 sym->start, sym->name, pair->name);
>> -			}
>> -		} else
>> -			pr_debug("%#" PRIx64 ": %s not on kallsyms\n", sym->start, sym->name);
>> -
>> -		err = -1;
>> -	}
>> -
>> -	if (!verbose)
>> -		goto out;
>> -
>> -	pr_info("Maps only in vmlinux:\n");
>> -
>> -	for (nd = rb_first(&vmlinux.kmaps.maps[type]); nd; nd = rb_next(nd)) {
>> -		struct map *pos = rb_entry(nd, struct map, rb_node), *pair;
>> -		/*
>> -		 * If it is the kernel, kallsyms is always "[kernel.kallsyms]", while
>> -		 * the kernel will have the path for the vmlinux file being used,
>> -		 * so use the short name, less descriptive but the same ("[kernel]" in
>> -		 * both cases.
>> -		 */
>> -		pair = map_groups__find_by_name(&kallsyms.kmaps, type,
>> -						(pos->dso->kernel ?
>> -							pos->dso->short_name :
>> -							pos->dso->name));
>> -		if (pair)
>> -			pair->priv = 1;
>> -		else
>> -			map__fprintf(pos, stderr);
>> -	}
>> -
>> -	pr_info("Maps in vmlinux with a different name in kallsyms:\n");
>> -
>> -	for (nd = rb_first(&vmlinux.kmaps.maps[type]); nd; nd = rb_next(nd)) {
>> -		struct map *pos = rb_entry(nd, struct map, rb_node), *pair;
>> -
>> -		pair = map_groups__find(&kallsyms.kmaps, type, pos->start);
>> -		if (pair == NULL || pair->priv)
>> -			continue;
>> -
>> -		if (pair->start == pos->start) {
>> -			pair->priv = 1;
>> -			pr_info(" %" PRIx64 "-%" PRIx64 " %" PRIx64 " %s in kallsyms as",
>> -				pos->start, pos->end, pos->pgoff, pos->dso->name);
>> -			if (pos->pgoff != pair->pgoff || pos->end != pair->end)
>> -				pr_info(": \n*%" PRIx64 "-%" PRIx64 " %" PRIx64 "",
>> -					pair->start, pair->end, pair->pgoff);
>> -			pr_info(" %s\n", pair->dso->name);
>> -			pair->priv = 1;
>> -		}
>> -	}
>> -
>> -	pr_info("Maps only in kallsyms:\n");
>> -
>> -	for (nd = rb_first(&kallsyms.kmaps.maps[type]);
>> -	     nd; nd = rb_next(nd)) {
>> -		struct map *pos = rb_entry(nd, struct map, rb_node);
>> -
>> -		if (!pos->priv)
>> -			map__fprintf(pos, stderr);
>> -	}
>> -out:
>> -	return err;
>> -}
>> -
>> -#include "util/cpumap.h"
>> -#include "util/evsel.h"
>> -#include <sys/types.h>
>> -
>> -static int trace_event__id(const char *evname)
>> -{
>> -	char *filename;
>> -	int err = -1, fd;
>> -
>> -	if (asprintf(&filename,
>> -		     "%s/syscalls/%s/id",
>> -		     tracing_events_path, evname) < 0)
>> -		return -1;
>> -
>> -	fd = open(filename, O_RDONLY);
>> -	if (fd >= 0) {
>> -		char id[16];
>> -		if (read(fd, id, sizeof(id)) > 0)
>> -			err = atoi(id);
>> -		close(fd);
>> -	}
>> -
>> -	free(filename);
>> -	return err;
>> -}
>> -
>> -static int test__open_syscall_event(void)
>> -{
>> -	int err = -1, fd;
>> -	struct thread_map *threads;
>> -	struct perf_evsel *evsel;
>> -	struct perf_event_attr attr;
>> -	unsigned int nr_open_calls = 111, i;
>> -	int id = trace_event__id("sys_enter_open");
>> -
>> -	if (id < 0) {
>> -		pr_debug("is debugfs mounted on /sys/kernel/debug?\n");
>> -		return -1;
>> -	}
>> -
>> -	threads = thread_map__new(-1, getpid(), UINT_MAX);
>> -	if (threads == NULL) {
>> -		pr_debug("thread_map__new\n");
>> -		return -1;
>> -	}
>> -
>> -	memset(&attr, 0, sizeof(attr));
>> -	attr.type = PERF_TYPE_TRACEPOINT;
>> -	attr.config = id;
>> -	evsel = perf_evsel__new(&attr, 0);
>> -	if (evsel == NULL) {
>> -		pr_debug("perf_evsel__new\n");
>> -		goto out_thread_map_delete;
>> -	}
>> -
>> -	if (perf_evsel__open_per_thread(evsel, threads) < 0) {
>> -		pr_debug("failed to open counter: %s, "
>> -			 "tweak /proc/sys/kernel/perf_event_paranoid?\n",
>> -			 strerror(errno));
>> -		goto out_evsel_delete;
>> -	}
>> -
>> -	for (i = 0; i < nr_open_calls; ++i) {
>> -		fd = open("/etc/passwd", O_RDONLY);
>> -		close(fd);
>> -	}
>> -
>> -	if (perf_evsel__read_on_cpu(evsel, 0, 0) < 0) {
>> -		pr_debug("perf_evsel__read_on_cpu\n");
>> -		goto out_close_fd;
>> -	}
>> -
>> -	if (evsel->counts->cpu[0].val != nr_open_calls) {
>> -		pr_debug("perf_evsel__read_on_cpu: expected to intercept %d calls, got %" PRIu64 "\n",
>> -			 nr_open_calls, evsel->counts->cpu[0].val);
>> -		goto out_close_fd;
>> -	}
>> -	
>> -	err = 0;
>> -out_close_fd:
>> -	perf_evsel__close_fd(evsel, 1, threads->nr);
>> -out_evsel_delete:
>> -	perf_evsel__delete(evsel);
>> -out_thread_map_delete:
>> -	thread_map__delete(threads);
>> -	return err;
>> -}
>> -
>> -#include <sched.h>
>> -
>> -static int test__open_syscall_event_on_all_cpus(void)
>> -{
>> -	int err = -1, fd, cpu;
>> -	struct thread_map *threads;
>> -	struct cpu_map *cpus;
>> -	struct perf_evsel *evsel;
>> -	struct perf_event_attr attr;
>> -	unsigned int nr_open_calls = 111, i;
>> -	cpu_set_t cpu_set;
>> -	int id = trace_event__id("sys_enter_open");
>> -
>> -	if (id < 0) {
>> -		pr_debug("is debugfs mounted on /sys/kernel/debug?\n");
>> -		return -1;
>> -	}
>> -
>> -	threads = thread_map__new(-1, getpid(), UINT_MAX);
>> -	if (threads == NULL) {
>> -		pr_debug("thread_map__new\n");
>> -		return -1;
>> -	}
>> -
>> -	cpus = cpu_map__new(NULL);
>> -	if (cpus == NULL) {
>> -		pr_debug("cpu_map__new\n");
>> -		goto out_thread_map_delete;
>> -	}
>> -
>> -
>> -	CPU_ZERO(&cpu_set);
>> -
>> -	memset(&attr, 0, sizeof(attr));
>> -	attr.type = PERF_TYPE_TRACEPOINT;
>> -	attr.config = id;
>> -	evsel = perf_evsel__new(&attr, 0);
>> -	if (evsel == NULL) {
>> -		pr_debug("perf_evsel__new\n");
>> -		goto out_thread_map_delete;
>> -	}
>> -
>> -	if (perf_evsel__open(evsel, cpus, threads) < 0) {
>> -		pr_debug("failed to open counter: %s, "
>> -			 "tweak /proc/sys/kernel/perf_event_paranoid?\n",
>> -			 strerror(errno));
>> -		goto out_evsel_delete;
>> -	}
>> -
>> -	for (cpu = 0; cpu < cpus->nr; ++cpu) {
>> -		unsigned int ncalls = nr_open_calls + cpu;
>> -		/*
>> -		 * XXX eventually lift this restriction in a way that
>> -		 * keeps perf building on older glibc installations
>> -		 * without CPU_ALLOC. 1024 cpus in 2010 still seems
>> -		 * a reasonable upper limit tho :-)
>> -		 */
>> -		if (cpus->map[cpu] >= CPU_SETSIZE) {
>> -			pr_debug("Ignoring CPU %d\n", cpus->map[cpu]);
>> -			continue;
>> -		}
>> -
>> -		CPU_SET(cpus->map[cpu], &cpu_set);
>> -		if (sched_setaffinity(0, sizeof(cpu_set), &cpu_set) < 0) {
>> -			pr_debug("sched_setaffinity() failed on CPU %d: %s ",
>> -				 cpus->map[cpu],
>> -				 strerror(errno));
>> -			goto out_close_fd;
>> -		}
>> -		for (i = 0; i < ncalls; ++i) {
>> -			fd = open("/etc/passwd", O_RDONLY);
>> -			close(fd);
>> -		}
>> -		CPU_CLR(cpus->map[cpu], &cpu_set);
>> -	}
>> -
>> -	/*
>> -	 * Here we need to explicitely preallocate the counts, as if
>> -	 * we use the auto allocation it will allocate just for 1 cpu,
>> -	 * as we start by cpu 0.
>> -	 */
>> -	if (perf_evsel__alloc_counts(evsel, cpus->nr) < 0) {
>> -		pr_debug("perf_evsel__alloc_counts(ncpus=%d)\n", cpus->nr);
>> -		goto out_close_fd;
>> -	}
>> -
>> -	err = 0;
>> -
>> -	for (cpu = 0; cpu < cpus->nr; ++cpu) {
>> -		unsigned int expected;
>> -
>> -		if (cpus->map[cpu] >= CPU_SETSIZE)
>> -			continue;
>> -
>> -		if (perf_evsel__read_on_cpu(evsel, cpu, 0) < 0) {
>> -			pr_debug("perf_evsel__read_on_cpu\n");
>> -			err = -1;
>> -			break;
>> -		}
>> -
>> -		expected = nr_open_calls + cpu;
>> -		if (evsel->counts->cpu[cpu].val != expected) {
>> -			pr_debug("perf_evsel__read_on_cpu: expected to intercept %d calls on cpu %d, got %" PRIu64 "\n",
>> -				 expected, cpus->map[cpu], evsel->counts->cpu[cpu].val);
>> -			err = -1;
>> -		}
>> -	}
>> -
>> -out_close_fd:
>> -	perf_evsel__close_fd(evsel, 1, threads->nr);
>> -out_evsel_delete:
>> -	perf_evsel__delete(evsel);
>> -out_thread_map_delete:
>> -	thread_map__delete(threads);
>> -	return err;
>> -}
>> -
>> -/*
>> - * This test will generate random numbers of calls to some getpid syscalls,
>> - * then establish an mmap for a group of events that are created to monitor
>> - * the syscalls.
>> - *
>> - * It will receive the events, using mmap, use its PERF_SAMPLE_ID generated
>> - * sample.id field to map back to its respective perf_evsel instance.
>> - *
>> - * Then it checks if the number of syscalls reported as perf events by
>> - * the kernel corresponds to the number of syscalls made.
>> - */
>> -static int test__basic_mmap(void)
>> -{
>> -	int err = -1;
>> -	union perf_event *event;
>> -	struct thread_map *threads;
>> -	struct cpu_map *cpus;
>> -	struct perf_evlist *evlist;
>> -	struct perf_event_attr attr = {
>> -		.type		= PERF_TYPE_TRACEPOINT,
>> -		.read_format	= PERF_FORMAT_ID,
>> -		.sample_type	= PERF_SAMPLE_ID,
>> -		.watermark	= 0,
>> -	};
>> -	cpu_set_t cpu_set;
>> -	const char *syscall_names[] = { "getsid", "getppid", "getpgrp",
>> -					"getpgid", };
>> -	pid_t (*syscalls[])(void) = { (void *)getsid, getppid, getpgrp,
>> -				      (void*)getpgid };
>> -#define nsyscalls ARRAY_SIZE(syscall_names)
>> -	int ids[nsyscalls];
>> -	unsigned int nr_events[nsyscalls],
>> -		     expected_nr_events[nsyscalls], i, j;
>> -	struct perf_evsel *evsels[nsyscalls], *evsel;
>> -
>> -	for (i = 0; i < nsyscalls; ++i) {
>> -		char name[64];
>> -
>> -		snprintf(name, sizeof(name), "sys_enter_%s", syscall_names[i]);
>> -		ids[i] = trace_event__id(name);
>> -		if (ids[i] < 0) {
>> -			pr_debug("Is debugfs mounted on /sys/kernel/debug?\n");
>> -			return -1;
>> -		}
>> -		nr_events[i] = 0;
>> -		expected_nr_events[i] = random() % 257;
>> -	}
>> -
>> -	threads = thread_map__new(-1, getpid(), UINT_MAX);
>> -	if (threads == NULL) {
>> -		pr_debug("thread_map__new\n");
>> -		return -1;
>> -	}
>> -
>> -	cpus = cpu_map__new(NULL);
>> -	if (cpus == NULL) {
>> -		pr_debug("cpu_map__new\n");
>> -		goto out_free_threads;
>> -	}
>> -
>> -	CPU_ZERO(&cpu_set);
>> -	CPU_SET(cpus->map[0], &cpu_set);
>> -	sched_setaffinity(0, sizeof(cpu_set), &cpu_set);
>> -	if (sched_setaffinity(0, sizeof(cpu_set), &cpu_set) < 0) {
>> -		pr_debug("sched_setaffinity() failed on CPU %d: %s ",
>> -			 cpus->map[0], strerror(errno));
>> -		goto out_free_cpus;
>> -	}
>> -
>> -	evlist = perf_evlist__new(cpus, threads);
>> -	if (evlist == NULL) {
>> -		pr_debug("perf_evlist__new\n");
>> -		goto out_free_cpus;
>> -	}
>> -
>> -	/* anonymous union fields, can't be initialized above */
>> -	attr.wakeup_events = 1;
>> -	attr.sample_period = 1;
>> -
>> -	for (i = 0; i < nsyscalls; ++i) {
>> -		attr.config = ids[i];
>> -		evsels[i] = perf_evsel__new(&attr, i);
>> -		if (evsels[i] == NULL) {
>> -			pr_debug("perf_evsel__new\n");
>> -			goto out_free_evlist;
>> -		}
>> -
>> -		perf_evlist__add(evlist, evsels[i]);
>> -
>> -		if (perf_evsel__open(evsels[i], cpus, threads) < 0) {
>> -			pr_debug("failed to open counter: %s, "
>> -				 "tweak /proc/sys/kernel/perf_event_paranoid?\n",
>> -				 strerror(errno));
>> -			goto out_close_fd;
>> -		}
>> -	}
>> -
>> -	if (perf_evlist__mmap(evlist, 128, true) < 0) {
>> -		pr_debug("failed to mmap events: %d (%s)\n", errno,
>> -			 strerror(errno));
>> -		goto out_close_fd;
>> -	}
>> -
>> -	for (i = 0; i < nsyscalls; ++i)
>> -		for (j = 0; j < expected_nr_events[i]; ++j) {
>> -			int foo = syscalls[i]();
>> -			++foo;
>> -		}
>> -
>> -	while ((event = perf_evlist__mmap_read(evlist, 0)) != NULL) {
>> -		struct perf_sample sample;
>> -
>> -		if (event->header.type != PERF_RECORD_SAMPLE) {
>> -			pr_debug("unexpected %s event\n",
>> -				 perf_event__name(event->header.type));
>> -			goto out_munmap;
>> -		}
>> -
>> -		err = perf_evlist__parse_sample(evlist, event, &sample);
>> -		if (err) {
>> -			pr_err("Can't parse sample, err = %d\n", err);
>> -			goto out_munmap;
>> -		}
>> -
>> -		evsel = perf_evlist__id2evsel(evlist, sample.id);
>> -		if (evsel == NULL) {
>> -			pr_debug("event with id %" PRIu64
>> -				 " doesn't map to an evsel\n", sample.id);
>> -			goto out_munmap;
>> -		}
>> -		nr_events[evsel->idx]++;
>> -	}
>> -
>> -	list_for_each_entry(evsel, &evlist->entries, node) {
>> -		if (nr_events[evsel->idx] != expected_nr_events[evsel->idx]) {
>> -			pr_debug("expected %d %s events, got %d\n",
>> -				 expected_nr_events[evsel->idx],
>> -				 perf_evsel__name(evsel), nr_events[evsel->idx]);
>> -			goto out_munmap;
>> -		}
>> -	}
>> -
>> -	err = 0;
>> -out_munmap:
>> -	perf_evlist__munmap(evlist);
>> -out_close_fd:
>> -	for (i = 0; i < nsyscalls; ++i)
>> -		perf_evsel__close_fd(evsels[i], 1, threads->nr);
>> -out_free_evlist:
>> -	perf_evlist__delete(evlist);
>> -out_free_cpus:
>> -	cpu_map__delete(cpus);
>> -out_free_threads:
>> -	thread_map__delete(threads);
>> -	return err;
>> -#undef nsyscalls
>> -}
>> -
>> -static int sched__get_first_possible_cpu(pid_t pid, cpu_set_t **maskp,
>> -					 size_t *sizep)
>> -{
>> -	cpu_set_t *mask;
>> -	size_t size;
>> -	int i, cpu = -1, nrcpus = 1024;
>> -realloc:
>> -	mask = CPU_ALLOC(nrcpus);
>> -	size = CPU_ALLOC_SIZE(nrcpus);
>> -	CPU_ZERO_S(size, mask);
>> -
>> -	if (sched_getaffinity(pid, size, mask) == -1) {
>> -		CPU_FREE(mask);
>> -		if (errno == EINVAL && nrcpus < (1024 << 8)) {
>> -			nrcpus = nrcpus << 2;
>> -			goto realloc;
>> -		}
>> -		perror("sched_getaffinity");
>> -			return -1;
>> -	}
>> -
>> -	for (i = 0; i < nrcpus; i++) {
>> -		if (CPU_ISSET_S(i, size, mask)) {
>> -			if (cpu == -1) {
>> -				cpu = i;
>> -				*maskp = mask;
>> -				*sizep = size;
>> -			} else
>> -				CPU_CLR_S(i, size, mask);
>> -		}
>> -	}
>> -
>> -	if (cpu == -1)
>> -		CPU_FREE(mask);
>> -
>> -	return cpu;
>> -}
>> -
>> -static int test__PERF_RECORD(void)
>> -{
>> -	struct perf_record_opts opts = {
>> -		.target = {
>> -			.uid = UINT_MAX,
>> -			.uses_mmap = true,
>> -		},
>> -		.no_delay   = true,
>> -		.freq	    = 10,
>> -		.mmap_pages = 256,
>> -	};
>> -	cpu_set_t *cpu_mask = NULL;
>> -	size_t cpu_mask_size = 0;
>> -	struct perf_evlist *evlist = perf_evlist__new(NULL, NULL);
>> -	struct perf_evsel *evsel;
>> -	struct perf_sample sample;
>> -	const char *cmd = "sleep";
>> -	const char *argv[] = { cmd, "1", NULL, };
>> -	char *bname;
>> -	u64 prev_time = 0;
>> -	bool found_cmd_mmap = false,
>> -	     found_libc_mmap = false,
>> -	     found_vdso_mmap = false,
>> -	     found_ld_mmap = false;
>> -	int err = -1, errs = 0, i, wakeups = 0;
>> -	u32 cpu;
>> -	int total_events = 0, nr_events[PERF_RECORD_MAX] = { 0, };
>> -
>> -	if (evlist == NULL || argv == NULL) {
>> -		pr_debug("Not enough memory to create evlist\n");
>> -		goto out;
>> -	}
>> -
>> -	/*
>> -	 * We need at least one evsel in the evlist, use the default
>> -	 * one: "cycles".
>> -	 */
>> -	err = perf_evlist__add_default(evlist);
>> -	if (err < 0) {
>> -		pr_debug("Not enough memory to create evsel\n");
>> -		goto out_delete_evlist;
>> -	}
>> -
>> -	/*
>> -	 * Create maps of threads and cpus to monitor. In this case
>> -	 * we start with all threads and cpus (-1, -1) but then in
>> -	 * perf_evlist__prepare_workload we'll fill in the only thread
>> -	 * we're monitoring, the one forked there.
>> -	 */
>> -	err = perf_evlist__create_maps(evlist, &opts.target);
>> -	if (err < 0) {
>> -		pr_debug("Not enough memory to create thread/cpu maps\n");
>> -		goto out_delete_evlist;
>> -	}
>> -
>> -	/*
>> -	 * Prepare the workload in argv[] to run, it'll fork it, and then wait
>> -	 * for perf_evlist__start_workload() to exec it. This is done this way
>> -	 * so that we have time to open the evlist (calling sys_perf_event_open
>> -	 * on all the fds) and then mmap them.
>> -	 */
>> -	err = perf_evlist__prepare_workload(evlist, &opts, argv);
>> -	if (err < 0) {
>> -		pr_debug("Couldn't run the workload!\n");
>> -		goto out_delete_evlist;
>> -	}
>> -
>> -	/*
>> -	 * Config the evsels, setting attr->comm on the first one, etc.
>> -	 */
>> -	evsel = perf_evlist__first(evlist);
>> -	evsel->attr.sample_type |= PERF_SAMPLE_CPU;
>> -	evsel->attr.sample_type |= PERF_SAMPLE_TID;
>> -	evsel->attr.sample_type |= PERF_SAMPLE_TIME;
>> -	perf_evlist__config_attrs(evlist, &opts);
>> -
>> -	err = sched__get_first_possible_cpu(evlist->workload.pid, &cpu_mask,
>> -					    &cpu_mask_size);
>> -	if (err < 0) {
>> -		pr_debug("sched__get_first_possible_cpu: %s\n", strerror(errno));
>> -		goto out_delete_evlist;
>> -	}
>> -
>> -	cpu = err;
>> -
>> -	/*
>> -	 * So that we can check perf_sample.cpu on all the samples.
>> -	 */
>> -	if (sched_setaffinity(evlist->workload.pid, cpu_mask_size, cpu_mask) < 0) {
>> -		pr_debug("sched_setaffinity: %s\n", strerror(errno));
>> -		goto out_free_cpu_mask;
>> -	}
>> -
>> -	/*
>> -	 * Call sys_perf_event_open on all the fds on all the evsels,
>> -	 * grouping them if asked to.
>> -	 */
>> -	err = perf_evlist__open(evlist);
>> -	if (err < 0) {
>> -		pr_debug("perf_evlist__open: %s\n", strerror(errno));
>> -		goto out_delete_evlist;
>> -	}
>> -
>> -	/*
>> -	 * mmap the first fd on a given CPU and ask for events for the other
>> -	 * fds in the same CPU to be injected in the same mmap ring buffer
>> -	 * (using ioctl(PERF_EVENT_IOC_SET_OUTPUT)).
>> -	 */
>> -	err = perf_evlist__mmap(evlist, opts.mmap_pages, false);
>> -	if (err < 0) {
>> -		pr_debug("perf_evlist__mmap: %s\n", strerror(errno));
>> -		goto out_delete_evlist;
>> -	}
>> -
>> -	/*
>> -	 * Now that all is properly set up, enable the events, they will
>> -	 * count just on workload.pid, which will start...
>> -	 */
>> -	perf_evlist__enable(evlist);
>> -
>> -	/*
>> -	 * Now!
>> -	 */
>> -	perf_evlist__start_workload(evlist);
>> -
>> -	while (1) {
>> -		int before = total_events;
>> -
>> -		for (i = 0; i < evlist->nr_mmaps; i++) {
>> -			union perf_event *event;
>> -
>> -			while ((event = perf_evlist__mmap_read(evlist, i)) != NULL) {
>> -				const u32 type = event->header.type;
>> -				const char *name = perf_event__name(type);
>> -
>> -				++total_events;
>> -				if (type < PERF_RECORD_MAX)
>> -					nr_events[type]++;
>> -
>> -				err = perf_evlist__parse_sample(evlist, event, &sample);
>> -				if (err < 0) {
>> -					if (verbose)
>> -						perf_event__fprintf(event, stderr);
>> -					pr_debug("Couldn't parse sample\n");
>> -					goto out_err;
>> -				}
>> -
>> -				if (verbose) {
>> -					pr_info("%" PRIu64" %d ", sample.time, sample.cpu);
>> -					perf_event__fprintf(event, stderr);
>> -				}
>> -
>> -				if (prev_time > sample.time) {
>> -					pr_debug("%s going backwards in time, prev=%" PRIu64 ", curr=%" PRIu64 "\n",
>> -						 name, prev_time, sample.time);
>> -					++errs;
>> -				}
>> -
>> -				prev_time = sample.time;
>> -
>> -				if (sample.cpu != cpu) {
>> -					pr_debug("%s with unexpected cpu, expected %d, got %d\n",
>> -						 name, cpu, sample.cpu);
>> -					++errs;
>> -				}
>> -
>> -				if ((pid_t)sample.pid != evlist->workload.pid) {
>> -					pr_debug("%s with unexpected pid, expected %d, got %d\n",
>> -						 name, evlist->workload.pid, sample.pid);
>> -					++errs;
>> -				}
>> -
>> -				if ((pid_t)sample.tid != evlist->workload.pid) {
>> -					pr_debug("%s with unexpected tid, expected %d, got %d\n",
>> -						 name, evlist->workload.pid, sample.tid);
>> -					++errs;
>> -				}
>> -
>> -				if ((type == PERF_RECORD_COMM ||
>> -				     type == PERF_RECORD_MMAP ||
>> -				     type == PERF_RECORD_FORK ||
>> -				     type == PERF_RECORD_EXIT) &&
>> -				     (pid_t)event->comm.pid != evlist->workload.pid) {
>> -					pr_debug("%s with unexpected pid/tid\n", name);
>> -					++errs;
>> -				}
>> -
>> -				if ((type == PERF_RECORD_COMM ||
>> -				     type == PERF_RECORD_MMAP) &&
>> -				     event->comm.pid != event->comm.tid) {
>> -					pr_debug("%s with different pid/tid!\n", name);
>> -					++errs;
>> -				}
>> -
>> -				switch (type) {
>> -				case PERF_RECORD_COMM:
>> -					if (strcmp(event->comm.comm, cmd)) {
>> -						pr_debug("%s with unexpected comm!\n", name);
>> -						++errs;
>> -					}
>> -					break;
>> -				case PERF_RECORD_EXIT:
>> -					goto found_exit;
>> -				case PERF_RECORD_MMAP:
>> -					bname = strrchr(event->mmap.filename, '/');
>> -					if (bname != NULL) {
>> -						if (!found_cmd_mmap)
>> -							found_cmd_mmap = !strcmp(bname + 1, cmd);
>> -						if (!found_libc_mmap)
>> -							found_libc_mmap = !strncmp(bname + 1, "libc", 4);
>> -						if (!found_ld_mmap)
>> -							found_ld_mmap = !strncmp(bname + 1, "ld", 2);
>> -					} else if (!found_vdso_mmap)
>> -						found_vdso_mmap = !strcmp(event->mmap.filename, "[vdso]");
>> -					break;
>> -
>> -				case PERF_RECORD_SAMPLE:
>> -					/* Just ignore samples for now */
>> -					break;
>> -				default:
>> -					pr_debug("Unexpected perf_event->header.type %d!\n",
>> -						 type);
>> -					++errs;
>> -				}
>> -			}
>> -		}
>> -
>> -		/*
>> -		 * We don't use poll here because at least at 3.1 times the
>> -		 * PERF_RECORD_{!SAMPLE} events don't honour
>> -		 * perf_event_attr.wakeup_events, just PERF_EVENT_SAMPLE does.
>> -		 */
>> -		if (total_events == before && false)
>> -			poll(evlist->pollfd, evlist->nr_fds, -1);
>> -
>> -		sleep(1);
>> -		if (++wakeups > 5) {
>> -			pr_debug("No PERF_RECORD_EXIT event!\n");
>> -			break;
>> -		}
>> -	}
>> -
>> -found_exit:
>> -	if (nr_events[PERF_RECORD_COMM] > 1) {
>> -		pr_debug("Excessive number of PERF_RECORD_COMM events!\n");
>> -		++errs;
>> -	}
>> -
>> -	if (nr_events[PERF_RECORD_COMM] == 0) {
>> -		pr_debug("Missing PERF_RECORD_COMM for %s!\n", cmd);
>> -		++errs;
>> -	}
>> -
>> -	if (!found_cmd_mmap) {
>> -		pr_debug("PERF_RECORD_MMAP for %s missing!\n", cmd);
>> -		++errs;
>> -	}
>> -
>> -	if (!found_libc_mmap) {
>> -		pr_debug("PERF_RECORD_MMAP for %s missing!\n", "libc");
>> -		++errs;
>> -	}
>> -
>> -	if (!found_ld_mmap) {
>> -		pr_debug("PERF_RECORD_MMAP for %s missing!\n", "ld");
>> -		++errs;
>> -	}
>> -
>> -	if (!found_vdso_mmap) {
>> -		pr_debug("PERF_RECORD_MMAP for %s missing!\n", "[vdso]");
>> -		++errs;
>> -	}
>> -out_err:
>> -	perf_evlist__munmap(evlist);
>> -out_free_cpu_mask:
>> -	CPU_FREE(cpu_mask);
>> -out_delete_evlist:
>> -	perf_evlist__delete(evlist);
>> -out:
>> -	return (err < 0 || errs > 0) ? -1 : 0;
>> -}
>> -
>> -
>> -#if defined(__x86_64__) || defined(__i386__)
>> -
>> -#define barrier() asm volatile("" ::: "memory")
>> -
>> -static u64 rdpmc(unsigned int counter)
>> -{
>> -	unsigned int low, high;
>> -
>> -	asm volatile("rdpmc" : "=a" (low), "=d" (high) : "c" (counter));
>> -
>> -	return low | ((u64)high) << 32;
>> -}
>> -
>> -static u64 rdtsc(void)
>> -{
>> -	unsigned int low, high;
>> -
>> -	asm volatile("rdtsc" : "=a" (low), "=d" (high));
>> -
>> -	return low | ((u64)high) << 32;
>> -}
>> -
>> -static u64 mmap_read_self(void *addr)
>> -{
>> -	struct perf_event_mmap_page *pc = addr;
>> -	u32 seq, idx, time_mult = 0, time_shift = 0;
>> -	u64 count, cyc = 0, time_offset = 0, enabled, running, delta;
>> -
>> -	do {
>> -		seq = pc->lock;
>> -		barrier();
>> -
>> -		enabled = pc->time_enabled;
>> -		running = pc->time_running;
>> -
>> -		if (enabled != running) {
>> -			cyc = rdtsc();
>> -			time_mult = pc->time_mult;
>> -			time_shift = pc->time_shift;
>> -			time_offset = pc->time_offset;
>> -		}
>> -
>> -		idx = pc->index;
>> -		count = pc->offset;
>> -		if (idx)
>> -			count += rdpmc(idx - 1);
>> -
>> -		barrier();
>> -	} while (pc->lock != seq);
>> -
>> -	if (enabled != running) {
>> -		u64 quot, rem;
>> -
>> -		quot = (cyc >> time_shift);
>> -		rem = cyc & ((1 << time_shift) - 1);
>> -		delta = time_offset + quot * time_mult +
>> -			((rem * time_mult) >> time_shift);
>> -
>> -		enabled += delta;
>> -		if (idx)
>> -			running += delta;
>> -
>> -		quot = count / running;
>> -		rem = count % running;
>> -		count = quot * enabled + (rem * enabled) / running;
>> -	}
>> -
>> -	return count;
>> -}
>> -
>> -/*
>> - * If the RDPMC instruction faults then signal this back to the test parent task:
>> - */
>> -static void segfault_handler(int sig __maybe_unused,
>> -			     siginfo_t *info __maybe_unused,
>> -			     void *uc __maybe_unused)
>> -{
>> -	exit(-1);
>> -}
>> -
>> -static int __test__rdpmc(void)
>> -{
>> -	volatile int tmp = 0;
>> -	u64 i, loops = 1000;
>> -	int n;
>> -	int fd;
>> -	void *addr;
>> -	struct perf_event_attr attr = {
>> -		.type = PERF_TYPE_HARDWARE,
>> -		.config = PERF_COUNT_HW_INSTRUCTIONS,
>> -		.exclude_kernel = 1,
>> -	};
>> -	u64 delta_sum = 0;
>> -        struct sigaction sa;
>> -
>> -	sigfillset(&sa.sa_mask);
>> -	sa.sa_sigaction = segfault_handler;
>> -	sigaction(SIGSEGV, &sa, NULL);
>> -
>> -	fd = sys_perf_event_open(&attr, 0, -1, -1, 0);
>> -	if (fd < 0) {
>> -		pr_err("Error: sys_perf_event_open() syscall returned "
>> -		       "with %d (%s)\n", fd, strerror(errno));
>> -		return -1;
>> -	}
>> -
>> -	addr = mmap(NULL, page_size, PROT_READ, MAP_SHARED, fd, 0);
>> -	if (addr == (void *)(-1)) {
>> -		pr_err("Error: mmap() syscall returned with (%s)\n",
>> -		       strerror(errno));
>> -		goto out_close;
>> -	}
>> -
>> -	for (n = 0; n < 6; n++) {
>> -		u64 stamp, now, delta;
>> -
>> -		stamp = mmap_read_self(addr);
>> -
>> -		for (i = 0; i < loops; i++)
>> -			tmp++;
>> -
>> -		now = mmap_read_self(addr);
>> -		loops *= 10;
>> -
>> -		delta = now - stamp;
>> -		pr_debug("%14d: %14Lu\n", n, (long long)delta);
>> -
>> -		delta_sum += delta;
>> -	}
>> -
>> -	munmap(addr, page_size);
>> -	pr_debug("   ");
>> -out_close:
>> -	close(fd);
>> -
>> -	if (!delta_sum)
>> -		return -1;
>> -
>> -	return 0;
>> -}
>> -
>> -static int test__rdpmc(void)
>> -{
>> -	int status = 0;
>> -	int wret = 0;
>> -	int ret;
>> -	int pid;
>> -
>> -	pid = fork();
>> -	if (pid < 0)
>> -		return -1;
>> -
>> -	if (!pid) {
>> -		ret = __test__rdpmc();
>> -
>> -		exit(ret);
>> -	}
>> -
>> -	wret = waitpid(pid, &status, 0);
>> -	if (wret < 0 || status)
>> -		return -1;
>> -
>> -	return 0;
>> -}
>> -
>> -#endif
>> -
>> -static int test__perf_pmu(void)
>> -{
>> -	return perf_pmu__test();
>> -}
>> -
>> -static int perf_evsel__roundtrip_cache_name_test(void)
>> -{
>> -	char name[128];
>> -	int type, op, err = 0, ret = 0, i, idx;
>> -	struct perf_evsel *evsel;
>> -        struct perf_evlist *evlist = perf_evlist__new(NULL, NULL);
>> -
>> -        if (evlist == NULL)
>> -                return -ENOMEM;
>> -
>> -	for (type = 0; type < PERF_COUNT_HW_CACHE_MAX; type++) {
>> -		for (op = 0; op < PERF_COUNT_HW_CACHE_OP_MAX; op++) {
>> -			/* skip invalid cache type */
>> -			if (!perf_evsel__is_cache_op_valid(type, op))
>> -				continue;
>> -
>> -			for (i = 0; i < PERF_COUNT_HW_CACHE_RESULT_MAX; i++) {
>> -				__perf_evsel__hw_cache_type_op_res_name(type, op, i,
>> -									name, sizeof(name));
>> -				err = parse_events(evlist, name, 0);
>> -				if (err)
>> -					ret = err;
>> -			}
>> -		}
>> -	}
>> -
>> -	idx = 0;
>> -	evsel = perf_evlist__first(evlist);
>> -
>> -	for (type = 0; type < PERF_COUNT_HW_CACHE_MAX; type++) {
>> -		for (op = 0; op < PERF_COUNT_HW_CACHE_OP_MAX; op++) {
>> -			/* skip invalid cache type */
>> -			if (!perf_evsel__is_cache_op_valid(type, op))
>> -				continue;
>> -
>> -			for (i = 0; i < PERF_COUNT_HW_CACHE_RESULT_MAX; i++) {
>> -				__perf_evsel__hw_cache_type_op_res_name(type, op, i,
>> -									name, sizeof(name));
>> -				if (evsel->idx != idx)
>> -					continue;
>> -
>> -				++idx;
>> -
>> -				if (strcmp(perf_evsel__name(evsel), name)) {
>> -					pr_debug("%s != %s\n", perf_evsel__name(evsel), name);
>> -					ret = -1;
>> -				}
>> -
>> -				evsel = perf_evsel__next(evsel);
>> -			}
>> -		}
>> -	}
>> -
>> -	perf_evlist__delete(evlist);
>> -	return ret;
>> -}
>> -
>> -static int __perf_evsel__name_array_test(const char *names[], int nr_names)
>> -{
>> -	int i, err;
>> -	struct perf_evsel *evsel;
>> -        struct perf_evlist *evlist = perf_evlist__new(NULL, NULL);
>> -
>> -        if (evlist == NULL)
>> -                return -ENOMEM;
>> -
>> -	for (i = 0; i < nr_names; ++i) {
>> -		err = parse_events(evlist, names[i], 0);
>> -		if (err) {
>> -			pr_debug("failed to parse event '%s', err %d\n",
>> -				 names[i], err);
>> -			goto out_delete_evlist;
>> -		}
>> -	}
>> -
>> -	err = 0;
>> -	list_for_each_entry(evsel, &evlist->entries, node) {
>> -		if (strcmp(perf_evsel__name(evsel), names[evsel->idx])) {
>> -			--err;
>> -			pr_debug("%s != %s\n", perf_evsel__name(evsel), names[evsel->idx]);
>> -		}
>> -	}
>> -
>> -out_delete_evlist:
>> -	perf_evlist__delete(evlist);
>> -	return err;
>> -}
>> -
>> -#define perf_evsel__name_array_test(names) \
>> -	__perf_evsel__name_array_test(names, ARRAY_SIZE(names))
>> -
>> -static int perf_evsel__roundtrip_name_test(void)
>> -{
>> -	int err = 0, ret = 0;
>> -
>> -	err = perf_evsel__name_array_test(perf_evsel__hw_names);
>> -	if (err)
>> -		ret = err;
>> -
>> -	err = perf_evsel__name_array_test(perf_evsel__sw_names);
>> -	if (err)
>> -		ret = err;
>> -
>> -	err = perf_evsel__roundtrip_cache_name_test();
>> -	if (err)
>> -		ret = err;
>> -
>> -	return ret;
>> -}
>> -
>> -static int perf_evsel__test_field(struct perf_evsel *evsel, const char *name,
>> -				  int size, bool should_be_signed)
>> -{
>> -	struct format_field *field = perf_evsel__field(evsel, name);
>> -	int is_signed;
>> -	int ret = 0;
>> -
>> -	if (field == NULL) {
>> -		pr_debug("%s: \"%s\" field not found!\n", evsel->name, name);
>> -		return -1;
>> -	}
>> -
>> -	is_signed = !!(field->flags | FIELD_IS_SIGNED);
>> -	if (should_be_signed && !is_signed) {
>> -		pr_debug("%s: \"%s\" signedness(%d) is wrong, should be %d\n",
>> -			 evsel->name, name, is_signed, should_be_signed);
>> -		ret = -1;
>> -	}
>> -
>> -	if (field->size != size) {
>> -		pr_debug("%s: \"%s\" size (%d) should be %d!\n",
>> -			 evsel->name, name, field->size, size);
>> -		ret = -1;
>> -	}
>> -
>> -	return ret;
>> -}
>> -
>> -static int perf_evsel__tp_sched_test(void)
>> -{
>> -	struct perf_evsel *evsel = perf_evsel__newtp("sched", "sched_switch", 0);
>> -	int ret = 0;
>> -
>> -	if (evsel == NULL) {
>> -		pr_debug("perf_evsel__new\n");
>> -		return -1;
>> -	}
>> -
>> -	if (perf_evsel__test_field(evsel, "prev_comm", 16, true))
>> -		ret = -1;
>> -
>> -	if (perf_evsel__test_field(evsel, "prev_pid", 4, true))
>> -		ret = -1;
>> -
>> -	if (perf_evsel__test_field(evsel, "prev_prio", 4, true))
>> -		ret = -1;
>> -
>> -	if (perf_evsel__test_field(evsel, "prev_state", 8, true))
>> -		ret = -1;
>> -
>> -	if (perf_evsel__test_field(evsel, "next_comm", 16, true))
>> -		ret = -1;
>> -
>> -	if (perf_evsel__test_field(evsel, "next_pid", 4, true))
>> -		ret = -1;
>> -
>> -	if (perf_evsel__test_field(evsel, "next_prio", 4, true))
>> -		ret = -1;
>> -
>> -	perf_evsel__delete(evsel);
>> -
>> -	evsel = perf_evsel__newtp("sched", "sched_wakeup", 0);
>> -
>> -	if (perf_evsel__test_field(evsel, "comm", 16, true))
>> -		ret = -1;
>> -
>> -	if (perf_evsel__test_field(evsel, "pid", 4, true))
>> -		ret = -1;
>> -
>> -	if (perf_evsel__test_field(evsel, "prio", 4, true))
>> -		ret = -1;
>> -
>> -	if (perf_evsel__test_field(evsel, "success", 4, true))
>> -		ret = -1;
>> -
>> -	if (perf_evsel__test_field(evsel, "target_cpu", 4, true))
>> -		ret = -1;
>> -
>> -	return ret;
>> -}
>> -
>> -static int test__syscall_open_tp_fields(void)
>> -{
>> -	struct perf_record_opts opts = {
>> -		.target = {
>> -			.uid = UINT_MAX,
>> -			.uses_mmap = true,
>> -		},
>> -		.no_delay   = true,
>> -		.freq	    = 1,
>> -		.mmap_pages = 256,
>> -		.raw_samples = true,
>> -	};
>> -	const char *filename = "/etc/passwd";
>> -	int flags = O_RDONLY | O_DIRECTORY;
>> -	struct perf_evlist *evlist = perf_evlist__new(NULL, NULL);
>> -	struct perf_evsel *evsel;
>> -	int err = -1, i, nr_events = 0, nr_polls = 0;
>> -
>> -	if (evlist == NULL) {
>> -		pr_debug("%s: perf_evlist__new\n", __func__);
>> -		goto out;
>> -	}
>> -
>> -	evsel = perf_evsel__newtp("syscalls", "sys_enter_open", 0);
>> -	if (evsel == NULL) {
>> -		pr_debug("%s: perf_evsel__newtp\n", __func__);
>> -		goto out_delete_evlist;
>> -	}
>> -
>> -	perf_evlist__add(evlist, evsel);
>> -
>> -	err = perf_evlist__create_maps(evlist, &opts.target);
>> -	if (err < 0) {
>> -		pr_debug("%s: perf_evlist__create_maps\n", __func__);
>> -		goto out_delete_evlist;
>> -	}
>> -
>> -	perf_evsel__config(evsel, &opts, evsel);
>> -
>> -	evlist->threads->map[0] = getpid();
>> -
>> -	err = perf_evlist__open(evlist);
>> -	if (err < 0) {
>> -		pr_debug("perf_evlist__open: %s\n", strerror(errno));
>> -		goto out_delete_evlist;
>> -	}
>> -
>> -	err = perf_evlist__mmap(evlist, UINT_MAX, false);
>> -	if (err < 0) {
>> -		pr_debug("perf_evlist__mmap: %s\n", strerror(errno));
>> -		goto out_delete_evlist;
>> -	}
>> -
>> -	perf_evlist__enable(evlist);
>> -
>> -	/*
>> - 	 * Generate the event:
>> - 	 */
>> -	open(filename, flags);
>> -
>> -	while (1) {
>> -		int before = nr_events;
>> -
>> -		for (i = 0; i < evlist->nr_mmaps; i++) {
>> -			union perf_event *event;
>> -
>> -			while ((event = perf_evlist__mmap_read(evlist, i)) != NULL) {
>> -				const u32 type = event->header.type;
>> -				int tp_flags;
>> -				struct perf_sample sample;
>> -
>> -				++nr_events;
>> -
>> -				if (type != PERF_RECORD_SAMPLE)
>> -					continue;
>> -
>> -				err = perf_evsel__parse_sample(evsel, event, &sample);
>> -				if (err) {
>> -					pr_err("Can't parse sample, err = %d\n", err);
>> -					goto out_munmap;
>> -				}
>> -
>> -				tp_flags = perf_evsel__intval(evsel, &sample, "flags");
>> -
>> -				if (flags != tp_flags) {
>> -					pr_debug("%s: Expected flags=%#x, got %#x\n",
>> -						 __func__, flags, tp_flags);
>> -					goto out_munmap;
>> -				}
>> -
>> -				goto out_ok;
>> -			}
>> -		}
>> -
>> -		if (nr_events == before)
>> -			poll(evlist->pollfd, evlist->nr_fds, 10);
>> -
>> -		if (++nr_polls > 5) {
>> -			pr_debug("%s: no events!\n", __func__);
>> -			goto out_munmap;
>> -		}
>> -	}
>> -out_ok:
>> -	err = 0;
>> -out_munmap:
>> -	perf_evlist__munmap(evlist);
>> -out_delete_evlist:
>> -	perf_evlist__delete(evlist);
>> -out:
>> -	return err;
>> -}
>> -
>> -static struct test {
>> -	const char *desc;
>> -	int (*func)(void);
>> -} tests[] = {
>> -	{
>> -		.desc = "vmlinux symtab matches kallsyms",
>> -		.func = test__vmlinux_matches_kallsyms,
>> -	},
>> -	{
>> -		.desc = "detect open syscall event",
>> -		.func = test__open_syscall_event,
>> -	},
>> -	{
>> -		.desc = "detect open syscall event on all cpus",
>> -		.func = test__open_syscall_event_on_all_cpus,
>> -	},
>> -	{
>> -		.desc = "read samples using the mmap interface",
>> -		.func = test__basic_mmap,
>> -	},
>> -	{
>> -		.desc = "parse events tests",
>> -		.func = parse_events__test,
>> -	},
>> -#if defined(__x86_64__) || defined(__i386__)
>> -	{
>> -		.desc = "x86 rdpmc test",
>> -		.func = test__rdpmc,
>> -	},
>> -#endif
>> -	{
>> -		.desc = "Validate PERF_RECORD_* events & perf_sample fields",
>> -		.func = test__PERF_RECORD,
>> -	},
>> -	{
>> -		.desc = "Test perf pmu format parsing",
>> -		.func = test__perf_pmu,
>> -	},
>> -	{
>> -		.desc = "Test dso data interface",
>> -		.func = dso__test_data,
>> -	},
>> -	{
>> -		.desc = "roundtrip evsel->name check",
>> -		.func = perf_evsel__roundtrip_name_test,
>> -	},
>> -	{
>> -		.desc = "Check parsing of sched tracepoints fields",
>> -		.func = perf_evsel__tp_sched_test,
>> -	},
>> -	{
>> -		.desc = "Generate and check syscalls:sys_enter_open event fields",
>> -		.func = test__syscall_open_tp_fields,
>> -	},
>> -	{
>> -		.func = NULL,
>> -	},
>> -};
>> -
>> -static bool perf_test__matches(int curr, int argc, const char *argv[])
>> -{
>> -	int i;
>> -
>> -	if (argc == 0)
>> -		return true;
>> -
>> -	for (i = 0; i < argc; ++i) {
>> -		char *end;
>> -		long nr = strtoul(argv[i], &end, 10);
>> -
>> -		if (*end == '\0') {
>> -			if (nr == curr + 1)
>> -				return true;
>> -			continue;
>> -		}
>> -
>> -		if (strstr(tests[curr].desc, argv[i]))
>> -			return true;
>> -	}
>> -
>> -	return false;
>> -}
>> -
>> -static int __cmd_test(int argc, const char *argv[])
>> -{
>> -	int i = 0;
>> -	int width = 0;
>> -
>> -	while (tests[i].func) {
>> -		int len = strlen(tests[i].desc);
>> -
>> -		if (width < len)
>> -			width = len;
>> -		++i;
>> -	}
>> -		
>> -	i = 0;
>> -	while (tests[i].func) {
>> -		int curr = i++, err;
>> -
>> -		if (!perf_test__matches(curr, argc, argv))
>> -			continue;
>> -
>> -		pr_info("%2d: %-*s:", i, width, tests[curr].desc);
>> -		pr_debug("\n--- start ---\n");
>> -		err = tests[curr].func();
>> -		pr_debug("---- end ----\n%s:", tests[curr].desc);
>> -		if (err)
>> -			color_fprintf(stderr, PERF_COLOR_RED, " FAILED!\n");
>> -		else
>> -			pr_info(" Ok\n");
>> -	}
>> -
>> -	return 0;
>> -}
>> -
>> -static int perf_test__list(int argc, const char **argv)
>> -{
>> -	int i = 0;
>> -
>> -	while (tests[i].func) {
>> -		int curr = i++;
>> -
>> -		if (argc > 1 && !strstr(tests[curr].desc, argv[1]))
>> -			continue;
>> -
>> -		pr_info("%2d: %s\n", i, tests[curr].desc);
>> -	}
>> -
>> -	return 0;
>> -}
>> -
>> -int cmd_test(int argc, const char **argv, const char *prefix __maybe_unused)
>> -{
>> -	const char * const test_usage[] = {
>> -	"perf test [<options>] [{list <test-name-fragment>|[<test-name-fragments>|<test-numbers>]}]",
>> -	NULL,
>> -	};
>> -	const struct option test_options[] = {
>> -	OPT_INCR('v', "verbose", &verbose,
>> -		    "be more verbose (show symbol address, etc)"),
>> -	OPT_END()
>> -	};
>> -
>> -	argc = parse_options(argc, argv, test_options, test_usage, 0);
>> -	if (argc >= 1 && !strcmp(argv[0], "list"))
>> -		return perf_test__list(argc, argv);
>> -
>> -	symbol_conf.priv_size = sizeof(int);
>> -	symbol_conf.sort_by_name = true;
>> -	symbol_conf.try_vmlinux_path = true;
>> -
>> -	if (symbol__init() < 0)
>> -		return -1;
>> -
>> -	return __cmd_test(argc, argv);
>> -}
>> diff --git a/tools/perf/util/dso-test-data.c b/tools/perf/util/dso-test-data.c
>> deleted file mode 100644
>> index c6caede..0000000
>> --- a/tools/perf/util/dso-test-data.c
>> +++ /dev/null
>> @@ -1,153 +0,0 @@
>> -#include "util.h"
>> -
>> -#include <stdlib.h>
>> -#include <sys/types.h>
>> -#include <sys/stat.h>
>> -#include <fcntl.h>
>> -#include <string.h>
>> -
>> -#include "symbol.h"
>> -
>> -#define TEST_ASSERT_VAL(text, cond) \
>> -do { \
>> -	if (!(cond)) { \
>> -		pr_debug("FAILED %s:%d %s\n", __FILE__, __LINE__, text); \
>> -		return -1; \
>> -	} \
>> -} while (0)
>> -
>> -static char *test_file(int size)
>> -{
>> -	static char buf_templ[] = "/tmp/test-XXXXXX";
>> -	char *templ = buf_templ;
>> -	int fd, i;
>> -	unsigned char *buf;
>> -
>> -	fd = mkstemp(templ);
>> -
>> -	buf = malloc(size);
>> -	if (!buf) {
>> -		close(fd);
>> -		return NULL;
>> -	}
>> -
>> -	for (i = 0; i < size; i++)
>> -		buf[i] = (unsigned char) ((int) i % 10);
>> -
>> -	if (size != write(fd, buf, size))
>> -		templ = NULL;
>> -
>> -	close(fd);
>> -	return templ;
>> -}
>> -
>> -#define TEST_FILE_SIZE (DSO__DATA_CACHE_SIZE * 20)
>> -
>> -struct test_data_offset {
>> -	off_t offset;
>> -	u8 data[10];
>> -	int size;
>> -};
>> -
>> -struct test_data_offset offsets[] = {
>> -	/* Fill first cache page. */
>> -	{
>> -		.offset = 10,
>> -		.data   = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 },
>> -		.size   = 10,
>> -	},
>> -	/* Read first cache page. */
>> -	{
>> -		.offset = 10,
>> -		.data   = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 },
>> -		.size   = 10,
>> -	},
>> -	/* Fill cache boundary pages. */
>> -	{
>> -		.offset = DSO__DATA_CACHE_SIZE - DSO__DATA_CACHE_SIZE % 10,
>> -		.data   = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 },
>> -		.size   = 10,
>> -	},
>> -	/* Read cache boundary pages. */
>> -	{
>> -		.offset = DSO__DATA_CACHE_SIZE - DSO__DATA_CACHE_SIZE % 10,
>> -		.data   = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 },
>> -		.size   = 10,
>> -	},
>> -	/* Fill final cache page. */
>> -	{
>> -		.offset = TEST_FILE_SIZE - 10,
>> -		.data   = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 },
>> -		.size   = 10,
>> -	},
>> -	/* Read final cache page. */
>> -	{
>> -		.offset = TEST_FILE_SIZE - 10,
>> -		.data   = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 },
>> -		.size   = 10,
>> -	},
>> -	/* Read final cache page. */
>> -	{
>> -		.offset = TEST_FILE_SIZE - 3,
>> -		.data   = { 7, 8, 9, 0, 0, 0, 0, 0, 0, 0 },
>> -		.size   = 3,
>> -	},
>> -};
>> -
>> -int dso__test_data(void)
>> -{
>> -	struct machine machine;
>> -	struct dso *dso;
>> -	char *file = test_file(TEST_FILE_SIZE);
>> -	size_t i;
>> -
>> -	TEST_ASSERT_VAL("No test file", file);
>> -
>> -	memset(&machine, 0, sizeof(machine));
>> -
>> -	dso = dso__new((const char *)file);
>> -
>> -	/* Basic 10 bytes tests. */
>> -	for (i = 0; i < ARRAY_SIZE(offsets); i++) {
>> -		struct test_data_offset *data = &offsets[i];
>> -		ssize_t size;
>> -		u8 buf[10];
>> -
>> -		memset(buf, 0, 10);
>> -		size = dso__data_read_offset(dso, &machine, data->offset,
>> -				     buf, 10);
>> -
>> -		TEST_ASSERT_VAL("Wrong size", size == data->size);
>> -		TEST_ASSERT_VAL("Wrong data", !memcmp(buf, data->data, 10));
>> -	}
>> -
>> -	/* Read cross multiple cache pages. */
>> -	{
>> -		ssize_t size;
>> -		int c;
>> -		u8 *buf;
>> -
>> -		buf = malloc(TEST_FILE_SIZE);
>> -		TEST_ASSERT_VAL("ENOMEM\n", buf);
>> -
>> -		/* First iteration to fill caches, second one to read them. */
>> -		for (c = 0; c < 2; c++) {
>> -			memset(buf, 0, TEST_FILE_SIZE);
>> -			size = dso__data_read_offset(dso, &machine, 10,
>> -						     buf, TEST_FILE_SIZE);
>> -
>> -			TEST_ASSERT_VAL("Wrong size",
>> -				size == (TEST_FILE_SIZE - 10));
>> -
>> -			for (i = 0; i < (size_t)size; i++)
>> -				TEST_ASSERT_VAL("Wrong data",
>> -					buf[i] == (i % 10));
>> -		}
>> -
>> -		free(buf);
>> -	}
>> -
>> -	dso__delete(dso);
>> -	unlink(file);
>> -	return 0;
>> -}
>> diff --git a/tools/perf/util/parse-events-test.c b/tools/perf/util/parse-events-test.c
>> deleted file mode 100644
>> index b49c2ee..0000000
>> --- a/tools/perf/util/parse-events-test.c
>> +++ /dev/null
>> @@ -1,1116 +0,0 @@
>> -
>> -#include "parse-events.h"
>> -#include "evsel.h"
>> -#include "evlist.h"
>> -#include "sysfs.h"
>> -#include "../../../include/linux/hw_breakpoint.h"
>> -
>> -#define TEST_ASSERT_VAL(text, cond) \
>> -do { \
>> -	if (!(cond)) { \
>> -		pr_debug("FAILED %s:%d %s\n", __FILE__, __LINE__, text); \
>> -		return -1; \
>> -	} \
>> -} while (0)
>> -
>> -#define PERF_TP_SAMPLE_TYPE (PERF_SAMPLE_RAW | PERF_SAMPLE_TIME | \
>> -			     PERF_SAMPLE_CPU | PERF_SAMPLE_PERIOD)
>> -
>> -static int test__checkevent_tracepoint(struct perf_evlist *evlist)
>> -{
>> -	struct perf_evsel *evsel = perf_evlist__first(evlist);
>> -
>> -	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
>> -	TEST_ASSERT_VAL("wrong type", PERF_TYPE_TRACEPOINT == evsel->attr.type);
>> -	TEST_ASSERT_VAL("wrong sample_type",
>> -		PERF_TP_SAMPLE_TYPE == evsel->attr.sample_type);
>> -	TEST_ASSERT_VAL("wrong sample_period", 1 == evsel->attr.sample_period);
>> -	return 0;
>> -}
>> -
>> -static int test__checkevent_tracepoint_multi(struct perf_evlist *evlist)
>> -{
>> -	struct perf_evsel *evsel;
>> -
>> -	TEST_ASSERT_VAL("wrong number of entries", evlist->nr_entries > 1);
>> -
>> -	list_for_each_entry(evsel, &evlist->entries, node) {
>> -		TEST_ASSERT_VAL("wrong type",
>> -			PERF_TYPE_TRACEPOINT == evsel->attr.type);
>> -		TEST_ASSERT_VAL("wrong sample_type",
>> -			PERF_TP_SAMPLE_TYPE == evsel->attr.sample_type);
>> -		TEST_ASSERT_VAL("wrong sample_period",
>> -			1 == evsel->attr.sample_period);
>> -	}
>> -	return 0;
>> -}
>> -
>> -static int test__checkevent_raw(struct perf_evlist *evlist)
>> -{
>> -	struct perf_evsel *evsel = perf_evlist__first(evlist);
>> -
>> -	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
>> -	TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type);
>> -	TEST_ASSERT_VAL("wrong config", 0x1a == evsel->attr.config);
>> -	return 0;
>> -}
>> -
>> -static int test__checkevent_numeric(struct perf_evlist *evlist)
>> -{
>> -	struct perf_evsel *evsel = perf_evlist__first(evlist);
>> -
>> -	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
>> -	TEST_ASSERT_VAL("wrong type", 1 == evsel->attr.type);
>> -	TEST_ASSERT_VAL("wrong config", 1 == evsel->attr.config);
>> -	return 0;
>> -}
>> -
>> -static int test__checkevent_symbolic_name(struct perf_evlist *evlist)
>> -{
>> -	struct perf_evsel *evsel = perf_evlist__first(evlist);
>> -
>> -	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
>> -	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
>> -	TEST_ASSERT_VAL("wrong config",
>> -			PERF_COUNT_HW_INSTRUCTIONS == evsel->attr.config);
>> -	return 0;
>> -}
>> -
>> -static int test__checkevent_symbolic_name_config(struct perf_evlist *evlist)
>> -{
>> -	struct perf_evsel *evsel = perf_evlist__first(evlist);
>> -
>> -	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
>> -	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
>> -	TEST_ASSERT_VAL("wrong config",
>> -			PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
>> -	TEST_ASSERT_VAL("wrong period",
>> -			100000 == evsel->attr.sample_period);
>> -	TEST_ASSERT_VAL("wrong config1",
>> -			0 == evsel->attr.config1);
>> -	TEST_ASSERT_VAL("wrong config2",
>> -			1 == evsel->attr.config2);
>> -	return 0;
>> -}
>> -
>> -static int test__checkevent_symbolic_alias(struct perf_evlist *evlist)
>> -{
>> -	struct perf_evsel *evsel = perf_evlist__first(evlist);
>> -
>> -	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
>> -	TEST_ASSERT_VAL("wrong type", PERF_TYPE_SOFTWARE == evsel->attr.type);
>> -	TEST_ASSERT_VAL("wrong config",
>> -			PERF_COUNT_SW_PAGE_FAULTS == evsel->attr.config);
>> -	return 0;
>> -}
>> -
>> -static int test__checkevent_genhw(struct perf_evlist *evlist)
>> -{
>> -	struct perf_evsel *evsel = perf_evlist__first(evlist);
>> -
>> -	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
>> -	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HW_CACHE == evsel->attr.type);
>> -	TEST_ASSERT_VAL("wrong config", (1 << 16) == evsel->attr.config);
>> -	return 0;
>> -}
>> -
>> -static int test__checkevent_breakpoint(struct perf_evlist *evlist)
>> -{
>> -	struct perf_evsel *evsel = perf_evlist__first(evlist);
>> -
>> -	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
>> -	TEST_ASSERT_VAL("wrong type", PERF_TYPE_BREAKPOINT == evsel->attr.type);
>> -	TEST_ASSERT_VAL("wrong config", 0 == evsel->attr.config);
>> -	TEST_ASSERT_VAL("wrong bp_type", (HW_BREAKPOINT_R | HW_BREAKPOINT_W) ==
>> -					 evsel->attr.bp_type);
>> -	TEST_ASSERT_VAL("wrong bp_len", HW_BREAKPOINT_LEN_4 ==
>> -					evsel->attr.bp_len);
>> -	return 0;
>> -}
>> -
>> -static int test__checkevent_breakpoint_x(struct perf_evlist *evlist)
>> -{
>> -	struct perf_evsel *evsel = perf_evlist__first(evlist);
>> -
>> -	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
>> -	TEST_ASSERT_VAL("wrong type", PERF_TYPE_BREAKPOINT == evsel->attr.type);
>> -	TEST_ASSERT_VAL("wrong config", 0 == evsel->attr.config);
>> -	TEST_ASSERT_VAL("wrong bp_type",
>> -			HW_BREAKPOINT_X == evsel->attr.bp_type);
>> -	TEST_ASSERT_VAL("wrong bp_len", sizeof(long) == evsel->attr.bp_len);
>> -	return 0;
>> -}
>> -
>> -static int test__checkevent_breakpoint_r(struct perf_evlist *evlist)
>> -{
>> -	struct perf_evsel *evsel = perf_evlist__first(evlist);
>> -
>> -	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
>> -	TEST_ASSERT_VAL("wrong type",
>> -			PERF_TYPE_BREAKPOINT == evsel->attr.type);
>> -	TEST_ASSERT_VAL("wrong config", 0 == evsel->attr.config);
>> -	TEST_ASSERT_VAL("wrong bp_type",
>> -			HW_BREAKPOINT_R == evsel->attr.bp_type);
>> -	TEST_ASSERT_VAL("wrong bp_len",
>> -			HW_BREAKPOINT_LEN_4 == evsel->attr.bp_len);
>> -	return 0;
>> -}
>> -
>> -static int test__checkevent_breakpoint_w(struct perf_evlist *evlist)
>> -{
>> -	struct perf_evsel *evsel = perf_evlist__first(evlist);
>> -
>> -	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
>> -	TEST_ASSERT_VAL("wrong type",
>> -			PERF_TYPE_BREAKPOINT == evsel->attr.type);
>> -	TEST_ASSERT_VAL("wrong config", 0 == evsel->attr.config);
>> -	TEST_ASSERT_VAL("wrong bp_type",
>> -			HW_BREAKPOINT_W == evsel->attr.bp_type);
>> -	TEST_ASSERT_VAL("wrong bp_len",
>> -			HW_BREAKPOINT_LEN_4 == evsel->attr.bp_len);
>> -	return 0;
>> -}
>> -
>> -static int test__checkevent_breakpoint_rw(struct perf_evlist *evlist)
>> -{
>> -	struct perf_evsel *evsel = perf_evlist__first(evlist);
>> -
>> -	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
>> -	TEST_ASSERT_VAL("wrong type",
>> -			PERF_TYPE_BREAKPOINT == evsel->attr.type);
>> -	TEST_ASSERT_VAL("wrong config", 0 == evsel->attr.config);
>> -	TEST_ASSERT_VAL("wrong bp_type",
>> -		(HW_BREAKPOINT_R|HW_BREAKPOINT_W) == evsel->attr.bp_type);
>> -	TEST_ASSERT_VAL("wrong bp_len",
>> -			HW_BREAKPOINT_LEN_4 == evsel->attr.bp_len);
>> -	return 0;
>> -}
>> -
>> -static int test__checkevent_tracepoint_modifier(struct perf_evlist *evlist)
>> -{
>> -	struct perf_evsel *evsel = perf_evlist__first(evlist);
>> -
>> -	TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
>> -	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
>> -	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
>> -	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
>> -
>> -	return test__checkevent_tracepoint(evlist);
>> -}
>> -
>> -static int
>> -test__checkevent_tracepoint_multi_modifier(struct perf_evlist *evlist)
>> -{
>> -	struct perf_evsel *evsel;
>> -
>> -	TEST_ASSERT_VAL("wrong number of entries", evlist->nr_entries > 1);
>> -
>> -	list_for_each_entry(evsel, &evlist->entries, node) {
>> -		TEST_ASSERT_VAL("wrong exclude_user",
>> -				!evsel->attr.exclude_user);
>> -		TEST_ASSERT_VAL("wrong exclude_kernel",
>> -				evsel->attr.exclude_kernel);
>> -		TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
>> -		TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
>> -	}
>> -
>> -	return test__checkevent_tracepoint_multi(evlist);
>> -}
>> -
>> -static int test__checkevent_raw_modifier(struct perf_evlist *evlist)
>> -{
>> -	struct perf_evsel *evsel = perf_evlist__first(evlist);
>> -
>> -	TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
>> -	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
>> -	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
>> -	TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip);
>> -
>> -	return test__checkevent_raw(evlist);
>> -}
>> -
>> -static int test__checkevent_numeric_modifier(struct perf_evlist *evlist)
>> -{
>> -	struct perf_evsel *evsel = perf_evlist__first(evlist);
>> -
>> -	TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
>> -	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
>> -	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
>> -	TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip);
>> -
>> -	return test__checkevent_numeric(evlist);
>> -}
>> -
>> -static int test__checkevent_symbolic_name_modifier(struct perf_evlist *evlist)
>> -{
>> -	struct perf_evsel *evsel = perf_evlist__first(evlist);
>> -
>> -	TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
>> -	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
>> -	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
>> -	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
>> -
>> -	return test__checkevent_symbolic_name(evlist);
>> -}
>> -
>> -static int test__checkevent_exclude_host_modifier(struct perf_evlist *evlist)
>> -{
>> -	struct perf_evsel *evsel = perf_evlist__first(evlist);
>> -
>> -	TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
>> -	TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);
>> -
>> -	return test__checkevent_symbolic_name(evlist);
>> -}
>> -
>> -static int test__checkevent_exclude_guest_modifier(struct perf_evlist *evlist)
>> -{
>> -	struct perf_evsel *evsel = perf_evlist__first(evlist);
>> -
>> -	TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
>> -	TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
>> -
>> -	return test__checkevent_symbolic_name(evlist);
>> -}
>> -
>> -static int test__checkevent_symbolic_alias_modifier(struct perf_evlist *evlist)
>> -{
>> -	struct perf_evsel *evsel = perf_evlist__first(evlist);
>> -
>> -	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
>> -	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
>> -	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
>> -	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
>> -
>> -	return test__checkevent_symbolic_alias(evlist);
>> -}
>> -
>> -static int test__checkevent_genhw_modifier(struct perf_evlist *evlist)
>> -{
>> -	struct perf_evsel *evsel = perf_evlist__first(evlist);
>> -
>> -	TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
>> -	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
>> -	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
>> -	TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip);
>> -
>> -	return test__checkevent_genhw(evlist);
>> -}
>> -
>> -static int test__checkevent_breakpoint_modifier(struct perf_evlist *evlist)
>> -{
>> -	struct perf_evsel *evsel = perf_evlist__first(evlist);
>> -
>> -
>> -	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
>> -	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
>> -	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
>> -	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
>> -	TEST_ASSERT_VAL("wrong name",
>> -			!strcmp(perf_evsel__name(evsel), "mem:0:u"));
>> -
>> -	return test__checkevent_breakpoint(evlist);
>> -}
>> -
>> -static int test__checkevent_breakpoint_x_modifier(struct perf_evlist *evlist)
>> -{
>> -	struct perf_evsel *evsel = perf_evlist__first(evlist);
>> -
>> -	TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
>> -	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
>> -	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
>> -	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
>> -	TEST_ASSERT_VAL("wrong name",
>> -			!strcmp(perf_evsel__name(evsel), "mem:0:x:k"));
>> -
>> -	return test__checkevent_breakpoint_x(evlist);
>> -}
>> -
>> -static int test__checkevent_breakpoint_r_modifier(struct perf_evlist *evlist)
>> -{
>> -	struct perf_evsel *evsel = perf_evlist__first(evlist);
>> -
>> -	TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
>> -	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
>> -	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
>> -	TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip);
>> -	TEST_ASSERT_VAL("wrong name",
>> -			!strcmp(perf_evsel__name(evsel), "mem:0:r:hp"));
>> -
>> -	return test__checkevent_breakpoint_r(evlist);
>> -}
>> -
>> -static int test__checkevent_breakpoint_w_modifier(struct perf_evlist *evlist)
>> -{
>> -	struct perf_evsel *evsel = perf_evlist__first(evlist);
>> -
>> -	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
>> -	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
>> -	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
>> -	TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip);
>> -	TEST_ASSERT_VAL("wrong name",
>> -			!strcmp(perf_evsel__name(evsel), "mem:0:w:up"));
>> -
>> -	return test__checkevent_breakpoint_w(evlist);
>> -}
>> -
>> -static int test__checkevent_breakpoint_rw_modifier(struct perf_evlist *evlist)
>> -{
>> -	struct perf_evsel *evsel = perf_evlist__first(evlist);
>> -
>> -	TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
>> -	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
>> -	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
>> -	TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip);
>> -	TEST_ASSERT_VAL("wrong name",
>> -			!strcmp(perf_evsel__name(evsel), "mem:0:rw:kp"));
>> -
>> -	return test__checkevent_breakpoint_rw(evlist);
>> -}
>> -
>> -static int test__checkevent_pmu(struct perf_evlist *evlist)
>> -{
>> -
>> -	struct perf_evsel *evsel = perf_evlist__first(evlist);
>> -
>> -	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
>> -	TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type);
>> -	TEST_ASSERT_VAL("wrong config",    10 == evsel->attr.config);
>> -	TEST_ASSERT_VAL("wrong config1",    1 == evsel->attr.config1);
>> -	TEST_ASSERT_VAL("wrong config2",    3 == evsel->attr.config2);
>> -	TEST_ASSERT_VAL("wrong period",  1000 == evsel->attr.sample_period);
>> -
>> -	return 0;
>> -}
>> -
>> -static int test__checkevent_list(struct perf_evlist *evlist)
>> -{
>> -	struct perf_evsel *evsel = perf_evlist__first(evlist);
>> -
>> -	TEST_ASSERT_VAL("wrong number of entries", 3 == evlist->nr_entries);
>> -
>> -	/* r1 */
>> -	TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type);
>> -	TEST_ASSERT_VAL("wrong config", 1 == evsel->attr.config);
>> -	TEST_ASSERT_VAL("wrong config1", 0 == evsel->attr.config1);
>> -	TEST_ASSERT_VAL("wrong config2", 0 == evsel->attr.config2);
>> -	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
>> -	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
>> -	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
>> -	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
>> -
>> -	/* syscalls:sys_enter_open:k */
>> -	evsel = perf_evsel__next(evsel);
>> -	TEST_ASSERT_VAL("wrong type", PERF_TYPE_TRACEPOINT == evsel->attr.type);
>> -	TEST_ASSERT_VAL("wrong sample_type",
>> -		PERF_TP_SAMPLE_TYPE == evsel->attr.sample_type);
>> -	TEST_ASSERT_VAL("wrong sample_period", 1 == evsel->attr.sample_period);
>> -	TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
>> -	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
>> -	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
>> -	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
>> -
>> -	/* 1:1:hp */
>> -	evsel = perf_evsel__next(evsel);
>> -	TEST_ASSERT_VAL("wrong type", 1 == evsel->attr.type);
>> -	TEST_ASSERT_VAL("wrong config", 1 == evsel->attr.config);
>> -	TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
>> -	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
>> -	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
>> -	TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip);
>> -
>> -	return 0;
>> -}
>> -
>> -static int test__checkevent_pmu_name(struct perf_evlist *evlist)
>> -{
>> -	struct perf_evsel *evsel = perf_evlist__first(evlist);
>> -
>> -	/* cpu/config=1,name=krava/u */
>> -	TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
>> -	TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type);
>> -	TEST_ASSERT_VAL("wrong config",  1 == evsel->attr.config);
>> -	TEST_ASSERT_VAL("wrong name", !strcmp(perf_evsel__name(evsel), "krava"));
>> -
>> -	/* cpu/config=2/u" */
>> -	evsel = perf_evsel__next(evsel);
>> -	TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
>> -	TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type);
>> -	TEST_ASSERT_VAL("wrong config",  2 == evsel->attr.config);
>> -	TEST_ASSERT_VAL("wrong name",
>> -			!strcmp(perf_evsel__name(evsel), "cpu/config=2/u"));
>> -
>> -	return 0;
>> -}
>> -
>> -static int test__checkevent_pmu_events(struct perf_evlist *evlist)
>> -{
>> -	struct perf_evsel *evsel;
>> -
>> -	evsel = list_entry(evlist->entries.next, struct perf_evsel, node);
>> -	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
>> -	TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type);
>> -	TEST_ASSERT_VAL("wrong exclude_user",
>> -			!evsel->attr.exclude_user);
>> -	TEST_ASSERT_VAL("wrong exclude_kernel",
>> -			evsel->attr.exclude_kernel);
>> -	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
>> -	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
>> -
>> -	return 0;
>> -}
>> -
>> -static int test__checkterms_simple(struct list_head *terms)
>> -{
>> -	struct parse_events__term *term;
>> -
>> -	/* config=10 */
>> -	term = list_entry(terms->next, struct parse_events__term, list);
>> -	TEST_ASSERT_VAL("wrong type term",
>> -			term->type_term == PARSE_EVENTS__TERM_TYPE_CONFIG);
>> -	TEST_ASSERT_VAL("wrong type val",
>> -			term->type_val == PARSE_EVENTS__TERM_TYPE_NUM);
>> -	TEST_ASSERT_VAL("wrong val", term->val.num == 10);
>> -	TEST_ASSERT_VAL("wrong config", !term->config);
>> -
>> -	/* config1 */
>> -	term = list_entry(term->list.next, struct parse_events__term, list);
>> -	TEST_ASSERT_VAL("wrong type term",
>> -			term->type_term == PARSE_EVENTS__TERM_TYPE_CONFIG1);
>> -	TEST_ASSERT_VAL("wrong type val",
>> -			term->type_val == PARSE_EVENTS__TERM_TYPE_NUM);
>> -	TEST_ASSERT_VAL("wrong val", term->val.num == 1);
>> -	TEST_ASSERT_VAL("wrong config", !term->config);
>> -
>> -	/* config2=3 */
>> -	term = list_entry(term->list.next, struct parse_events__term, list);
>> -	TEST_ASSERT_VAL("wrong type term",
>> -			term->type_term == PARSE_EVENTS__TERM_TYPE_CONFIG2);
>> -	TEST_ASSERT_VAL("wrong type val",
>> -			term->type_val == PARSE_EVENTS__TERM_TYPE_NUM);
>> -	TEST_ASSERT_VAL("wrong val", term->val.num == 3);
>> -	TEST_ASSERT_VAL("wrong config", !term->config);
>> -
>> -	/* umask=1*/
>> -	term = list_entry(term->list.next, struct parse_events__term, list);
>> -	TEST_ASSERT_VAL("wrong type term",
>> -			term->type_term == PARSE_EVENTS__TERM_TYPE_USER);
>> -	TEST_ASSERT_VAL("wrong type val",
>> -			term->type_val == PARSE_EVENTS__TERM_TYPE_NUM);
>> -	TEST_ASSERT_VAL("wrong val", term->val.num == 1);
>> -	TEST_ASSERT_VAL("wrong config", !strcmp(term->config, "umask"));
>> -
>> -	return 0;
>> -}
>> -
>> -static int test__group1(struct perf_evlist *evlist)
>> -{
>> -	struct perf_evsel *evsel, *leader;
>> -
>> -	TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
>> -
>> -	/* instructions:k */
>> -	evsel = leader = perf_evlist__first(evlist);
>> -	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
>> -	TEST_ASSERT_VAL("wrong config",
>> -			PERF_COUNT_HW_INSTRUCTIONS == evsel->attr.config);
>> -	TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
>> -	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
>> -	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
>> -	TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
>> -	TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
>> -	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
>> -	TEST_ASSERT_VAL("wrong leader", evsel->leader == NULL);
>> -
>> -	/* cycles:upp */
>> -	evsel = perf_evsel__next(evsel);
>> -	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
>> -	TEST_ASSERT_VAL("wrong config",
>> -			PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
>> -	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
>> -	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
>> -	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
>> -	/* use of precise requires exclude_guest */
>> -	TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
>> -	TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
>> -	TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip == 2);
>> -	TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
>> -
>> -	return 0;
>> -}
>> -
>> -static int test__group2(struct perf_evlist *evlist)
>> -{
>> -	struct perf_evsel *evsel, *leader;
>> -
>> -	TEST_ASSERT_VAL("wrong number of entries", 3 == evlist->nr_entries);
>> -
>> -	/* faults + :ku modifier */
>> -	evsel = leader = perf_evlist__first(evlist);
>> -	TEST_ASSERT_VAL("wrong type", PERF_TYPE_SOFTWARE == evsel->attr.type);
>> -	TEST_ASSERT_VAL("wrong config",
>> -			PERF_COUNT_SW_PAGE_FAULTS == evsel->attr.config);
>> -	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
>> -	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
>> -	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
>> -	TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
>> -	TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
>> -	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
>> -	TEST_ASSERT_VAL("wrong leader", evsel->leader == NULL);
>> -
>> -	/* cache-references + :u modifier */
>> -	evsel = perf_evsel__next(evsel);
>> -	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
>> -	TEST_ASSERT_VAL("wrong config",
>> -			PERF_COUNT_HW_CACHE_REFERENCES == evsel->attr.config);
>> -	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
>> -	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
>> -	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
>> -	TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
>> -	TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
>> -	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
>> -	TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
>> -
>> -	/* cycles:k */
>> -	evsel = perf_evsel__next(evsel);
>> -	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
>> -	TEST_ASSERT_VAL("wrong config",
>> -			PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
>> -	TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
>> -	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
>> -	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
>> -	TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
>> -	TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
>> -	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
>> -	TEST_ASSERT_VAL("wrong leader", evsel->leader == NULL);
>> -
>> -	return 0;
>> -}
>> -
>> -static int test__group3(struct perf_evlist *evlist __maybe_unused)
>> -{
>> -	struct perf_evsel *evsel, *leader;
>> -
>> -	TEST_ASSERT_VAL("wrong number of entries", 5 == evlist->nr_entries);
>> -
>> -	/* group1 syscalls:sys_enter_open:H */
>> -	evsel = leader = perf_evlist__first(evlist);
>> -	TEST_ASSERT_VAL("wrong type", PERF_TYPE_TRACEPOINT == evsel->attr.type);
>> -	TEST_ASSERT_VAL("wrong sample_type",
>> -		PERF_TP_SAMPLE_TYPE == evsel->attr.sample_type);
>> -	TEST_ASSERT_VAL("wrong sample_period", 1 == evsel->attr.sample_period);
>> -	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
>> -	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
>> -	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
>> -	TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
>> -	TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
>> -	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
>> -	TEST_ASSERT_VAL("wrong leader", evsel->leader == NULL);
>> -	TEST_ASSERT_VAL("wrong group name",
>> -		!strcmp(leader->group_name, "group1"));
>> -
>> -	/* group1 cycles:kppp */
>> -	evsel = perf_evsel__next(evsel);
>> -	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
>> -	TEST_ASSERT_VAL("wrong config",
>> -			PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
>> -	TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
>> -	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
>> -	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
>> -	/* use of precise requires exclude_guest */
>> -	TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
>> -	TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
>> -	TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip == 3);
>> -	TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
>> -	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
>> -
>> -	/* group2 cycles + G modifier */
>> -	evsel = leader = perf_evsel__next(evsel);
>> -	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
>> -	TEST_ASSERT_VAL("wrong config",
>> -			PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
>> -	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
>> -	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
>> -	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
>> -	TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
>> -	TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);
>> -	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
>> -	TEST_ASSERT_VAL("wrong leader", evsel->leader == NULL);
>> -	TEST_ASSERT_VAL("wrong group name",
>> -		!strcmp(leader->group_name, "group2"));
>> -
>> -	/* group2 1:3 + G modifier */
>> -	evsel = perf_evsel__next(evsel);
>> -	TEST_ASSERT_VAL("wrong type", 1 == evsel->attr.type);
>> -	TEST_ASSERT_VAL("wrong config", 3 == evsel->attr.config);
>> -	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
>> -	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
>> -	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
>> -	TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
>> -	TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);
>> -	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
>> -	TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
>> -
>> -	/* instructions:u */
>> -	evsel = perf_evsel__next(evsel);
>> -	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
>> -	TEST_ASSERT_VAL("wrong config",
>> -			PERF_COUNT_HW_INSTRUCTIONS == evsel->attr.config);
>> -	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
>> -	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
>> -	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
>> -	TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
>> -	TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
>> -	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
>> -	TEST_ASSERT_VAL("wrong leader", evsel->leader == NULL);
>> -
>> -	return 0;
>> -}
>> -
>> -static int test__group4(struct perf_evlist *evlist __maybe_unused)
>> -{
>> -	struct perf_evsel *evsel, *leader;
>> -
>> -	TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
>> -
>> -	/* cycles:u + p */
>> -	evsel = leader = perf_evlist__first(evlist);
>> -	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
>> -	TEST_ASSERT_VAL("wrong config",
>> -			PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
>> -	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
>> -	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
>> -	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
>> -	/* use of precise requires exclude_guest */
>> -	TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
>> -	TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
>> -	TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip == 1);
>> -	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
>> -	TEST_ASSERT_VAL("wrong leader", evsel->leader == NULL);
>> -
>> -	/* instructions:kp + p */
>> -	evsel = perf_evsel__next(evsel);
>> -	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
>> -	TEST_ASSERT_VAL("wrong config",
>> -			PERF_COUNT_HW_INSTRUCTIONS == evsel->attr.config);
>> -	TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
>> -	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
>> -	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
>> -	/* use of precise requires exclude_guest */
>> -	TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
>> -	TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
>> -	TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip == 2);
>> -	TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
>> -
>> -	return 0;
>> -}
>> -
>> -static int test__group5(struct perf_evlist *evlist __maybe_unused)
>> -{
>> -	struct perf_evsel *evsel, *leader;
>> -
>> -	TEST_ASSERT_VAL("wrong number of entries", 5 == evlist->nr_entries);
>> -
>> -	/* cycles + G */
>> -	evsel = leader = perf_evlist__first(evlist);
>> -	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
>> -	TEST_ASSERT_VAL("wrong config",
>> -			PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
>> -	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
>> -	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
>> -	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
>> -	TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
>> -	TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);
>> -	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
>> -	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
>> -	TEST_ASSERT_VAL("wrong leader", evsel->leader == NULL);
>> -
>> -	/* instructions + G */
>> -	evsel = perf_evsel__next(evsel);
>> -	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
>> -	TEST_ASSERT_VAL("wrong config",
>> -			PERF_COUNT_HW_INSTRUCTIONS == evsel->attr.config);
>> -	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
>> -	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
>> -	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
>> -	TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
>> -	TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);
>> -	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
>> -	TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
>> -
>> -	/* cycles:G */
>> -	evsel = leader = perf_evsel__next(evsel);
>> -	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
>> -	TEST_ASSERT_VAL("wrong config",
>> -			PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
>> -	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
>> -	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
>> -	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
>> -	TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
>> -	TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);
>> -	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
>> -	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
>> -	TEST_ASSERT_VAL("wrong leader", evsel->leader == NULL);
>> -
>> -	/* instructions:G */
>> -	evsel = perf_evsel__next(evsel);
>> -	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
>> -	TEST_ASSERT_VAL("wrong config",
>> -			PERF_COUNT_HW_INSTRUCTIONS == evsel->attr.config);
>> -	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
>> -	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
>> -	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
>> -	TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
>> -	TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);
>> -	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
>> -	TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
>> -
>> -	/* cycles */
>> -	evsel = perf_evsel__next(evsel);
>> -	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
>> -	TEST_ASSERT_VAL("wrong config",
>> -			PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
>> -	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
>> -	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
>> -	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
>> -	TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
>> -	TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
>> -	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
>> -	TEST_ASSERT_VAL("wrong leader", evsel->leader == NULL);
>> -
>> -	return 0;
>> -}
>> -
>> -struct test__event_st {
>> -	const char *name;
>> -	__u32 type;
>> -	int (*check)(struct perf_evlist *evlist);
>> -};
>> -
>> -static struct test__event_st test__events[] = {
>> -	[0] = {
>> -		.name  = "syscalls:sys_enter_open",
>> -		.check = test__checkevent_tracepoint,
>> -	},
>> -	[1] = {
>> -		.name  = "syscalls:*",
>> -		.check = test__checkevent_tracepoint_multi,
>> -	},
>> -	[2] = {
>> -		.name  = "r1a",
>> -		.check = test__checkevent_raw,
>> -	},
>> -	[3] = {
>> -		.name  = "1:1",
>> -		.check = test__checkevent_numeric,
>> -	},
>> -	[4] = {
>> -		.name  = "instructions",
>> -		.check = test__checkevent_symbolic_name,
>> -	},
>> -	[5] = {
>> -		.name  = "cycles/period=100000,config2/",
>> -		.check = test__checkevent_symbolic_name_config,
>> -	},
>> -	[6] = {
>> -		.name  = "faults",
>> -		.check = test__checkevent_symbolic_alias,
>> -	},
>> -	[7] = {
>> -		.name  = "L1-dcache-load-miss",
>> -		.check = test__checkevent_genhw,
>> -	},
>> -	[8] = {
>> -		.name  = "mem:0",
>> -		.check = test__checkevent_breakpoint,
>> -	},
>> -	[9] = {
>> -		.name  = "mem:0:x",
>> -		.check = test__checkevent_breakpoint_x,
>> -	},
>> -	[10] = {
>> -		.name  = "mem:0:r",
>> -		.check = test__checkevent_breakpoint_r,
>> -	},
>> -	[11] = {
>> -		.name  = "mem:0:w",
>> -		.check = test__checkevent_breakpoint_w,
>> -	},
>> -	[12] = {
>> -		.name  = "syscalls:sys_enter_open:k",
>> -		.check = test__checkevent_tracepoint_modifier,
>> -	},
>> -	[13] = {
>> -		.name  = "syscalls:*:u",
>> -		.check = test__checkevent_tracepoint_multi_modifier,
>> -	},
>> -	[14] = {
>> -		.name  = "r1a:kp",
>> -		.check = test__checkevent_raw_modifier,
>> -	},
>> -	[15] = {
>> -		.name  = "1:1:hp",
>> -		.check = test__checkevent_numeric_modifier,
>> -	},
>> -	[16] = {
>> -		.name  = "instructions:h",
>> -		.check = test__checkevent_symbolic_name_modifier,
>> -	},
>> -	[17] = {
>> -		.name  = "faults:u",
>> -		.check = test__checkevent_symbolic_alias_modifier,
>> -	},
>> -	[18] = {
>> -		.name  = "L1-dcache-load-miss:kp",
>> -		.check = test__checkevent_genhw_modifier,
>> -	},
>> -	[19] = {
>> -		.name  = "mem:0:u",
>> -		.check = test__checkevent_breakpoint_modifier,
>> -	},
>> -	[20] = {
>> -		.name  = "mem:0:x:k",
>> -		.check = test__checkevent_breakpoint_x_modifier,
>> -	},
>> -	[21] = {
>> -		.name  = "mem:0:r:hp",
>> -		.check = test__checkevent_breakpoint_r_modifier,
>> -	},
>> -	[22] = {
>> -		.name  = "mem:0:w:up",
>> -		.check = test__checkevent_breakpoint_w_modifier,
>> -	},
>> -	[23] = {
>> -		.name  = "r1,syscalls:sys_enter_open:k,1:1:hp",
>> -		.check = test__checkevent_list,
>> -	},
>> -	[24] = {
>> -		.name  = "instructions:G",
>> -		.check = test__checkevent_exclude_host_modifier,
>> -	},
>> -	[25] = {
>> -		.name  = "instructions:H",
>> -		.check = test__checkevent_exclude_guest_modifier,
>> -	},
>> -	[26] = {
>> -		.name  = "mem:0:rw",
>> -		.check = test__checkevent_breakpoint_rw,
>> -	},
>> -	[27] = {
>> -		.name  = "mem:0:rw:kp",
>> -		.check = test__checkevent_breakpoint_rw_modifier,
>> -	},
>> -	[28] = {
>> -		.name  = "{instructions:k,cycles:upp}",
>> -		.check = test__group1,
>> -	},
>> -	[29] = {
>> -		.name  = "{faults:k,cache-references}:u,cycles:k",
>> -		.check = test__group2,
>> -	},
>> -	[30] = {
>> -		.name  = "group1{syscalls:sys_enter_open:H,cycles:kppp},group2{cycles,1:3}:G,instructions:u",
>> -		.check = test__group3,
>> -	},
>> -	[31] = {
>> -		.name  = "{cycles:u,instructions:kp}:p",
>> -		.check = test__group4,
>> -	},
>> -	[32] = {
>> -		.name  = "{cycles,instructions}:G,{cycles:G,instructions:G},cycles",
>> -		.check = test__group5,
>> -	},
>> -};
>> -
>> -static struct test__event_st test__events_pmu[] = {
>> -	[0] = {
>> -		.name  = "cpu/config=10,config1,config2=3,period=1000/u",
>> -		.check = test__checkevent_pmu,
>> -	},
>> -	[1] = {
>> -		.name  = "cpu/config=1,name=krava/u,cpu/config=2/u",
>> -		.check = test__checkevent_pmu_name,
>> -	},
>> -};
>> -
>> -struct test__term {
>> -	const char *str;
>> -	__u32 type;
>> -	int (*check)(struct list_head *terms);
>> -};
>> -
>> -static struct test__term test__terms[] = {
>> -	[0] = {
>> -		.str   = "config=10,config1,config2=3,umask=1",
>> -		.check = test__checkterms_simple,
>> -	},
>> -};
>> -
>> -static int test_event(struct test__event_st *e)
>> -{
>> -	struct perf_evlist *evlist;
>> -	int ret;
>> -
>> -	evlist = perf_evlist__new(NULL, NULL);
>> -	if (evlist == NULL)
>> -		return -ENOMEM;
>> -
>> -	ret = parse_events(evlist, e->name, 0);
>> -	if (ret) {
>> -		pr_debug("failed to parse event '%s', err %d\n",
>> -			 e->name, ret);
>> -		return ret;
>> -	}
>> -
>> -	ret = e->check(evlist);
>> -	perf_evlist__delete(evlist);
>> -
>> -	return ret;
>> -}
>> -
>> -static int test_events(struct test__event_st *events, unsigned cnt)
>> -{
>> -	int ret1, ret2 = 0;
>> -	unsigned i;
>> -
>> -	for (i = 0; i < cnt; i++) {
>> -		struct test__event_st *e = &events[i];
>> -
>> -		pr_debug("running test %d '%s'\n", i, e->name);
>> -		ret1 = test_event(e);
>> -		if (ret1)
>> -			ret2 = ret1;
>> -	}
>> -
>> -	return ret2;
>> -}
>> -
>> -static int test_term(struct test__term *t)
>> -{
>> -	struct list_head *terms;
>> -	int ret;
>> -
>> -	terms = malloc(sizeof(*terms));
>> -	if (!terms)
>> -		return -ENOMEM;
>> -
>> -	INIT_LIST_HEAD(terms);
>> -
>> -	ret = parse_events_terms(terms, t->str);
>> -	if (ret) {
>> -		pr_debug("failed to parse terms '%s', err %d\n",
>> -			 t->str , ret);
>> -		return ret;
>> -	}
>> -
>> -	ret = t->check(terms);
>> -	parse_events__free_terms(terms);
>> -
>> -	return ret;
>> -}
>> -
>> -static int test_terms(struct test__term *terms, unsigned cnt)
>> -{
>> -	int ret = 0;
>> -	unsigned i;
>> -
>> -	for (i = 0; i < cnt; i++) {
>> -		struct test__term *t = &terms[i];
>> -
>> -		pr_debug("running test %d '%s'\n", i, t->str);
>> -		ret = test_term(t);
>> -		if (ret)
>> -			break;
>> -	}
>> -
>> -	return ret;
>> -}
>> -
>> -static int test_pmu(void)
>> -{
>> -	struct stat st;
>> -	char path[PATH_MAX];
>> -	int ret;
>> -
>> -	snprintf(path, PATH_MAX, "%s/bus/event_source/devices/cpu/format/",
>> -		 sysfs_find_mountpoint());
>> -
>> -	ret = stat(path, &st);
>> -	if (ret)
>> -		pr_debug("omitting PMU cpu tests\n");
>> -	return !ret;
>> -}
>> -
>> -static int test_pmu_events(void)
>> -{
>> -	struct stat st;
>> -	char path[PATH_MAX];
>> -	struct dirent *ent;
>> -	DIR *dir;
>> -	int ret;
>> -
>> -	snprintf(path, PATH_MAX, "%s/bus/event_source/devices/cpu/events/",
>> -		 sysfs_find_mountpoint());
>> -
>> -	ret = stat(path, &st);
>> -	if (ret) {
>> -		pr_debug("ommiting PMU cpu events tests\n");
>> -		return 0;
>> -	}
>> -
>> -	dir = opendir(path);
>> -	if (!dir) {
>> -		pr_debug("can't open pmu event dir");
>> -		return -1;
>> -	}
>> -
>> -	while (!ret && (ent = readdir(dir))) {
>> -#define MAX_NAME 100
>> -		struct test__event_st e;
>> -		char name[MAX_NAME];
>> -
>> -		if (!strcmp(ent->d_name, ".") ||
>> -		    !strcmp(ent->d_name, ".."))
>> -			continue;
>> -
>> -		snprintf(name, MAX_NAME, "cpu/event=%s/u", ent->d_name);
>> -
>> -		e.name  = name;
>> -		e.check = test__checkevent_pmu_events;
>> -
>> -		ret = test_event(&e);
>> -#undef MAX_NAME
>> -	}
>> -
>> -	closedir(dir);
>> -	return ret;
>> -}
>> -
>> -int parse_events__test(void)
>> -{
>> -	int ret1, ret2 = 0;
>> -
>> -#define TEST_EVENTS(tests)				\
>> -do {							\
>> -	ret1 = test_events(tests, ARRAY_SIZE(tests));	\
>> -	if (!ret2)					\
>> -		ret2 = ret1;				\
>> -} while (0)
>> -
>> -	TEST_EVENTS(test__events);
>> -
>> -	if (test_pmu())
>> -		TEST_EVENTS(test__events_pmu);
>> -
>> -	if (test_pmu()) {
>> -		int ret = test_pmu_events();
>> -		if (ret)
>> -			return ret;
>> -	}
>> -
>> -	ret1 = test_terms(test__terms, ARRAY_SIZE(test__terms));
>> -	if (!ret2)
>> -		ret2 = ret1;
>> -
>> -	return ret2;
>> -}
>> diff --git a/tools/testing/selftests/epoll/Makefile b/tools/testing/selftests/epoll/Makefile
>> deleted file mode 100644
>> index 19806ed..0000000
>> --- a/tools/testing/selftests/epoll/Makefile
>> +++ /dev/null
>> @@ -1,11 +0,0 @@
>> -# Makefile for epoll selftests
>> -
>> -all: test_epoll
>> -%: %.c
>> -	gcc -pthread -g -o $@ $^
>> -
>> -run_tests: all
>> -	./test_epoll
>> -
>> -clean:
>> -	$(RM) test_epoll
>> diff --git a/tools/testing/selftests/epoll/test_epoll.c b/tools/testing/selftests/epoll/test_epoll.c
>> deleted file mode 100644
>> index f752539..0000000
>> --- a/tools/testing/selftests/epoll/test_epoll.c
>> +++ /dev/null
>> @@ -1,344 +0,0 @@
>> -/*
>> - *  tools/testing/selftests/epoll/test_epoll.c
>> - *
>> - *  Copyright 2012 Adobe Systems Incorporated
>> - *
>> - *  This program is free software; you can redistribute it and/or modify
>> - *  it under the terms of the GNU General Public License as published by
>> - *  the Free Software Foundation; either version 2 of the License, or
>> - *  (at your option) any later version.
>> - *
>> - *  Paton J. Lewis <palewis@...be.com>
>> - *
>> - */
>> -
>> -#include <errno.h>
>> -#include <fcntl.h>
>> -#include <pthread.h>
>> -#include <stdio.h>
>> -#include <stdlib.h>
>> -#include <unistd.h>
>> -#include <sys/epoll.h>
>> -#include <sys/socket.h>
>> -
>> -/*
>> - * A pointer to an epoll_item_private structure will be stored in the epoll
>> - * item's event structure so that we can get access to the epoll_item_private
>> - * data after calling epoll_wait:
>> - */
>> -struct epoll_item_private {
>> -	int index;  /* Position of this struct within the epoll_items array. */
>> -	int fd;
>> -	uint32_t events;
>> -	pthread_mutex_t mutex;  /* Guards the following variables... */
>> -	int stop;
>> -	int status;  /* Stores any error encountered while handling item. */
>> -	/* The following variable allows us to test whether we have encountered
>> -	   a problem while attempting to cancel and delete the associated
>> -	   event. When the test program exits, 'deleted' should be exactly
>> -	   one. If it is greater than one, then the failed test reflects a real
>> -	   world situation where we would have tried to access the epoll item's
>> -	   private data after deleting it: */
>> -	int deleted;
>> -};
>> -
>> -struct epoll_item_private *epoll_items;
>> -
>> -/*
>> - * Delete the specified item from the epoll set. In a real-world secneario this
>> - * is where we would free the associated data structure, but in this testing
>> - * environment we retain the structure so that we can test for double-deletion:
>> - */
>> -void delete_item(int index)
>> -{
>> -	__sync_fetch_and_add(&epoll_items[index].deleted, 1);
>> -}
>> -
>> -/*
>> - * A pointer to a read_thread_data structure will be passed as the argument to
>> - * each read thread:
>> - */
>> -struct read_thread_data {
>> -	int stop;
>> -	int status;  /* Indicates any error encountered by the read thread. */
>> -	int epoll_set;
>> -};
>> -
>> -/*
>> - * The function executed by the read threads:
>> - */
>> -void *read_thread_function(void *function_data)
>> -{
>> -	struct read_thread_data *thread_data =
>> -		(struct read_thread_data *)function_data;
>> -	struct epoll_event event_data;
>> -	struct epoll_item_private *item_data;
>> -	char socket_data;
>> -
>> -	/* Handle events until we encounter an error or this thread's 'stop'
>> -	   condition is set: */
>> -	while (1) {
>> -		int result = epoll_wait(thread_data->epoll_set,
>> -					&event_data,
>> -					1,	/* Number of desired events */
>> -					1000);  /* Timeout in ms */
>> -		if (result < 0) {
>> -			/* Breakpoints signal all threads. Ignore that while
>> -			   debugging: */
>> -			if (errno == EINTR)
>> -				continue;
>> -			thread_data->status = errno;
>> -			return 0;
>> -		} else if (thread_data->stop)
>> -			return 0;
>> -		else if (result == 0)  /* Timeout */
>> -			continue;
>> -
>> -		/* We need the mutex here because checking for the stop
>> -		   condition and re-enabling the epoll item need to be done
>> -		   together as one atomic operation when EPOLL_CTL_DISABLE is
>> -		   available: */
>> -		item_data = (struct epoll_item_private *)event_data.data.ptr;
>> -		pthread_mutex_lock(&item_data->mutex);
>> -
>> -		/* Remove the item from the epoll set if we want to stop
>> -		   handling that event: */
>> -		if (item_data->stop)
>> -			delete_item(item_data->index);
>> -		else {
>> -			/* Clear the data that was written to the other end of
>> -			   our non-blocking socket: */
>> -			do {
>> -				if (read(item_data->fd, &socket_data, 1) < 1) {
>> -					if ((errno == EAGAIN) ||
>> -					    (errno == EWOULDBLOCK))
>> -						break;
>> -					else
>> -						goto error_unlock;
>> -				}
>> -			} while (item_data->events & EPOLLET);
>> -
>> -			/* The item was one-shot, so re-enable it: */
>> -			event_data.events = item_data->events;
>> -			if (epoll_ctl(thread_data->epoll_set,
>> -						  EPOLL_CTL_MOD,
>> -						  item_data->fd,
>> -						  &event_data) < 0)
>> -				goto error_unlock;
>> -		}
>> -
>> -		pthread_mutex_unlock(&item_data->mutex);
>> -	}
>> -
>> -error_unlock:
>> -	thread_data->status = item_data->status = errno;
>> -	pthread_mutex_unlock(&item_data->mutex);
>> -	return 0;
>> -}
>> -
>> -/*
>> - * A pointer to a write_thread_data structure will be passed as the argument to
>> - * the write thread:
>> - */
>> -struct write_thread_data {
>> -	int stop;
>> -	int status;  /* Indicates any error encountered by the write thread. */
>> -	int n_fds;
>> -	int *fds;
>> -};
>> -
>> -/*
>> - * The function executed by the write thread. It writes a single byte to each
>> - * socket in turn until the stop condition for this thread is set. If writing to
>> - * a socket would block (i.e. errno was EAGAIN), we leave that socket alone for
>> - * the moment and just move on to the next socket in the list. We don't care
>> - * about the order in which we deliver events to the epoll set. In fact we don't
>> - * care about the data we're writing to the pipes at all; we just want to
>> - * trigger epoll events:
>> - */
>> -void *write_thread_function(void *function_data)
>> -{
>> -	const char data = 'X';
>> -	int index;
>> -	struct write_thread_data *thread_data =
>> -		(struct write_thread_data *)function_data;
>> -	while (!thread_data->stop)
>> -		for (index = 0;
>> -		     !thread_data->stop && (index < thread_data->n_fds);
>> -		     ++index)
>> -			if ((write(thread_data->fds[index], &data, 1) < 1) &&
>> -				(errno != EAGAIN) &&
>> -				(errno != EWOULDBLOCK)) {
>> -				thread_data->status = errno;
>> -				return;
>> -			}
>> -}
>> -
>> -/*
>> - * Arguments are currently ignored:
>> - */
>> -int main(int argc, char **argv)
>> -{
>> -	const int n_read_threads = 100;
>> -	const int n_epoll_items = 500;
>> -	int index;
>> -	int epoll_set = epoll_create1(0);
>> -	struct write_thread_data write_thread_data = {
>> -		0, 0, n_epoll_items, malloc(n_epoll_items * sizeof(int))
>> -	};
>> -	struct read_thread_data *read_thread_data =
>> -		malloc(n_read_threads * sizeof(struct read_thread_data));
>> -	pthread_t *read_threads = malloc(n_read_threads * sizeof(pthread_t));
>> -	pthread_t write_thread;
>> -
>> -	printf("-----------------\n");
>> -	printf("Runing test_epoll\n");
>> -	printf("-----------------\n");
>> -
>> -	epoll_items = malloc(n_epoll_items * sizeof(struct epoll_item_private));
>> -
>> -	if (epoll_set < 0 || epoll_items == 0 || write_thread_data.fds == 0 ||
>> -		read_thread_data == 0 || read_threads == 0)
>> -		goto error;
>> -
>> -	if (sysconf(_SC_NPROCESSORS_ONLN) < 2) {
>> -		printf("Error: please run this test on a multi-core system.\n");
>> -		goto error;
>> -	}
>> -
>> -	/* Create the socket pairs and epoll items: */
>> -	for (index = 0; index < n_epoll_items; ++index) {
>> -		int socket_pair[2];
>> -		struct epoll_event event_data;
>> -		if (socketpair(AF_UNIX,
>> -			       SOCK_STREAM | SOCK_NONBLOCK,
>> -			       0,
>> -			       socket_pair) < 0)
>> -			goto error;
>> -		write_thread_data.fds[index] = socket_pair[0];
>> -		epoll_items[index].index = index;
>> -		epoll_items[index].fd = socket_pair[1];
>> -		if (pthread_mutex_init(&epoll_items[index].mutex, NULL) != 0)
>> -			goto error;
>> -		/* We always use EPOLLONESHOT because this test is currently
>> -		   structured to demonstrate the need for EPOLL_CTL_DISABLE,
>> -		   which only produces useful information in the EPOLLONESHOT
>> -		   case (without EPOLLONESHOT, calling epoll_ctl with
>> -		   EPOLL_CTL_DISABLE will never return EBUSY). If support for
>> -		   testing events without EPOLLONESHOT is desired, it should
>> -		   probably be implemented in a separate unit test. */
>> -		epoll_items[index].events = EPOLLIN | EPOLLONESHOT;
>> -		if (index < n_epoll_items / 2)
>> -			epoll_items[index].events |= EPOLLET;
>> -		epoll_items[index].stop = 0;
>> -		epoll_items[index].status = 0;
>> -		epoll_items[index].deleted = 0;
>> -		event_data.events = epoll_items[index].events;
>> -		event_data.data.ptr = &epoll_items[index];
>> -		if (epoll_ctl(epoll_set,
>> -			      EPOLL_CTL_ADD,
>> -			      epoll_items[index].fd,
>> -			      &event_data) < 0)
>> -			goto error;
>> -	}
>> -
>> -	/* Create and start the read threads: */
>> -	for (index = 0; index < n_read_threads; ++index) {
>> -		read_thread_data[index].stop = 0;
>> -		read_thread_data[index].status = 0;
>> -		read_thread_data[index].epoll_set = epoll_set;
>> -		if (pthread_create(&read_threads[index],
>> -				   NULL,
>> -				   read_thread_function,
>> -				   &read_thread_data[index]) != 0)
>> -			goto error;
>> -	}
>> -
>> -	if (pthread_create(&write_thread,
>> -			   NULL,
>> -			   write_thread_function,
>> -			   &write_thread_data) != 0)
>> -		goto error;
>> -
>> -	/* Cancel all event pollers: */
>> -#ifdef EPOLL_CTL_DISABLE
>> -	for (index = 0; index < n_epoll_items; ++index) {
>> -		pthread_mutex_lock(&epoll_items[index].mutex);
>> -		++epoll_items[index].stop;
>> -		if (epoll_ctl(epoll_set,
>> -			      EPOLL_CTL_DISABLE,
>> -			      epoll_items[index].fd,
>> -			      NULL) == 0)
>> -			delete_item(index);
>> -		else if (errno != EBUSY) {
>> -			pthread_mutex_unlock(&epoll_items[index].mutex);
>> -			goto error;
>> -		}
>> -		/* EBUSY means events were being handled; allow the other thread
>> -		   to delete the item. */
>> -		pthread_mutex_unlock(&epoll_items[index].mutex);
>> -	}
>> -#else
>> -	for (index = 0; index < n_epoll_items; ++index) {
>> -		pthread_mutex_lock(&epoll_items[index].mutex);
>> -		++epoll_items[index].stop;
>> -		pthread_mutex_unlock(&epoll_items[index].mutex);
>> -		/* Wait in case a thread running read_thread_function is
>> -		   currently executing code between epoll_wait and
>> -		   pthread_mutex_lock with this item. Note that a longer delay
>> -		   would make double-deletion less likely (at the expense of
>> -		   performance), but there is no guarantee that any delay would
>> -		   ever be sufficient. Note also that we delete all event
>> -		   pollers at once for testing purposes, but in a real-world
>> -		   environment we are likely to want to be able to cancel event
>> -		   pollers at arbitrary times. Therefore we can't improve this
>> -		   situation by just splitting this loop into two loops
>> -		   (i.e. signal 'stop' for all items, sleep, and then delete all
>> -		   items). We also can't fix the problem via EPOLL_CTL_DEL
>> -		   because that command can't prevent the case where some other
>> -		   thread is executing read_thread_function within the region
>> -		   mentioned above: */
>> -		usleep(1);
>> -		pthread_mutex_lock(&epoll_items[index].mutex);
>> -		if (!epoll_items[index].deleted)
>> -			delete_item(index);
>> -		pthread_mutex_unlock(&epoll_items[index].mutex);
>> -	}
>> -#endif
>> -
>> -	/* Shut down the read threads: */
>> -	for (index = 0; index < n_read_threads; ++index)
>> -		__sync_fetch_and_add(&read_thread_data[index].stop, 1);
>> -	for (index = 0; index < n_read_threads; ++index) {
>> -		if (pthread_join(read_threads[index], NULL) != 0)
>> -			goto error;
>> -		if (read_thread_data[index].status)
>> -			goto error;
>> -	}
>> -
>> -	/* Shut down the write thread: */
>> -	__sync_fetch_and_add(&write_thread_data.stop, 1);
>> -	if ((pthread_join(write_thread, NULL) != 0) || write_thread_data.status)
>> -		goto error;
>> -
>> -	/* Check for final error conditions: */
>> -	for (index = 0; index < n_epoll_items; ++index) {
>> -		if (epoll_items[index].status != 0)
>> -			goto error;
>> -		if (pthread_mutex_destroy(&epoll_items[index].mutex) < 0)
>> -			goto error;
>> -	}
>> -	for (index = 0; index < n_epoll_items; ++index)
>> -		if (epoll_items[index].deleted != 1) {
>> -			printf("Error: item data deleted %1d times.\n",
>> -				   epoll_items[index].deleted);
>> -			goto error;
>> -		}
>> -
>> -	printf("[PASS]\n");
>> -	return 0;
>> -
>> - error:
>> -	printf("[FAIL]\n");
>> -	return errno;
>> -}
>> diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
>> index be70035..c712fe5 100644
>> --- a/virt/kvm/kvm_main.c
>> +++ b/virt/kvm/kvm_main.c
>> @@ -2062,6 +2062,13 @@ out_free2:
>>   		r = 0;
>>   		break;
>>   	}
>> +	case KVM_SET_ENTITLEMENT: {
>> +		r = kvm_arch_vcpu_ioctl_set_entitlement(vcpu, arg);
>> +		if (r)
>> +			goto out;
>> +		r = 0;
>> +		break;
>> +	}
>>   	default:
>>   		r = kvm_arch_vcpu_ioctl(filp, ioctl, arg);
>>   	}
> --
> 			Gleb.
>

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

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ