git: f9fa2908cfac - stable/13 - LinuxKPI: avoid userret: Returning with with pinned thread

Bjoern A. Zeeb bz at FreeBSD.org
Sun Jul 18 00:37:00 UTC 2021


The branch stable/13 has been updated by bz:

URL: https://cgit.FreeBSD.org/src/commit/?id=f9fa2908cfac967e15c94c8fe4d8cc36e4a0d842

commit f9fa2908cfac967e15c94c8fe4d8cc36e4a0d842
Author:     Bjoern A. Zeeb <bz at FreeBSD.org>
AuthorDate: 2021-06-09 18:53:16 +0000
Commit:     Bjoern A. Zeeb <bz at FreeBSD.org>
CommitDate: 2021-07-18 00:35:04 +0000

    LinuxKPI: avoid userret: Returning with with pinned thread
    
    Some code manually calls local_bh_disable() and spin_lock() but
    then calls spin_unlock_bh() (or vice versa).
    Our code then calls local_bh_disable() again from spin_lock()
    which means we have the thread pin count increased twice and that
    means we get out of synch and are still pinned when returning to
    user space.
    
    Avoid this by adding the explicit local_bh_{enable,disable}() to
    the spin_[un]lock_bh() versions.
    
    Sponsored by:   The FreeBSD Foundation
    Reviewed by:    hselasky
    Differential Revision: https://reviews.freebsd.org/D30711
    
    (cherry picked from commit 46ae23a4024b792c44a2b6c5f80429c40dac120b)
---
 sys/compat/linuxkpi/common/include/linux/spinlock.h | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/sys/compat/linuxkpi/common/include/linux/spinlock.h b/sys/compat/linuxkpi/common/include/linux/spinlock.h
index 83f45b1a2a40..ca51fd23434c 100644
--- a/sys/compat/linuxkpi/common/include/linux/spinlock.h
+++ b/sys/compat/linuxkpi/common/include/linux/spinlock.h
@@ -66,6 +66,7 @@ typedef struct {
 
 #define	spin_lock_bh(_l) do {			\
 	spin_lock(_l);				\
+	local_bh_disable();			\
 } while (0)
 
 #define	spin_lock_irq(_l) do {			\
@@ -80,6 +81,7 @@ typedef struct {
 } while (0)
 
 #define	spin_unlock_bh(_l) do {			\
+	local_bh_enable();			\
 	spin_unlock(_l);			\
 } while (0)
 


More information about the dev-commits-src-all mailing list