msm: kgsl: use kgsl_mmu_device_setstate() if the GPU is already idle

Use the default setstate function, which directly reprograms the IOMMU,
to change IOMMU pagetables or flush the TLB if the GPU is already idle.
This condition often occurs when the GPU is being powered down. In this
case it is desirable to avoid the overhead of issuing commands, waiting
for idle and firing events that results from using the GPU
command stream to reprogram the IOMMU.

Change-Id: I633002ac49c8fe58df3f1f6a1fd1ddf705fc1733
Signed-off-by: Jeremy Gebben <jgebben@codeaurora.org>
Signed-off-by: Ajay Dudani <adudani@codeaurora.org>
msm: kgsl: implement server-side waits

	msm: kgsl: Add device init function

	Some device specific parameters need to be setup only once during
	device initialization. Create an init function for this purpose
	rather than re-doing this init everytime the device is started.

	Change-Id: I45c7fcda8d61fd2b212044c9167b64f793eedcda
	Signed-off-by: Carter Cooper <ccooper@codeaurora.org>
	Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>

	# This is the 2nd commit message:

	msm: kgsl: improve active_cnt and ACTIVE state management

	Require any code path which intends to touch the hardware
	to take a reference on active_cnt with kgsl_active_count_get()
	and release it with kgsl_active_count_put() when finished.
	These functions now do the wake / sleep steps that were
	previously handled by kgsl_check_suspended() and
	kgsl_check_idle().

	Additionally, kgsl_pre_hwaccess() will no longer turn on
	the clocks, it just enforces via BUG_ON that the clocks
	are enabled before a register is touched.

	Change-Id: I31b0d067e6d600f0228450dbd73f69caa919ce13
	Signed-off-by: Jeremy Gebben <jgebben@codeaurora.org>
	Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>

	# This is the 3rd commit message:

	msm: kgsl: Sync memory with CFF from places where it was missing

	Before submitting any indirect buffer to GPU via the ringbuffer,
	the indirect buffer memory should be synced with CFF so that the
	CFF capture will be complete. Add the syncing of memory with CFF
	in places where this was missing

	Change-Id: I18f506dd1ab7bdfb1a68181016e6f661a36ed5a2
	Signed-off-by: Shubhraprakash Das <sadas@codeaurora.org>
	Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>

	# This is the 4th commit message:

	msm: kgsl: Export some kgsl-core functions to EXPORT_SYMBOLS

	Export some functions in the KGSL core driver so they can
	be seen by the leaf drivers.

	Change-Id: Ic0dedbad5dbe562c2e674f8e885a3525b6feac7b
	Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>

	# This is the 5th commit message:

	msm: kgsl: Send the right IB size to adreno_find_ctxtmem

	adreno_find_ctxtmem expects byte lengths and we were sending it
	dword lengths which was about as effective as you would expect.

	Change-Id: Ic0dedbad536ed377f6253c3a5e75e5d6cb838acf
	Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>

	# This is the 6th commit message:

	msm: kgsl: Add 8974 default GPR0 & clk gating values

	Add correct clock gating values for A330, A305 and A320.
	Add generic function to return the correct default clock
	gating values for the respective gpu. Add default GPR0
	value for A330.

	Change-Id: I039e8e3622cbda04924b0510e410a9dc95bec598
	Signed-off-by: Harsh Vardhan Dwivedi <hdwivedi@codeaurora.org>
	Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>

	# This is the 7th commit message:

	msm: kgsl: Move A3XX VBIF settings decision to a table

	The vbif selection code is turning into a long series of if/else
	clauses. Move the decision to a look up table that will be easier
	to update and maintain when when we have eleventy A3XX GPUs.

	Change-Id: Ic0dedbadd6b16734c91060d7e5fa50dcc9b8774d
	Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>

	# This is the 8th commit message:

	msm: kgsl: Update settings for the A330v2 GPU in 8972v2

	The new GPU spin in 8974v2 has some slightly different settings
	then the 8974v1: add support for identifying a v2 spin, add a new
	table of VBIF register settings and update the clock gating
	registers.

	Change-Id: Ic0dedbad22bd3ed391b02f6327267cf32f17af3d
	Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>

	# This is the 9th commit message:

	msm: kgsl: Fix compilation errors when CFF is turned on

	Fix the compilation errors when option MSM_KGSL_CFF_DUMP option
	is turned on.

	Change-Id: I59b0a7314ba77e2c2fef03338e061cd503e88714
	Signed-off-by: Shubhraprakash Das <sadas@codeaurora.org>
	Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>

	# This is the 10th commit message:

	msm: kgsl: Convert the Adreno GPU cycle counters to run free

	In anticipation of allowing multiple entities to share access to the
	performance counters; make the few performance counters that KGSL
	uses run free.

	Change-Id: Ic0dedbadbefb400b04e4f3552eed395770ddbb7b
	Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>

	# This is the 11th commit message:

	msm: kgsl: Handle a possible ringbuffer allocspace error

	In the GPU specific start functions, account for the possibility
	that ringbuffer allocation routine might return NULL.

	Change-Id: Ic0dedbadf6199fee78b6a8c8210a1e76961873a0
	Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>

	# This is the 12th commit message:

	msm: kgsl: Add a new API to allow sharing of GPU performance counters

	Adreno uses programmable performance counters, meaning that while there
	are a limited number of physical counters each counter can be programmed
	to count a vast number of different measurements (we refer to these as
	countables).  This could cause problems if multiple apps want to use
	the performance counters, so this API and infrastructure allows the
	counters to be safely shared.

	The kernel tracks which countable is selected for each of the physical
	counters for each counter group (where groups closely match hardware
	blocks). If the desired countable is already in use, or there is an
	open physical counter, then the process is allowed to use the counter.

	The get ioctl reserves the counter and returns the dword offset of the
	register associated with that physical counter.  The put ioctl
	releases the physical counter.  The query ioctl gets the countables
	used for all of the counters in the block - up to 8 values can be
	returned.  The read ioctl gets the current hardware value in the counter

	Change-Id: Ic0dedbadae1dedadba60f8a3e685e2ce7d84fb33
	Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>
	Signed-off-by: Carter Cooper <ccooper@codeaurora.org>

	# This is the 13th commit message:

	msm: kgsl: Print the nearest active GPU buffers to a faulting address

	Print the two active GPU memory entries that bracket a faulting GPU
	address. This will help diagnose premature frees and buffer ovverruns.

	Check if the faulting GPU address was freed by the same process.

	Change-Id: Ic0dedbadebf57be9abe925a45611de8e597447ea
	Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>
	Signed-off-by: Vladimir Razgulin <vrazguli@codeaurora.org>

	# This is the 14th commit message:

	msm: kgsl: Remove an uneeded register write for A3XX GPUs

	A3XX doesn't have the MH block and so the register at 0x40 points
	somewhere else. Luckily the write was harmless but remove it anyway.

	Change-Id: Ic0dedbadd1e043cd38bbaec8fcf0c490dcdedc8c
	Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>

	# This is the 15th commit message:

	msm: kgsl: clean up iommu/gpummu protflag handling

	Make kgsl_memdesc_protflags() return the correct type of flags
	for the type of mmu being used. Query the memdesc with this
	function in kgsl_mmu_map(), rather than passing in the
	protflags. This prevents translation at multiple layers of
	the code and makes it easier to enforce that the mapping matches
	the allocation flags.

	Change-Id: I2a2f4a43026ae903dd134be00e646d258a83f79f
	Signed-off-by: Jeremy Gebben <jgebben@codeaurora.org>
	Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>

	# This is the 16th commit message:

	msm: kgsl: remove kgsl_mem_entry.flags

	The two flags fields in kgsl_memdesc should be enough for
	anyone.  Move the only flag using kgsl_mem_entry, the
	FROZEN flag for snapshot procesing, to use kgsl_memdesc.priv.

	Change-Id: Ia12b9a6e6c1f5b5e57fa461b04ecc3d1705f2eaf
	Signed-off-by: Jeremy Gebben <jgebben@codeaurora.org>
	Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>

	# This is the 17th commit message:

	msm: kgsl: map the guard page readonly on the iommu

	The guard page needs to be readable by the GPU, due to
	a prefetch range issue, but it should never be writable.
	Change the page fault message to indicate if nearby
	buffers have a guard page.

	Change-Id: I3955de1409cbf4ccdde92def894945267efa044d
	Signed-off-by: Jeremy Gebben <jgebben@codeaurora.org>
	Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>

	# This is the 18th commit message:

	msm: kgsl: Add support for VBIF and VBIF_PWR performance counters

	These 2 counter groups are also "special cases" that require
	different programming sequences.

	Change-Id: I73e3e76b340e6c5867c0909b3e0edc78aa62b9ee
	Signed-off-by: Jeremy Gebben <jgebben@codeaurora.org>
	Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>

	# This is the 19th commit message:

	msm: kgsl: Only allow two counters for VBIF performance counters

	There are only two VBIF counter groups so validate that the user
	doesn't pass in > 1 and clean up the if/else clause.

	Change-Id: Ic0dedbad3d5a54e4ceb1a7302762d6bf13b25da1
	Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>

	# This is the 20th commit message:

	msm: kgsl: Avoid an array overrun in the perfcounter API

	Make sure the passed group is less than the size of the list of
	performance counters.

	Change-Id: Ic0dedbadf77edf35db78939d1b55a05830979f85
	Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>

	# This is the 21st commit message:

	msm: kgsl: Don't go to slumber if active_count is non zero

	If active_cnt happens to be set when we go into
	kgsl_early_suspend_driver() then don't go to SLUMBER.  This
	avoids trouble if we come back and and try to access the
	hardware while it is off.

	Change-Id: Ic0dedbadb13514a052af6199c8ad1982d7483b3f
	Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>

	# This is the 22nd commit message:

	msm: kgsl: Enable HLSQ registers in snapshot when available

	Reading the HLSQ registers during a GPU hang recovery might cause
	the device to hang depending on the state of the HLSQ block.
	Enable the HLSQ register reads when we know that they will
	succeed.

	Change-Id: I69f498e6f67a15328d1d41cc64c43d6c44c54bad
	Signed-off-by: Carter Cooper <ccooper@codeaurora.org>
	Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>

	# This is the 23rd commit message:

	msm: kgsl: snapshot: Don't keep parsing indirect buffers on failure

	Stop parsing an indirect buffer if an error is encountered (such as
	a missing buffer). This is a pretty good indication that the buffers
	are not reliable and the further the parser goes with a unreliable
	buffer the more likely it is to get confused.

	Change-Id: Ic0dedbadf28ef374c9afe70613048d3c31078ec6
	Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>

	# This is the 24th commit message:

	msm: kgsl: snapshot: Only push the last IB1 and IB2 in the static space

	Some IB1 buffers have hundreds of little IB2 buffers and only one of them
	will actually be interesting enough to push into the static space.  Only
	push the last executed IB1 and IB2 into the static space.

	Change-Id: Ic0dedbad26fb30fb5bf90c37c29061fd962dd746
	Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>

	# This is the 25th commit message:

	msm: kgsl: Save the last active context in snapshot

	Save the last active context that was executing when the hang happened
	in snapshot.

	Change-Id: I2d32de6873154ec6c200268844fee7f3947b7395
	Signed-off-by: Shubhraprakash Das <sadas@codeaurora.org>
	Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>

	# This is the 26th commit message:

	msm: kgsl: In snapshot track a larger object size if address is same

	If the object being tracked has the same address as a previously
	tracked object then only track a single object with larger size
	as the smaller object will be a part of the larger one anyway.

	Change-Id: I0e33bbaf267bc0ec580865b133917b3253f9e504
	Signed-off-by: Shubhraprakash Das <sadas@codeaurora.org>
	Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>

	# This is the 27th commit message:

	msm: kgsl: Track memory address from 2 additional registers

	Add tracking of memory referenced by VS_OBJ_START_REG and FS_OBJ_START_REG
	registers in snapshot. This makes snapshot more complete in terms of
	tracking data that is used by the GPU at the time of hang.

	Change-Id: I7e5f3c94f0d6744cd6f2c6413bf7b7fac4a5a069
	Signed-off-by: Shubhraprakash Das <sadas@codeaurora.org>
	Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>

	# This is the 28th commit message:

	msm: kgsl: Loop till correct index on type0 packets

	When searching for memory addresses in type0 packet we were looping
	from start of the type0 packet till it's end, but the first DWORD
	is a header so we only need to loop till packet_size - 1. Fix this.

	Change-Id: I278446c6ab380cf8ebb18d5f3ae192d3d7e7db62
	Signed-off-by: Shubhraprakash Das <sadas@codeaurora.org>
	Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>

	# This is the 29th commit message:

	msm: kgsl: Add global timestamp information to snapshot

	Make sure that we always add global timestamp information to
	snapshot. This is needed in playbacks for searching whereabouts
	of last executed IB.

	Change-Id: Ica5b3b2ddff6fd45dbc5a911f42271ad5855a86a
	Signed-off-by: Shubhraprakash Das <sadas@codeaurora.org>
	Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>

	# This is the 30th commit message:

	msm: kgsl: Skip cff dump for certain functions when its disabled

	Certain functions were generating CFF when CFF was disabled. Make
	sure these functions do not dump CFF when it is disabled.

	Change-Id: Ib5485b03b8a4d12f190f188b80c11ec6f552731d
	Signed-off-by: Shubhraprakash Das <sadas@codeaurora.org>
	Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>

	# This is the 31st commit message:

	msm: kgsl: Fix searching of memory object

	Make sure that at least a size of 1 byte is searched when locating
	the memory entry of a region. If size is 0 then a memory region
	whose last address is equal to the start address of the memory being
	searched will be returned which is wrong.

	Change-Id: I643185d1fdd17296bd70fea483aa3c365e691bc5
	Signed-off-by: Shubhraprakash Das <sadas@codeaurora.org>
	Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>

	# This is the 32nd commit message:

	msm: kgsl: If adreno start fails then restore state of device

	Restore the state of the device back to what it was at the
	start of the adreno_start function if this function fails to
	execute successfully.

	Change-Id: I5b279e5186b164d3361fba7c8f8d864395b794c8
	Signed-off-by: Shubhraprakash Das <sadas@codeaurora.org>
	Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>

	# This is the 33rd commit message:

	msm: kgsl: Fix early exit condition in ringbuffer drain

	The ringbuffer drain function can be called when the ringbuffer
	start flag is not set. This happens on startup. Hence,
	exiting the function early based on start flag is incorrect.
	Simply execute this function regardless of the start flag.

	Change-Id: Ibf2075847f8bb1a760bc1550309efb3c7aa1ca49
	Signed-off-by: Shubhraprakash Das <sadas@codeaurora.org>
	Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>

	# This is the 34th commit message:

	msm: kgsl: Do not return an error on NULL gpu address

	If a NULL gpu address is passed to snapshot object tracking
	function then do not treat this as an error and return 0. NULL
	objects may be present in an IB so just skip over these objects
	instead of exiting due to an error.

	Signed-off-by: Shubhraprakash Das <sadas@codeaurora.org>
	Change-Id: Ic253722c58b41f41d03f83c77017e58365da01a7
	Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>

	# This is the 35th commit message:

	msm: kgsl: Don't hold process list global mutex in process private create

	Don't hold process list global mutex for long. Instead make
	use of process specific spin_lock() to serialize access
	to process private structure while creating it. Holding
	process list global mutex could lead to deadlocks as other
	functions depend on it.

	CRs-fixed: 480732
	Change-Id: Id54316770f911d0e23384f54ba5c14a1c9113680
	Signed-off-by: Harsh Vardhan Dwivedi <hdwivedi@codeaurora.org>
	Signed-off-by: Shubhraprakash Das <sadas@codeaurora.org>
	Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>

	# This is the 36th commit message:

	msm: kgsl: Use CPU path to program pagetable when active count is 0

	When active count is 0 then we should use the CPU path to program
	pagetables because the GPU path requires event registration. Events
	can only be queued when active count is valid. Hence, if the active
	count is NULL then use the CPU path.

	Change-Id: I70f5894d20796bdc0f592db7dc2731195c0f7a82
	CRs-fixed: 481887
	Signed-off-by: Shubhrapralash Das <sadas@codeaurora.org>
	Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>

	# This is the 37th commit message:

	iommu: msm: prevent partial mappings on error

	If msm_iommu_map_range() fails mid way through the va
	range with an error, clean up the PTEs that have already
	been created so they are not leaked.

	Change-Id: Ie929343cd6e36cade7b2cc9b4b4408c3453e6b5f
	Signed-off-by: Jeremy Gebben <jgebben@codeaurora.org>
	Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>

	# This is the 38th commit message:

	msm: kgsl: better handling of virtual address fragmentation

	When KGSL_MEMFLAGS_USE_CPU_MAP is enabled, the mmap address
	must try to match the GPU alignment requirements of the buffer,
	as well as include space in the mapping for the guard page.
	This can cause -ENOMEM to be returned from get_unmapped_area()
	when there are a large number of mappings. When this happens,
	fall back to page alignment and retry to avoid failure.

	Change-Id: I2176fe57afc96d8cf1fe1c694836305ddc3c3420
	Signed-off-by: Jeremy Gebben <jgebben@codeaurora.org>
	Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>

	# This is the 39th commit message:

	iommu: msm: Don't treat address 0 as an error case

	Currently, the iommu page table code treats a scattergather
	list with physical address 0 as an error. This may not be
	correct in all cases. Physical address 0 is a valid part
	of the system and may be used for valid page allocations.
	Nothing else in the system checks for physical address 0
	for error so don't treat it as an error.

	Change-Id: Ie9f0dae9dace4fff3b1c3449bc89c3afdd2e63a0
	CRs-Fixed: 478304
	Signed-off-by: Laura Abbott <lauraa@codeaurora.org>
	Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>

	# This is the 40th commit message:

	msm: kgsl: prevent race between mmap() and free on timestamp

	When KGSL_MEMFLAGS_USE_CPU_MAP is set, we must check that the
	address from get_unmapped_area() is not used as part of a
	mapping that is present only in the GPU pagetable and not the
	CPU pagetable. These mappings can occur because when a buffer
	is freed on timestamp, the CPU mapping is destroyed immediately
	but the GPU mapping is not destroyed until the GPU timestamp
	has passed.

	Because kgsl_mem_entry_detach_process() removed the rbtree
	entry before removing the iommu mapping, there was a window
	of time where kgsl thought the address was available even
	though it was still present in the iommu pagetable. This
	could cause the address to get assigned to a new buffer,
	which would cause iommu_map_range() to fail since the old
	mapping was still in the pagetable. Prevent this race by
	removing the iommu mapping before removing the rbtree entry
	tracking the address.

	Change-Id: I8f42d6d97833293b55fcbc272d180564862cef8a
	CRs-Fixed: 480222
	Signed-off-by: Jeremy Gebben <jgebben@codeaurora.org>
	Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>

	# This is the 41st commit message:

	msm: kgsl: add guard page support for imported memory

	Imported memory buffers sometimes do not have enough
	padding to prevent page faults due to overzealous
	GPU prefetch. Attach guard pages to their mappings
	to prevent these faults.

	Because we don't create the scatterlist for some
	types of imported memory, such as ion, the guard
	page is no longer included as the last entry in
	the scatterlist. Instead, it is handled by
	size ajustments and a separate iommu_map() call
	in the kgsl_mmu_map() and kgsl_mmu_unmap() paths.

	Change-Id: I3af3c29c3983f8cacdc366a2423f90c8ecdc3059
	Signed-off-by: Jeremy Gebben <jgebben@codeaurora.org>
	Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>

	# This is the 42nd commit message:

	msm: kgsl: fix kgsl_mem_entry refcounting

	Make kgsl_sharedmem_find* return a reference to the
	entry that was found. This makes using an entry
	without the mem_lock held less race prone.

	Change-Id: If6eb6470ecfea1332d3130d877922c70ca037467
	Signed-off-by: Jeremy Gebben <jgebben@codeaurora.org>
	Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>

	# This is the 43rd commit message:

	msm: kgsl: add ftrace for cache operations

	Add the event kgsl_mem_sync_cache. This event is
	emitted when only a cache operation is actually
	performed. Attempts to flush uncached memory,
	which do nothing, do not cause this event.

	Change-Id: Id4a940a6b50e08b54fbef0025c4b8aaa71641462
	Signed-off-by: Jeremy Gebben <jgebben@codeaurora.org>
	Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>

	# This is the 44th commit message:

	msm: kgsl: Add support for bulk cache operations

	Add a new ioctl, IOCTL_KGSL_GPUMEM_SYNC_CACHE_BULK, which can be used
	to sync a number of memory ids at once. This gives the driver an
	opportunity to optimize the cache operations based on the total
	working set of memory that needs to be managed.

	Change-Id: I9693c54cb6f12468b7d9abb0afaef348e631a114
	Signed-off-by: Jeremy Gebben <jgebben@codeaurora.org>
	Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>

	# This is the 45th commit message:

	msm: kgsl: flush the entire cache when the bulk batch is large

	On 8064 and 8974, flushing more than 16mb of virtual address
	space is slower than flushing the entire cache. So flush
	the entire cache when the working set is larger than this.
	The threshold for full cache flush can be tuned at runtime via
	the full_cache_threshold sysfs file.

	Change-Id: If525e4c44eb043d0afc3fe42d7ef2c7de0ba2106
	Signed-off-by: Jeremy Gebben <jgebben@codeaurora.org>
	Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>

	# This is the 46th commit message:

	msm: kgsl: Use a read/lock for the context idr

	Everybody loves a rcu but in this case we are dangerously mixing rcus and
	atomic operations.  Add a read/write lock to explicitly protect the idr.
	Also fix a few spots where the idr was used without protection.

	Change-Id: Ic0dedbad517a9f89134cbcf7af29c8bf0f034708
	Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>

	# This is the 47th commit message:

	msm: kgsl: embed kgsl_context struct in adreno_context struct

	Having a separate allocated struct for the device specific context
	makes ownership unclear, which could lead to reference counting
	problems or invalid pointers. Also, duplicate members were
	starting to appear in adreno_context because there wasn't a safe
	way to reach the kgsl_context from some parts of the adreno code.
	This can now be done via container_of().

	This change alters the lifecycle of the context->id, which is
	now freed when the context reference count hits zero rather
	than in kgsl_context_detach().

	It also changes the context creation and destruction sequence.
	The device specific code must allocate a structure containing
	a struct kgsl_context and passes a pointer it to kgsl_init_context()
	before doing any device specific initialization. There is also a
	separate drawctxt_detach() callback for doing device specific
	cleanup. This is separate from freeing memory, which is done
	by the drawctxt_destroy() callback.

	Change-Id: I7d238476a3bfec98fd8dbc28971cf3187a81dac2
	Signed-off-by: Jeremy Gebben <jgebben@codeaurora.org>
	Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>

	# This is the 48th commit message:

	msm: kgsl: Take a reference count on the active adreno draw context

	Take a reference count on the currently active draw context to keep
	it from going away while we are maintaining a pointer to it in the
	adreno device.

	Change-Id: Ic0dedbade8c09ecacf822e9a3c5fbaf6e017ec0c
	Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>

	# This is the 49th commit message:

	msm: kgsl: Add a command dispatcher to manage the ringbuffer

	Implements a centralized dispatcher for sending user commands
	to the ringbuffer. Incoming commands are queued by context and
	sent to the hardware on a round robin basis ensuring each context
	a small burst of commands at a time.  Each command is tracked
	throughout the pipeline giving the dispatcher better knowledge
	of how the hardware is being used.  This will be the basis for
	future per-context and cross context enhancements as priority
	queuing and server-side syncronization.

	Change-Id: Ic0dedbad49a43e8e6096d1362829c800266c2de3
	Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>

	# This is the 50th commit message:

	msm: kgsl: Only turn on the idle timer when active_cnt is 0

	Only turn on the idle timer when the GPU expected to be quiet.

	Change-Id: Ic0dedbad57846f1e7bf7820ec3152cd20598b448
	Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>

	# This is the 51st commit message:

	msm: kgsl: Add a ftrace event for active_cnt

	Add a new ftrace event for watching the rise and fall of active_cnt:

	  echo 1 > /sys/kernel/debug/tracing/events/kgsl/kgsl_active_count/enable

	This will give you the current active count and the caller of the function:

	  kgsl_active_count: d_name=kgsl-3d0 active_cnt=8e9 func=kgsl_ioctl

	Change-Id: Ic0dedbadc80019e96ce759d9d4e0ad43bbcfedd2
	Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>

	# This is the 52nd commit message:

	msm: kgsl: Implement KGSL fault tolerance policy in the dispatcher

	Implement the KGSL fault tolerance policy for faults in the dispatcher.
	Replay (or skip) the inflight command batches as dictated by the policy,
	iterating progressively through the various behaviors.

	Change-Id: Ic0dedbade98cc3aa35b26813caf4265c74ccab56
	Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>

	# This is the 53rd commit message:

	msm: kgsl: Don't process events if the timestamp hasn't changed

	Keep track of the global timestamp every time the event code runs.
	If the timestamp hasn't changed then we are caught up and we can
	politely bow out.  This avoids the situation where multiple
	interrupts queue the work queue multiple times:

	   IRQ
	     -> process events
	   IRQ
	   IRQ
	     -> process events

	The actual retired timestamp in the first work item might be well
	ahead of the delivered interrupts. The event loop will end up
	processing every event that has been retired by the hardware
	at that point. If the work item gets re-queued by a subesquent
	interrupt then we might have already addressed all the pending
	timestamps.

	Change-Id: Ic0dedbad79722654cb17e82b7149e93d3c3f86a0
	Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>

	# This is the 54th commit message:

	msm: kgsl: Make active_cnt an atomic variable

	In kgsl_active_cnt_light() the mutex was needed just to check and
	increment the active_cnt value.  Move active_cnt to an atomic to
	begin the task of freeing ourselves from the grip of the device
	mutex if we can avoid it.

	Change-Id: Ic0dedbad78e086e3aa3559fab8ecebc43539f769
	Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>

	# This is the 55th commit message:

	msm: kgsl: Add a new command submission API

	Add an new ioctl entry point for submitting commands to the GPU
	called IOCTL_KGSL_SUBMIT_COMMANDS.

	As with IOCTL_KGSL_RINGBUFFER_ISSUEIBCMDS the user passes a list of
	indirect buffers, flags and optionally a user specified timestamp. The
	old way of passing a list of indirect buffers is no longer supported.

	IOCTL_KGSL_SUBMIT_COMMANDS also allows the user to define a
	list of sync points for the command. Sync points are dependencies
	on events that need to be satisfied before the command will be issued
	to the hardware.  Events are designed to be flexible.  To start with
	the only events that are supported are GPU events for a given context/
	timestamp pair.

	Pending events are stored in a list in the command batch. As each event is
	expired it is deleted from the list. The adreno dispatcher won't send the
	command until the list is empty.  Sync points are not supported for Z180.

	CRs-Fixed: 468770
	Change-Id: Ic0dedbad5a5935f486acaeb033ae9a6010f82346
	Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>

	# This is the 56th commit message:

	msm: kgsl: add kgsl_sync_fence_waiter for server side sync

	For server side sync the KGSL kernel module needs to perform
	an asynchronous wait for a fence object prior to issuing
	subsequent commands.

	Change-Id: I1ee614aa3af84afc4813f1e47007f741beb3bc92
	Signed-off-by: Jeff Boody <jboody@codeaurora.org>
	Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>

	# This is the 57th commit message:

	msm: kgsl: Add support for KGSL_CMD_SYNCPOINT_TYPE_FENCE

	Allow command batches to wait for external fence sync events.

	Change-Id: Ic0dedbad3a211019e1cd3a3d62ab6a3e4d4eeb05
	Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>

	# This is the 58th commit message:

	msm: kgsl: fix potential double free of the kwaiter

	Change-Id: Ic0dedbad66a0af6eaef52b2ad53c067110bdc6e4
	Signed-off-by: Jeff Boody <jboody@codeaurora.org>
	Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>

	# This is the 59th commit message:

	msm: kgsl: free an event only after canceling successfully

	Change-Id: Ic0dedbade256443d090dd11df452dc9cdf65530b
	Signed-off-by: Jeff Boody <jboody@codeaurora.org>
	Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>
