@@ -338,6 +338,8 @@ struct sk_filter;
338338 * @sk_txtime_unused: unused txtime flags
339339 * @ns_tracker: tracker for netns reference
340340 * @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().
341343 */
342344struct sock {
343345 /*
@@ -544,6 +546,10 @@ struct sock {
544546 struct rcu_head sk_rcu ;
545547 netns_tracker ns_tracker ;
546548 struct xarray sk_user_frags ;
549+
550+ #if IS_ENABLED (CONFIG_PROVE_LOCKING ) && IS_ENABLED (CONFIG_MODULES )
551+ struct module * sk_owner ;
552+ #endif
547553};
548554
549555struct sock_bh_locked {
@@ -1591,6 +1597,35 @@ static inline void sk_mem_uncharge(struct sock *sk, int size)
15911597 sk_mem_reclaim (sk );
15921598}
15931599
1600+ #if IS_ENABLED (CONFIG_PROVE_LOCKING ) && IS_ENABLED (CONFIG_MODULES )
1601+ static inline void sk_owner_set (struct sock * sk , struct module * owner )
1602+ {
1603+ __module_get (owner );
1604+ sk -> sk_owner = owner ;
1605+ }
1606+
1607+ static inline void sk_owner_clear (struct sock * sk )
1608+ {
1609+ sk -> sk_owner = NULL ;
1610+ }
1611+
1612+ static inline void sk_owner_put (struct sock * sk )
1613+ {
1614+ module_put (sk -> sk_owner );
1615+ }
1616+ #else
1617+ static inline void sk_owner_set (struct sock * sk , struct module * owner )
1618+ {
1619+ }
1620+
1621+ static inline void sk_owner_clear (struct sock * sk )
1622+ {
1623+ }
1624+
1625+ static inline void sk_owner_put (struct sock * sk )
1626+ {
1627+ }
1628+ #endif
15941629/*
15951630 * Macro so as to not evaluate some arguments when
15961631 * lockdep is not enabled.
@@ -1600,13 +1635,14 @@ static inline void sk_mem_uncharge(struct sock *sk, int size)
16001635 */
16011636#define sock_lock_init_class_and_name (sk , sname , skey , name , key ) \
16021637do { \
1638+ sk_owner_set(sk, THIS_MODULE); \
16031639 sk->sk_lock.owned = 0; \
16041640 init_waitqueue_head(&sk->sk_lock.wq); \
16051641 spin_lock_init(&(sk)->sk_lock.slock); \
16061642 debug_check_no_locks_freed((void *)&(sk)->sk_lock, \
1607- sizeof((sk)->sk_lock)); \
1643+ sizeof((sk)->sk_lock)); \
16081644 lockdep_set_class_and_name(&(sk)->sk_lock.slock, \
1609- (skey), (sname)); \
1645+ (skey), (sname)); \
16101646 lockdep_init_map(&(sk)->sk_lock.dep_map, (name), (key), 0); \
16111647} while (0)
16121648
0 commit comments