svn commit: r368552 - stable/12/sys/net

Kristof Provost kp at FreeBSD.org
Fri Dec 11 14:11:42 UTC 2020


Author: kp
Date: Fri Dec 11 14:11:41 2020
New Revision: 368552
URL: https://svnweb.freebsd.org/changeset/base/368552

Log:
  MFC r368015:
  
  if: Remove ifnet_rwlock
  
  It no longer serves any purpose, as evidenced by the fact that we never take it
  without ifnet_sxlock.
  
  This differs slightly from r368015 in that we keep the ifnet_rwlock instance
  (but no longer take the lock) in case there are external users who still take
  the lock.
  
  Sponsored by:	Modirum MDPay

Modified:
  stable/12/sys/net/if.c
  stable/12/sys/net/if_var.h
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/sys/net/if.c
==============================================================================
--- stable/12/sys/net/if.c	Fri Dec 11 13:23:59 2020	(r368551)
+++ stable/12/sys/net/if.c	Fri Dec 11 14:11:41 2020	(r368552)
@@ -305,12 +305,8 @@ VNET_DEFINE(struct ifnet **, ifindex_table);
 
 /*
  * The global network interface list (V_ifnet) and related state (such as
- * if_index, if_indexlim, and ifindex_table) are protected by an sxlock and
- * an rwlock.  Either may be acquired shared to stablize the list, but both
- * must be acquired writable to modify the list.  This model allows us to
- * both stablize the interface list during interrupt thread processing, but
- * also to stablize it over long-running ioctls, without introducing priority
- * inversions and deadlocks.
+ * if_index, if_indexlim, and ifindex_table) are protected by an sxlock.
+ * This may be acquired to stabilise the list, or we may rely on NET_EPOCH.
  */
 struct rwlock ifnet_rwlock;
 RW_SYSINIT_FLAGS(ifnet_rw, &ifnet_rwlock, "ifnet_rw", RW_RECURSE);

Modified: stable/12/sys/net/if_var.h
==============================================================================
--- stable/12/sys/net/if_var.h	Fri Dec 11 13:23:59 2020	(r368551)
+++ stable/12/sys/net/if_var.h	Fri Dec 11 14:11:41 2020	(r368552)
@@ -569,27 +569,11 @@ struct ifmultiaddr {
 extern	struct rwlock ifnet_rwlock;
 extern	struct sx ifnet_sxlock;
 
-#define	IFNET_WLOCK() do {						\
-	sx_xlock(&ifnet_sxlock);					\
-	rw_wlock(&ifnet_rwlock);					\
-} while (0)
-
-#define	IFNET_WUNLOCK() do {						\
-	rw_wunlock(&ifnet_rwlock);					\
-	sx_xunlock(&ifnet_sxlock);					\
-} while (0)
-
-/*
- * To assert the ifnet lock, you must know not only whether it's for read or
- * write, but also whether it was acquired with sleep support or not.
- */
-#define	IFNET_RLOCK_ASSERT()		sx_assert(&ifnet_sxlock, SA_SLOCKED)
+#define	IFNET_WLOCK()		sx_xlock(&ifnet_sxlock)
+#define	IFNET_WUNLOCK()		sx_xunlock(&ifnet_sxlock)
+#define	IFNET_RLOCK_ASSERT()	sx_assert(&ifnet_sxlock, SA_SLOCKED)
 #define	IFNET_RLOCK_NOSLEEP_ASSERT()	MPASS(in_epoch(net_epoch_preempt))
-#define	IFNET_WLOCK_ASSERT() do {					\
-	sx_assert(&ifnet_sxlock, SA_XLOCKED);				\
-	rw_assert(&ifnet_rwlock, RA_WLOCKED);				\
-} while (0)
-
+#define	IFNET_WLOCK_ASSERT()	sx_assert(&ifnet_sxlock, SA_XLOCKED)
 #define	IFNET_RLOCK()		sx_slock(&ifnet_sxlock)
 #define	IFNET_RLOCK_NOSLEEP()	struct epoch_tracker ifnet_rlock_et; epoch_enter_preempt(net_epoch_preempt, &ifnet_rlock_et)
 #define	IFNET_RUNLOCK()		sx_sunlock(&ifnet_sxlock)


More information about the svn-src-all mailing list