cpufreq: Retain only online cpus in managed_policy->cpus
cpufreq's handling of cpu online event can incorrectly initialize
managed_policy->cpus to include offline cpus. This causes cpufreq
governors to include offline cpus in their idle time computation, which
causes frequency to shoot up beyond normal levels (on systems where 2 or
more cpus need to be synchronized wrt frequency change).

This frequency shootup was not seen prior to commit 21111be8 which
changed idle time accounting for offline cpus. Prior to commit 21111be8,
idle time statistics for offline cpus would include their offline time
as well. Post commit 21111be8, offline time is not included in a cpu's
idle time statistics.

As a result, ondemand (or other cpufreq) governors would see unchanged
idle time for offline cpus, causing them to interpret those (offline)
cpus as 100% busy, which is wrong.

This patch fixes the issue by modifying cpufreq's hotplug handling to
retain only online cpus in managed_policy->cpus field. cpufreq governors
would then skip such offline cpus from idle time calculations.

Change-Id: Id2eba8c0ec3367609369b2e42a4e1386ff2e7ab5
Signed-off-by: Srivatsa Vaddagiri <vatsa@codeaurora.org>
word-at-a-time: make the interfaces truly generic
This changes the interfaces in <asm/word-at-a-time.h> to be a bit more
complicated, but a lot more generic.

