diff options
author | Kirill Artamonov <kartamonov@nvidia.com> | 2011-06-26 21:37:18 +0300 |
---|---|---|
committer | Annamaria Pyreddy <apyreddy@nvidia.com> | 2011-08-19 16:43:42 -0700 |
commit | 48d10f659a21fd6d0dff5e073663f9689b549db4 (patch) | |
tree | d54fa117c1c2918a1678320247e496cce5ee9d92 /drivers/video/tegra/nvmap/nvmap_mru.h | |
parent | 9d650429b634914e0705c37d84a9cfa44375391a (diff) |
video: tegra: nvmap: fix GART pin lockupstegra-10.11.14
Fix GART lockups caused by fragmentation by evicting
mapped areas from iovm space after unsuccessful array
pinning attempt.
Fix double unpin error happening during interrupted
submit.
Fix possible sleep in atomic context in iovmm code
(semaphore inside spinlock) by replacing spinlock
with mutex.
Fix race between handle_unpin and pin_handle.
bug 838579
bug 838073
bug 818058
bug 844307
Conflicts:
drivers/video/tegra/nvmap/nvmap_mru.c
Reviewed-on: http://git-master/r/38430
(cherry picked from commit 4a4cae3323d3287e77fdc504e38656974ef24848)
Change-Id: I385913569ef455a1ceb5083829959de24f5309a7
Reviewed-on: http://git-master/r/47832
Reviewed-by: Andre Sihera <asihera@nvidia.com>
Tested-by: Andre Sihera <asihera@nvidia.com>
Reviewed-by: Kirill Artamonov <kartamonov@nvidia.com>
Reviewed-by: Bharat Nihalani <bnihalani@nvidia.com>
Diffstat (limited to 'drivers/video/tegra/nvmap/nvmap_mru.h')
-rw-r--r-- | drivers/video/tegra/nvmap/nvmap_mru.h | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/drivers/video/tegra/nvmap/nvmap_mru.h b/drivers/video/tegra/nvmap/nvmap_mru.h index bfc7fceae856..79ba8145a3af 100644 --- a/drivers/video/tegra/nvmap/nvmap_mru.h +++ b/drivers/video/tegra/nvmap/nvmap_mru.h @@ -35,12 +35,12 @@ struct tegra_iovmm_client; static inline void nvmap_mru_lock(struct nvmap_share *share) { - spin_lock(&share->mru_lock); + mutex_lock(&share->mru_lock); } static inline void nvmap_mru_unlock(struct nvmap_share *share) { - spin_unlock(&share->mru_lock); + mutex_unlock(&share->mru_lock); } int nvmap_mru_init(struct nvmap_share *share); @@ -53,7 +53,7 @@ void nvmap_mru_insert_locked(struct nvmap_share *share, struct nvmap_handle *h); void nvmap_mru_remove(struct nvmap_share *s, struct nvmap_handle *h); -struct tegra_iovmm_area *nvmap_handle_iovmm(struct nvmap_client *c, +struct tegra_iovmm_area *nvmap_handle_iovmm_locked(struct nvmap_client *c, struct nvmap_handle *h); #else @@ -72,7 +72,7 @@ static inline void nvmap_mru_remove(struct nvmap_share *s, struct nvmap_handle *h) { } -static inline struct tegra_iovmm_area *nvmap_handle_iovmm(struct nvmap_client *c, +static inline struct tegra_iovmm_area *nvmap_handle_iovmm_locked(struct nvmap_client *c, struct nvmap_handle *h) { BUG_ON(!h->pgalloc.area); |