diff options
author | Deepak Nibade <dnibade@nvidia.com> | 2016-12-19 06:01:43 -0500 |
---|---|---|
committer | mobile promotions <svcmobile_promotions@nvidia.com> | 2016-12-27 04:24:35 -0500 |
commit | 505b442551a2e27aa3bc9e608c5a2bc9fccecbc4 (patch) | |
tree | 5b4d1d9664ab819e009fc9300784b897be035058 /drivers/gpu/nvgpu/gk20a/channel_gk20a.c | |
parent | f3d2dd4fd2c3d0fa3f774bcbc1d2b9ef482d7663 (diff) |
gpu: nvgpu: acquire mutex for notifier read
We use &ch->error_notifier_mutex to protect
writes and free of error notifier
But we currently do not protect reading of
notifier in gk20a_fifo_set_ctx_mmu_error()
and vgpu_fifo_set_ctx_mmu_error()
Add new API gk20a_set_error_notifier_locked()
which is same as gk20a_set_error_notifier()
but without the locks.
In *_fifo_set_ctx_mmu_error() APIs, acquire
the mutex explicitly, and then use this new
API
gk20a_set_error_notifier() will now just call
gk20a_set_error_notifier_locked() within
a mutex
Bug 1824788
Bug 1844312
Change-Id: I1f3831dc63fe1daa761b2e17e4de3c155f505d6f
Signed-off-by: Deepak Nibade <dnibade@nvidia.com>
Reviewed-on: http://git-master/r/1273471
Reviewed-by: Automatic_Commit_Validation_User
Reviewed-by: Richard Zhao <rizhao@nvidia.com>
GVS: Gerrit_Virtual_Submit
Reviewed-by: Bharat Nihalani <bnihalani@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/channel_gk20a.c')
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/channel_gk20a.c | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/channel_gk20a.c b/drivers/gpu/nvgpu/gk20a/channel_gk20a.c index 129921ad..38cb368c 100644 --- a/drivers/gpu/nvgpu/gk20a/channel_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/channel_gk20a.c | |||
@@ -827,11 +827,12 @@ static int gk20a_init_error_notifier(struct channel_gk20a *ch, | |||
827 | return 0; | 827 | return 0; |
828 | } | 828 | } |
829 | 829 | ||
830 | void gk20a_set_error_notifier(struct channel_gk20a *ch, __u32 error) | 830 | /** |
831 | * gk20a_set_error_notifier_locked() | ||
832 | * Should be called with ch->error_notifier_mutex held | ||
833 | */ | ||
834 | void gk20a_set_error_notifier_locked(struct channel_gk20a *ch, __u32 error) | ||
831 | { | 835 | { |
832 | bool notifier_set = false; | ||
833 | |||
834 | mutex_lock(&ch->error_notifier_mutex); | ||
835 | if (ch->error_notifier_ref) { | 836 | if (ch->error_notifier_ref) { |
836 | struct timespec time_data; | 837 | struct timespec time_data; |
837 | u64 nsec; | 838 | u64 nsec; |
@@ -845,13 +846,16 @@ void gk20a_set_error_notifier(struct channel_gk20a *ch, __u32 error) | |||
845 | ch->error_notifier->info32 = error; | 846 | ch->error_notifier->info32 = error; |
846 | ch->error_notifier->status = 0xffff; | 847 | ch->error_notifier->status = 0xffff; |
847 | 848 | ||
848 | notifier_set = true; | ||
849 | } | ||
850 | mutex_unlock(&ch->error_notifier_mutex); | ||
851 | |||
852 | if (notifier_set) | ||
853 | gk20a_err(dev_from_gk20a(ch->g), | 849 | gk20a_err(dev_from_gk20a(ch->g), |
854 | "error notifier set to %d for ch %d", error, ch->hw_chid); | 850 | "error notifier set to %d for ch %d", error, ch->hw_chid); |
851 | } | ||
852 | } | ||
853 | |||
854 | void gk20a_set_error_notifier(struct channel_gk20a *ch, __u32 error) | ||
855 | { | ||
856 | mutex_lock(&ch->error_notifier_mutex); | ||
857 | gk20a_set_error_notifier_locked(ch, error); | ||
858 | mutex_unlock(&ch->error_notifier_mutex); | ||
855 | } | 859 | } |
856 | 860 | ||
857 | static void gk20a_free_error_notifiers(struct channel_gk20a *ch) | 861 | static void gk20a_free_error_notifiers(struct channel_gk20a *ch) |