In particular, it allows us to really do the operations efficiently on
both little-endian and big-endian machines, pretty much regardless of
machine details.  For example, if you can rely on a fast population
count instruction on your architecture, this will allow you to make your
optimized <asm/word-at-a-time.h> file with that.

NOTE! The "generic" version in include/asm-generic/word-at-a-time.h is
not truly generic, it actually only works on big-endian.  Why? Because
on little-endian the generic algorithms are wasteful, since you can
inevitably do better. The x86 implementation is an example of that.

(The only truly non-generic part of the asm-generic implementation is
the "find_zero()" function, and you could make a little-endian version
of it.  And if the Kbuild infrastructure allowed us to pick a particular
header file, that would be lovely)

The <asm/word-at-a-time.h> functions are as follows:

 - WORD_AT_A_TIME_CONSTANTS: specific constants that the algorithm
   uses.

 - has_zero(): take a word, and determine if it has a zero byte in it.
   It gets the word, the pointer to the constant pool, and a pointer to
   an intermediate "data" field it can set.

   This is the "quick-and-dirty" zero tester: it's what is run inside
   the hot loops.

 - "prep_zero_mask()": take the word, the data that has_zero() produced,
   and the constant pool, and generate an *exact* mask of which byte had
   the first zero.  This is run directly *outside* the loop, and allows
   the "has_zero()" function to answer the "is there a zero byte"
   question without necessarily getting exactly *which* byte is the
   first one to contain a zero.

   If you do multiple byte lookups concurrently (eg "hash_name()", which
   looks for both NUL and '/' bytes), after you've done the prep_zero_mask()
   phase, the result of those can be or'ed together to get the "either
   or" case.

 - The result from "prep_zero_mask()" can then be fed into "find_zero()"
   (to find the byte offset of the first byte that was zero) or into
   "zero_bytemask()" (to find the bytemask of the bytes preceding the
   zero byte).

   The existence of zero_bytemask() is optional, and is not necessary
   for the normal string routines.  But dentry name hashing needs it, so
   if you enable DENTRY_WORD_AT_A_TIME you need to expose it.

