@@ -350,6 +350,8 @@ struct sk_filter;
350
350
* @sk_txtime_unused: unused txtime flags
351
351
* @ns_tracker: tracker for netns reference
352
352
* @sk_bind2_node: bind node in the bhash2 table
353
+ * @sk_owner: reference to the real owner of the socket that calls
354
+ * sock_lock_init_class_and_name().
353
355
*/
354
356
struct sock {
355
357
/*
@@ -541,6 +543,10 @@ struct sock {
541
543
struct rcu_head sk_rcu ;
542
544
netns_tracker ns_tracker ;
543
545
struct hlist_node sk_bind2_node ;
546
+
547
+ #if IS_ENABLED (CONFIG_PROVE_LOCKING ) && IS_ENABLED (CONFIG_MODULES )
548
+ struct module * sk_owner ;
549
+ #endif
544
550
};
545
551
546
552
enum sk_pacing {
@@ -1724,6 +1730,35 @@ static inline void sk_mem_uncharge(struct sock *sk, int size)
1724
1730
sk_mem_reclaim (sk );
1725
1731
}
1726
1732
1733
+ #if IS_ENABLED (CONFIG_PROVE_LOCKING ) && IS_ENABLED (CONFIG_MODULES )
1734
+ static inline void sk_owner_set (struct sock * sk , struct module * owner )
1735
+ {
1736
+ __module_get (owner );
1737
+ sk -> sk_owner = owner ;
1738
+ }
1739
+
1740
+ static inline void sk_owner_clear (struct sock * sk )
1741
+ {
1742
+ sk -> sk_owner = NULL ;
1743
+ }
1744
+
1745
+ static inline void sk_owner_put (struct sock * sk )
1746
+ {
1747
+ module_put (sk -> sk_owner );
1748
+ }
1749
+ #else
1750
+ static inline void sk_owner_set (struct sock * sk , struct module * owner )
1751
+ {
1752
+ }
1753
+
1754
+ static inline void sk_owner_clear (struct sock * sk )
1755
+ {
1756
+ }
1757
+
1758
+ static inline void sk_owner_put (struct sock * sk )
1759
+ {
1760
+ }
1761
+ #endif
1727
1762
/*
1728
1763
* Macro so as to not evaluate some arguments when
1729
1764
* lockdep is not enabled.
@@ -1733,13 +1768,14 @@ static inline void sk_mem_uncharge(struct sock *sk, int size)
1733
1768
*/
1734
1769
#define sock_lock_init_class_and_name (sk , sname , skey , name , key ) \
1735
1770
do { \
1771
+ sk_owner_set(sk, THIS_MODULE); \
1736
1772
sk->sk_lock.owned = 0; \
1737
1773
init_waitqueue_head(&sk->sk_lock.wq); \
1738
1774
spin_lock_init(&(sk)->sk_lock.slock); \
1739
1775
debug_check_no_locks_freed((void *)&(sk)->sk_lock, \
1740
- sizeof((sk)->sk_lock)); \
1776
+ sizeof((sk)->sk_lock)); \
1741
1777
lockdep_set_class_and_name(&(sk)->sk_lock.slock, \
1742
- (skey), (sname)); \
1778
+ (skey), (sname)); \
1743
1779
lockdep_init_map(&(sk)->sk_lock.dep_map, (name), (key), 0); \
1744
1780
} while (0)
1745
1781
0 commit comments