@@ -339,6 +339,8 @@ struct sk_filter;
339339 * @sk_txtime_unused: unused txtime flags
340340 * @ns_tracker: tracker for netns reference
341341 * @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().
342344 */
343345struct sock {
344346 /*
@@ -547,6 +549,10 @@ struct sock {
547549 struct rcu_head sk_rcu ;
548550 netns_tracker ns_tracker ;
549551 struct xarray sk_user_frags ;
552+
553+ #if IS_ENABLED (CONFIG_PROVE_LOCKING ) && IS_ENABLED (CONFIG_MODULES )
554+ struct module * sk_owner ;
555+ #endif
550556};
551557
552558struct sock_bh_locked {
@@ -1583,6 +1589,35 @@ static inline void sk_mem_uncharge(struct sock *sk, int size)
15831589 sk_mem_reclaim (sk );
15841590}
15851591
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
15861621/*
15871622 * Macro so as to not evaluate some arguments when
15881623 * lockdep is not enabled.
@@ -1592,13 +1627,14 @@ static inline void sk_mem_uncharge(struct sock *sk, int size)
15921627 */
15931628#define sock_lock_init_class_and_name (sk , sname , skey , name , key ) \
15941629do { \
1630+ sk_owner_set(sk, THIS_MODULE); \
15951631 sk->sk_lock.owned = 0; \
15961632 init_waitqueue_head(&sk->sk_lock.wq); \
15971633 spin_lock_init(&(sk)->sk_lock.slock); \
15981634 debug_check_no_locks_freed((void *)&(sk)->sk_lock, \
1599- sizeof((sk)->sk_lock)); \
1635+ sizeof((sk)->sk_lock)); \
16001636 lockdep_set_class_and_name(&(sk)->sk_lock.slock, \
1601- (skey), (sname)); \
1637+ (skey), (sname)); \
16021638 lockdep_init_map(&(sk)->sk_lock.dep_map, (name), (key), 0); \
16031639} while (0)
16041640
0 commit comments