This changes the generic strncpy_from_user() function and the dentry
hashing functions to use these modified word-at-a-time interfaces.  This
gets us back to the optimized state of the x86 strncpy that we lost in
the previous commit when moving over to the generic version.

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
enabled hwbreakpoint flag
Revert "word-at-a-time: make the interfaces truly generic"

This reverts commit b70fdacf2a4c85f95412aedf3d27498a26bc479e.
can: flexcan: flexcan_chip_start: fix regression, mark one MB for TX and abort pending TX

commit d5a7b406c529e4595ce03dc8f6dcf7fa36f106fa upstream.

In patch

    0d1862e can: flexcan: fix flexcan_chip_start() on imx6

the loop in flexcan_chip_start() that iterates over all mailboxes after the
soft reset of the CAN core was removed. This loop put all mailboxes (even the
ones marked as reserved 1...7) into EMPTY/INACTIVE mode. On mailboxes 8...63,
this aborts any pending TX messages.

After a cold boot there is random garbage in the mailboxes, which leads to
spontaneous transmit of CAN frames during first activation. Further if the
interface was disabled with a pending message (usually due to an error
condition on the CAN bus), this message is retransmitted after enabling the
interface again.

This patch fixes the regression by:
1) Limiting the maximum number of used mailboxes to 8, 0...7 are used by the RX
FIFO, 8 is used by TX.
2) Marking the TX mailbox as EMPTY/INACTIVE, so that any pending TX of that
mailbox is aborted.

