@@ -339,6 +339,8 @@ struct sk_filter;
339
339
* @sk_txtime_unused: unused txtime flags
340
340
* @ns_tracker: tracker for netns reference
341
341
* @sk_user_frags: xarray of pages the user is holding a reference on.
342
+ * @sk_owner: reference to the real owner of the socket that calls
343
+ * sock_lock_init_class_and_name().
342
344
*/
343
345
struct sock {
344
346
/*
@@ -547,6 +549,10 @@ struct sock {
547
549
struct rcu_head sk_rcu ;
548
550
netns_tracker ns_tracker ;
549
551
struct xarray sk_user_frags ;
552
+
553
+ #if IS_ENABLED (CONFIG_PROVE_LOCKING ) && IS_ENABLED (CONFIG_MODULES )
554
+ struct module * sk_owner ;
555
+ #endif
550
556
};
551
557
552
558
struct sock_bh_locked {
@@ -1583,6 +1589,35 @@ static inline void sk_mem_uncharge(struct sock *sk, int size)
1583
1589
sk_mem_reclaim (sk );
1584
1590
}
1585
1591
1592
+ #if IS_ENABLED (CONFIG_PROVE_LOCKING ) && IS_ENABLED (CONFIG_MODULES )
1593
+ static inline void sk_owner_set (struct sock * sk , struct module * owner )
1594
+ {
1595
+ __module_get (owner );
1596
+ sk -> sk_owner = owner ;
1597
+ }
1598
+
1599
+ static inline void sk_owner_clear (struct sock * sk )
1600
+ {
1601
+ sk -> sk_owner = NULL ;
1602
+ }
1603
+
1604
+ static inline void sk_owner_put (struct sock * sk )
1605
+ {
1606
+ module_put (sk -> sk_owner );
1607
+ }
1608
+ #else
1609
+ static inline void sk_owner_set (struct sock * sk , struct module * owner )
1610
+ {
1611
+ }
1612
+
1613
+ static inline void sk_owner_clear (struct sock * sk )
1614
+ {
1615
+ }
1616
+
1617
+ static inline void sk_owner_put (struct sock * sk )
1618
+ {
1619
+ }
1620
+ #endif
1586
1621
/*
1587
1622
* Macro so as to not evaluate some arguments when
1588
1623
* lockdep is not enabled.
@@ -1592,13 +1627,14 @@ static inline void sk_mem_uncharge(struct sock *sk, int size)
1592
1627
*/
1593
1628
#define sock_lock_init_class_and_name (sk , sname , skey , name , key ) \
1594
1629
do { \
1630
+ sk_owner_set(sk, THIS_MODULE); \
1595
1631
sk->sk_lock.owned = 0; \
1596
1632
init_waitqueue_head(&sk->sk_lock.wq); \
1597
1633
spin_lock_init(&(sk)->sk_lock.slock); \
1598
1634
debug_check_no_locks_freed((void *)&(sk)->sk_lock, \
1599
- sizeof((sk)->sk_lock)); \
1635
+ sizeof((sk)->sk_lock)); \
1600
1636
lockdep_set_class_and_name(&(sk)->sk_lock.slock, \
1601
- (skey), (sname)); \
1637
+ (skey), (sname)); \
1602
1638
lockdep_init_map(&(sk)->sk_lock.dep_map, (name), (key), 0); \
1603
1639
} while (0)
1604
1640
0 commit comments