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