Cc: Lothar Waßmann <LW@KARO-electronics.de>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
libata: make ata_eh_qc_retry() bump scmd->allowed on bogus failures

commit f13e220161e738c2710b9904dcb3cf8bb0bcce61 upstream.

libata EH decrements scmd->retries when the command failed for reasons
unrelated to the command itself so that, for example, commands aborted
due to suspend / resume cycle don't get penalized; however,
decrementing scmd->retries isn't enough for ATA passthrough commands.

Without this fix, ATA passthrough commands are not resend to the
drive, and no error is signalled to the caller because:

- allowed retry count is 1
- ata_eh_qc_complete fill the sense data, so result is valid
- sense data is filled with untouched ATA registers.

Signed-off-by: Gwendal Grignou <gwendal@google.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
md: Fix skipping recovery for read-only arrays.

commit 61e4947c99c4494336254ec540c50186d186150b upstream.

Since:
        commit 7ceb17e87bde79d285a8b988cfed9eaeebe60b86
        md: Allow devices to be re-added to a read-only array.

spares are activated on a read-only array. In case of raid1 and raid10
personalities it causes that not-in-sync devices are marked in-sync
without checking if recovery has been finished.

If a read-only array is degraded and one of its devices is not in-sync
(because the array has been only partially recovered) recovery will be skipped.

