@@ -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 {
@@ -1585,6 +1591,35 @@ static inline void sk_mem_uncharge(struct sock *sk, int size)
15851591 sk_mem_reclaim (sk );
15861592}
15871593
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
15881623/*
15891624 * Macro so as to not evaluate some arguments when
15901625 * lockdep is not enabled.
@@ -1594,13 +1629,14 @@ static inline void sk_mem_uncharge(struct sock *sk, int size)
15941629 */
15951630#define sock_lock_init_class_and_name (sk , sname , skey , name , key ) \
15961631do { \
1632+ sk_owner_set(sk, THIS_MODULE); \
15971633 sk->sk_lock.owned = 0; \
15981634 init_waitqueue_head(&sk->sk_lock.wq); \
15991635 spin_lock_init(&(sk)->sk_lock.slock); \
16001636 debug_check_no_locks_freed((void *)&(sk)->sk_lock, \
1601- sizeof((sk)->sk_lock)); \
1637+ sizeof((sk)->sk_lock)); \
16021638 lockdep_set_class_and_name(&(sk)->sk_lock.slock, \
1603- (skey), (sname)); \
1639+ (skey), (sname)); \
16041640 lockdep_init_map(&(sk)->sk_lock.dep_map, (name), (key), 0); \
16051641} while (0)
16061642
0 commit comments