Patch "drm/msm: fix use of copy_from_user() while holding spinlock" has been added to the 4.7-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
drm/msm: fix use of copy_from_user() while holding spinlock
to the 4.7-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
drm-msm-fix-use-of-copy_from_user-while-holding-spinlock.patch
and it can be found in the queue-4.7 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
89f82cbb0d5c0ab768c8d02914188aa2211cd2e3Mon Sep 17 00:00:00 2001
From: Rob Clark <[email protected]>
Date: Mon, 22 Aug 2016 15:15:23 -0400
Subject: drm/msm: fix use of copy_from_user() while holding spinlock
From: Rob Clark <[email protected]>
commit 89f82cbb0d5c0ab768c8d02914188aa2211cd2e3 upstream.
Use instead __copy_from_user_inatomic() and fallback to slow-path where we drop and re-aquire the lock in case of fault.
--- drivers/gpu/drm/msm/msm_gem_submit.c | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-)
drivers/gpu/drm/msm/msm_gem_submit.c +22 -5
@@ -62,6 +62,14 @@ void msm_gem_submit_free(struct msm_gem_kfree (submit); } +static inline unsigned long __must_check +copy_from_user_inatomic (void *to,const void __user *from,unsigned long n) +{ +if (access_ok (VERIFY_READ , from, n)) +return __copy_from_user_inatomic (to, from, n); +return -EFAULT ; +} +static int submit_lookup_objects (struct msm_gem_submit *submit,struct drm_msm_gem_submit *args,struct drm_file *file) {
@@ -69,6 +77,7 @@ static int submit_lookup_objects(structint ret =0 ;spin_lock (&file->table_lock); +pagefault_disable ();for (i =0 ; i < args->nr_bos; i++) {struct drm_msm_gem_submit_bo submit_bo;
@@ -82,10 +91,15 @@ static int submit_lookup_objects(struct*/ submit->bos[i].flags =0 ; - ret =copy_from_user (&submit_bo, userptr,sizeof (submit_bo)); -if (ret) { - ret = -EFAULT ; - goto out_unlock; + ret =copy_from_user_inatomic (&submit_bo, userptr,sizeof (submit_bo)); +if (unlikely (ret)) { +pagefault_enable (); +spin_unlock (&file->table_lock); + ret =copy_from_user (&submit_bo, userptr,sizeof (submit_bo)); +if (ret) + goto out; +spin_lock (&file->table_lock); +pagefault_disable (); }if (submit_bo.flags & ~MSM_SUBMIT_BO_FLAGS ) {
@@ -125,9 +139,12 @@ static int submit_lookup_objects(struct } out_unlock: - submit->nr_bos = i; +pagefault_enable ();spin_unlock (&file->table_lock); +out: + submit->nr_bos = i; +return ret; }
Patches currently in stable-queue which might be from [email protected] are
queue-4.7/drm-msm-fix-use-of-copy_from_user-while-holding-spinlock.patch