This patch adds checking if recovery has been finished before marking a device
in-sync for raid1 and raid10 personalities. In case of raid5 personality
such condition is already present (at raid5.c:6029).

Bug was introduced in 3.10 and causes data corruption.

Signed-off-by: Pawel Baldysiak <pawel.baldysiak@intel.com>
Signed-off-by: Lukasz Dorau <lukasz.dorau@intel.com>
Signed-off-by: NeilBrown <neilb@suse.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
clockevents: Sanitize ticks to nsec conversion

commit 97b9410643475d6557d2517c2aff9fd2221141a9 upstream.

Marc Kleine-Budde pointed out, that commit 77cc982 "clocksource: use
clockevents_config_and_register() where possible" caused a regression
for some of the converted subarchs.

The reason is, that the clockevents core code converts the minimal
hardware tick delta to a nanosecond value for core internal
usage. This conversion is affected by integer math rounding loss, so
the backwards conversion to hardware ticks will likely result in a
value which is less than the configured hardware limitation. The
affected subarchs used their own workaround (SIGH!) which got lost in
the conversion.

The solution for the issue at hand is simple: adding evt->mult - 1 to
the shifted value before the integer divison in the core conversion
function takes care of it. But this only works for the case where for
the scaled math mult/shift pair "mult <= 1 << shift" is true. For the
case where "mult > 1 << shift" we can apply the rounding add only for
the minimum delta value to make sure that the backward conversion is
not less than the given hardware limit. For the upper bound we need to
omit the rounding add, because the backwards conversion is always
larger than the original latch value. That would violate the upper
bound of the hardware device.

