@@ -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 {
@@ -1592,6 +1598,35 @@ static inline void sk_mem_uncharge(struct sock *sk, int size)
15921598 sk_mem_reclaim (sk );
15931599}
15941600
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
15951630/*
15961631 * Macro so as to not evaluate some arguments when
15971632 * lockdep is not enabled.
@@ -1601,13 +1636,14 @@ static inline void sk_mem_uncharge(struct sock *sk, int size)
16011636 */
16021637#define sock_lock_init_class_and_name (sk , sname , skey , name , key ) \
16031638do { \
1639+ sk_owner_set(sk, THIS_MODULE); \
16041640 sk->sk_lock.owned = 0; \
16051641 init_waitqueue_head(&sk->sk_lock.wq); \
16061642 spin_lock_init(&(sk)->sk_lock.slock); \
16071643 debug_check_no_locks_freed((void *)&(sk)->sk_lock, \
1608- sizeof((sk)->sk_lock)); \
1644+ sizeof((sk)->sk_lock)); \
16091645 lockdep_set_class_and_name(&(sk)->sk_lock.slock, \
1610- (skey), (sname)); \
1646+ (skey), (sname)); \
16111647 lockdep_init_map(&(sk)->sk_lock.dep_map, (name), (key), 0); \
16121648} while (0)
16131649
0 commit comments