Patch "drm/msm: fix use of copy_from_user() while holding spinlock" has been added to the 4.4-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.4-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.4 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
@@ -55,6 +55,14 @@ static struct msm_gem_submit *submit_crereturn 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) {
@@ -62,6 +70,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;
@@ -70,10 +79,15 @@ static int submit_lookup_objects(structvoid __user *userptr =to_user_ptr (args->bos + (i *sizeof (submit_bo))); - 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 ) {
@@ -113,9 +127,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.4/drm-msm-fix-use-of-copy_from_user-while-holding-spinlock.patch