Though looking closer at the details of that function reveals another
bogosity: The upper bounds check is broken as well. Checking for a
resulting "clc" value greater than KTIME_MAX after the conversion is
pointless. The conversion does:

      u64 clc = (latch << evt->shift) / evt->mult;

So there is no sanity check for (latch << evt->shift) exceeding the
64bit boundary. The latch argument is "unsigned long", so on a 64bit
arch the handed in argument could easily lead to an unnoticed shift
overflow. With the above rounding fix applied the calculation before
the divison is:

       u64 clc = (latch << evt->shift) + evt->mult - 1;

So we need to make sure, that neither the shift nor the rounding add
is overflowing the u64 boundary.

[ukl: move assignment to rnd after eventually changing mult, fix build
 issue and correct comment with the right math]

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: Russell King - ARM Linux <linux@arm.linux.org.uk>
Cc: Marc Kleine-Budde <mkl@pengutronix.de>
Cc: nicolas.ferre@atmel.com
Cc: Marc Pignat <marc.pignat@hevs.ch>
Cc: john.stultz@linaro.org
Cc: kernel@pengutronix.de
Cc: Ronald Wahl <ronald.wahl@raritan.com>
Cc: LAK <linux-arm-kernel@lists.infradead.org>
Cc: Ludovic Desroches <ludovic.desroches@atmel.com>
Link: http://lkml.kernel.org/r/1380052223-24139-1-git-send-email-u.kleine-koenig@pengutronix.de
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
parisc: Do not crash 64bit SMP kernels on machines with >= 4GB RAM

commit 54e181e073fc1415e41917d725ebdbd7de956455 upstream.

Since the beginning of the parisc-linux port, sometimes 64bit SMP kernels were
not able to bring up other CPUs than the monarch CPU and instead crashed the
kernel.  The reason was unclear, esp. since it involved various machines (e.g.
J5600, J6750 and SuperDome). Testing showed, that those crashes didn't happened
when less than 4GB were installed, or if a 32bit Linux kernel was booted.

In the end, the fix for those SMP problems is trivial:
During the early phase of the initialization of the CPUs, including the monarch
CPU, the PDC_PSW firmware function to enable WIDE (=64bit) mode is called.
It's documented that this firmware function may clobber various registers, and
one one of those possibly clobbered registers is %cr30 which holds the task
thread info pointer.

Now, if %cr30 would always have been clobbered, then this bug would have been
detected much earlier. But lots of testing finally showed, that - at least for
%cr30 - on some machines only the upper 32bits of the 64bit register suddenly
turned zero after the firmware call.

So, after finding the root cause, the explanation for the various crashes
became clear:
- On 32bit SMP Linux kernels all upper 32bit were zero, so we didn't faced this
  problem.
- Monarch CPUs in 64bit mode always booted sucessfully, because the inital task
  thread info pointer was below 4GB.
- Secondary CPUs booted sucessfully on machines with less than 4GB RAM because
  the upper 32bit were zero anyay.
- Secondary CPus failed to boot if we had more than 4GB RAM and the task thread
  info pointer was located above the 4GB boundary.

Finally, the patch to fix this problem is trivial by saving the %cr30 register
before the firmware call and restoring it afterwards.

Signed-off-by: Helge Deller <deller@gmx.de>
Signed-off-by: John David Anglin <dave.anglin@bell.net>
Signed-off-by: Helge Deller <deller@gmx.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
staging: ozwpan: prevent overflow in oz_cdev_write()

commit c2c65cd2e14ada6de44cb527e7f1990bede24e15 upstream.

We need to check "count" so we don't overflow the ei->data buffer.

Reported-by: Nico Golde <nico@ngolde.de>
Reported-by: Fabian Yamaguchi <fabs@goesec.de>
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Staging: bcm: info leak in ioctl

commit 8d1e72250c847fa96498ec029891de4dc638a5ba upstream.

The DevInfo.u32Reserved[] array isn't initialized so it leaks kernel
information to user space.

Reported-by: Nico Golde <nico@ngolde.de>
Reported-by: Fabian Yamaguchi <fabs@goesec.de>
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
uml: check length in exitcode_proc_write()

commit 201f99f170df14ba52ea4c52847779042b7a623b upstream.

