@@ -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 {
@@ -1592,6 +1598,35 @@ static inline void sk_mem_uncharge(struct sock *sk, int size)
1592
1598
sk_mem_reclaim (sk );
1593
1599
}
1594
1600
1601
+ #if IS_ENABLED (CONFIG_PROVE_LOCKING ) && IS_ENABLED (CONFIG_MODULES )
1602
+ static inline void sk_owner_set (struct sock * sk , struct module * owner )
1603
+ {
1604
+ __module_get (owner );
1605
+ sk -> sk_owner = owner ;
1606
+ }
1607
+
1608
+ static inline void sk_owner_clear (struct sock * sk )
1609
+ {
1610
+ sk -> sk_owner = NULL ;
1611
+ }
1612
+
1613
+ static inline void sk_owner_put (struct sock * sk )
1614
+ {
1615
+ module_put (sk -> sk_owner );
1616
+ }
1617
+ #else
1618
+ static inline void sk_owner_set (struct sock * sk , struct module * owner )
1619
+ {
1620
+ }
1621
+
1622
+ static inline void sk_owner_clear (struct sock * sk )
1623
+ {
1624
+ }
1625
+
1626
+ static inline void sk_owner_put (struct sock * sk )
1627
+ {
1628
+ }
1629
+ #endif
1595
1630
/*
1596
1631
* Macro so as to not evaluate some arguments when
1597
1632
* lockdep is not enabled.
@@ -1601,13 +1636,14 @@ static inline void sk_mem_uncharge(struct sock *sk, int size)
1601
1636
*/
1602
1637
#define sock_lock_init_class_and_name (sk , sname , skey , name , key ) \
1603
1638
do { \
1639
+ sk_owner_set(sk, THIS_MODULE); \
1604
1640
sk->sk_lock.owned = 0; \
1605
1641
init_waitqueue_head(&sk->sk_lock.wq); \
1606
1642
spin_lock_init(&(sk)->sk_lock.slock); \
1607
1643
debug_check_no_locks_freed((void *)&(sk)->sk_lock, \
1608
- sizeof((sk)->sk_lock)); \
1644
+ sizeof((sk)->sk_lock)); \
1609
1645
lockdep_set_class_and_name(&(sk)->sk_lock.slock, \
1610
- (skey), (sname)); \
1646
+ (skey), (sname)); \
1611
1647
lockdep_init_map(&(sk)->sk_lock.dep_map, (name), (key), 0); \
1612
1648
} while (0)
1613
1649
0 commit comments