@@ -353,6 +353,8 @@ struct sk_filter;
353
353
* @sk_txtime_unused: unused txtime flags
354
354
* @ns_tracker: tracker for netns reference
355
355
* @sk_bind2_node: bind node in the bhash2 table
356
+ * @sk_owner: reference to the real owner of the socket that calls
357
+ * sock_lock_init_class_and_name().
356
358
*/
357
359
struct sock {
358
360
/*
@@ -545,6 +547,10 @@ struct sock {
545
547
struct rcu_head sk_rcu ;
546
548
netns_tracker ns_tracker ;
547
549
struct hlist_node sk_bind2_node ;
550
+
551
+ #if IS_ENABLED (CONFIG_PROVE_LOCKING ) && IS_ENABLED (CONFIG_MODULES )
552
+ struct module * sk_owner ;
553
+ #endif
548
554
};
549
555
550
556
enum sk_pacing {
@@ -1699,6 +1705,35 @@ static inline void sk_mem_uncharge(struct sock *sk, int size)
1699
1705
sk_mem_reclaim (sk );
1700
1706
}
1701
1707
1708
+ #if IS_ENABLED (CONFIG_PROVE_LOCKING ) && IS_ENABLED (CONFIG_MODULES )
1709
+ static inline void sk_owner_set (struct sock * sk , struct module * owner )
1710
+ {
1711
+ __module_get (owner );
1712
+ sk -> sk_owner = owner ;
1713
+ }
1714
+
1715
+ static inline void sk_owner_clear (struct sock * sk )
1716
+ {
1717
+ sk -> sk_owner = NULL ;
1718
+ }
1719
+
1720
+ static inline void sk_owner_put (struct sock * sk )
1721
+ {
1722
+ module_put (sk -> sk_owner );
1723
+ }
1724
+ #else
1725
+ static inline void sk_owner_set (struct sock * sk , struct module * owner )
1726
+ {
1727
+ }
1728
+
1729
+ static inline void sk_owner_clear (struct sock * sk )
1730
+ {
1731
+ }
1732
+
1733
+ static inline void sk_owner_put (struct sock * sk )
1734
+ {
1735
+ }
1736
+ #endif
1702
1737
/*
1703
1738
* Macro so as to not evaluate some arguments when
1704
1739
* lockdep is not enabled.
@@ -1708,13 +1743,14 @@ static inline void sk_mem_uncharge(struct sock *sk, int size)
1708
1743
*/
1709
1744
#define sock_lock_init_class_and_name (sk , sname , skey , name , key ) \
1710
1745
do { \
1746
+ sk_owner_set(sk, THIS_MODULE); \
1711
1747
sk->sk_lock.owned = 0; \
1712
1748
init_waitqueue_head(&sk->sk_lock.wq); \
1713
1749
spin_lock_init(&(sk)->sk_lock.slock); \
1714
1750
debug_check_no_locks_freed((void *)&(sk)->sk_lock, \
1715
- sizeof((sk)->sk_lock)); \
1751
+ sizeof((sk)->sk_lock)); \
1716
1752
lockdep_set_class_and_name(&(sk)->sk_lock.slock, \
1717
- (skey), (sname)); \
1753
+ (skey), (sname)); \
1718
1754
lockdep_init_map(&(sk)->sk_lock.dep_map, (name), (key), 0); \
1719
1755
} while (0)
1720
1756
0 commit comments