We don't cap the size of buffer from the user so we could write past the
end of the array here.  Only root can write to this file.

Reported-by: Nico Golde <nico@ngolde.de>
Reported-by: Fabian Yamaguchi <fabs@goesec.de>
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
xtensa: don't use alternate signal stack on threads

commit cba9a90053e3b7973eff4f1946f33032e98eeed5 upstream.

According to create_thread(3): "The new thread does not inherit the creating
thread's alternate signal stack". Since commit f9a3879a (Fix sigaltstack
corruption among cloned threads), current->sas_ss_size is set to 0 for cloned
processes sharing VM with their parent. Don't use the (nonexistent) alternate
signal stack in this case. This has been broken since commit 29c4dfd9 ([XTENSA]
Remove non-rt signal handling).

Fixes the SA_ONSTACK part of the nptl/tst-cancel20 test from uClibc.

Signed-off-by: Baruch Siach <baruch@tkos.co.il>
Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
Signed-off-by: Chris Zankel <chris@zankel.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
lib/scatterlist.c: don't flush_kernel_dcache_page on slab page

commit 3d77b50c5874b7e923be946ba793644f82336b75 upstream.

Commit b1adaf65ba03 ("[SCSI] block: add sg buffer copy helper
functions") introduces two sg buffer copy helpers, and calls
flush_kernel_dcache_page() on pages in SG list after these pages are
written to.

Unfortunately, the commit may introduce a potential bug:

 - Before sending some SCSI commands, kmalloc() buffer may be passed to
   block layper, so flush_kernel_dcache_page() can see a slab page
   finally

 - According to cachetlb.txt, flush_kernel_dcache_page() is only called
   on "a user page", which surely can't be a slab page.

 - ARCH's implementation of flush_kernel_dcache_page() may use page
   mapping information to do optimization so page_mapping() will see the
   slab page, then VM_BUG_ON() is triggered.

Aaro Koskinen reported the bug on ARM/kirkwood when DEBUG_VM is enabled,
and this patch fixes the bug by adding test of '!PageSlab(miter->page)'
before calling flush_kernel_dcache_page().

Signed-off-by: Ming Lei <ming.lei@canonical.com>
Reported-by: Aaro Koskinen <aaro.koskinen@iki.fi>
Tested-by: Simon Baatz <gmbnomis@gmail.com>
Cc: Russell King - ARM Linux <linux@arm.linux.org.uk>
Cc: Will Deacon <will.deacon@arm.com>
Cc: Aaro Koskinen <aaro.koskinen@iki.fi>
Acked-by: Catalin Marinas <catalin.marinas@arm.com>
Cc: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
Cc: Tejun Heo <tj@kernel.org>
Cc: "James E.J. Bottomley" <JBottomley@parallels.com>
Cc: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
aacraid: missing capable() check in compat ioctl

commit f856567b930dfcdbc3323261bf77240ccdde01f5 upstream.

In commit d496f94d22d1 ('[SCSI] aacraid: fix security weakness') we
added a check on CAP_SYS_RAWIO to the ioctl.  The compat ioctls need the
check as well.

Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
mm: fix aio performance regression for database caused by THP

commit 7cb2ef56e6a8b7b368b2e883a0a47d02fed66911 upstream.

I am working with a tool that simulates oracle database I/O workload.
This tool (orion to be specific -
<http://docs.oracle.com/cd/E11882_01/server.112/e16638/iodesign.htm#autoId24>)
allocates hugetlbfs pages using shmget() with SHM_HUGETLB flag.  It then
does aio into these pages from flash disks using various common block
sizes used by database.  I am looking at performance with two of the most
common block sizes - 1M and 64K.  aio performance with these two block
sizes plunged after Transparent HugePages was introduced in the kernel.
Here are performance numbers:

		pre-THP		2.6.39		3.11-rc5
1M read		8384 MB/s	5629 MB/s	6501 MB/s
64K read	7867 MB/s	4576 MB/s	4251 MB/s

I have narrowed the performance impact down to the overheads introduced by
THP in __get_page_tail() and put_compound_page() routines.  perf top shows
>40% of cycles being spent in these two routines.  Every time direct I/O
to hugetlbfs pages starts, kernel calls get_page() to grab a reference to
the pages and calls put_page() when I/O completes to put the reference
away.  THP introduced significant amount of locking overhead to get_page()
and put_page() when dealing with compound pages because hugepages can be
split underneath get_page() and put_page().  It added this overhead
irrespective of whether it is dealing with hugetlbfs pages or transparent
hugepages.  This resulted in 20%-45% drop in aio performance when using
hugetlbfs pages.

Since hugetlbfs pages can not be split, there is no reason to go through
all the locking overhead for these pages from what I can see.  I added
code to __get_page_tail() and put_compound_page() to bypass all the
locking code when working with hugetlbfs pages.  This improved performance
significantly.  Performance numbers with this patch:

		pre-THP		3.11-rc5	3.11-rc5 + Patch
1M read		8384 MB/s	6501 MB/s	8371 MB/s
64K read	7867 MB/s	4251 MB/s	6510 MB/s

Performance with 64K read is still lower than what it was before THP, but
still a 53% improvement.  It does mean there is more work to be done but I
will take a 53% improvement for now.

Please take a look at the following patch and let me know if it looks
reasonable.

[akpm@linux-foundation.org: tweak comments]
Signed-off-by: Khalid Aziz <khalid.aziz@oracle.com>
Cc: Pravin B Shelar <pshelar@nicira.com>
Cc: Christoph Lameter <cl@linux.com>
Cc: Andrea Arcangeli <aarcange@redhat.com>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Mel Gorman <mel@csn.ul.ie>
Cc: Rik van Riel <riel@redhat.com>
Cc: Minchan Kim <minchan@kernel.org>
Cc: Andi Kleen <andi@firstfloor.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
updated toolchain