git: 381601cfcb56 - stable/13 - ifnet: make if_alloc_domain() never fail
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Tue, 08 Oct 2024 04:01:56 UTC
The branch stable/13 has been updated by zlei:
URL: https://cgit.FreeBSD.org/src/commit/?id=381601cfcb56a98a14dcbfddb1b2be0ea7a5192c
commit 381601cfcb56a98a14dcbfddb1b2be0ea7a5192c
Author: Gleb Smirnoff <glebius@FreeBSD.org>
AuthorDate: 2021-11-23 03:49:57 +0000
Commit: Zhenlei Huang <zlei@FreeBSD.org>
CommitDate: 2024-10-08 04:00:59 +0000
ifnet: make if_alloc_domain() never fail
The last consumer of if_com_alloc() is firewire. It never fails
to allocate. Most likely the if_com_alloc() KPI will go away
together with if_fwip(), less likely new consumers of if_com_alloc()
will be added, but they would need to follow the no fail KPI.
MFC note: As for stable/13, there is one additional consumer sppp,
which also never fails to allocate. This MFCing is mainly to keep
behavioral compatibility of if_alloc_domain() and its wrappers
if_alloc(), if_alloc_dev(), and if_gethandle() with stable/14 and
onward branches. 3rd party drivers should be ready for this for years
as this behavioral change was done in stable/14 at November 22 2021.
As a good effect new drivers to be MFCed to stable/13 do not have to
conditionally check failure from if_alloc() for stable/13.
(cherry picked from commit 4787572d0580c6fdf818fd64efa3089de88720f0)
---
sys/net/if.c | 22 +++++-----------------
1 file changed, 5 insertions(+), 17 deletions(-)
diff --git a/sys/net/if.c b/sys/net/if.c
index a7aed084143c..78da7cf02bfb 100644
--- a/sys/net/if.c
+++ b/sys/net/if.c
@@ -399,7 +399,7 @@ ifindex_alloc(void **old)
}
static void
-ifindex_free_locked(u_short idx)
+ifindex_free(u_short idx)
{
IFNET_WLOCK_ASSERT();
@@ -410,15 +410,6 @@ ifindex_free_locked(u_short idx)
V_if_index--;
}
-static void
-ifindex_free(u_short idx)
-{
-
- IFNET_WLOCK();
- ifindex_free_locked(idx);
- IFNET_WUNLOCK();
-}
-
static void
ifnet_setbyindex(u_short idx, struct ifnet *ifp)
{
@@ -631,11 +622,8 @@ if_alloc_domain(u_char type, int numa_domain)
#endif
if (if_com_alloc[type] != NULL) {
ifp->if_l2com = if_com_alloc[type](type, ifp);
- if (ifp->if_l2com == NULL) {
- free(ifp, M_IFNET);
- ifindex_free(idx);
- return (NULL);
- }
+ KASSERT(ifp->if_l2com, ("%s: if_com_alloc[%u] failed", __func__,
+ type));
}
IF_ADDR_LOCK_INIT(ifp);
@@ -730,7 +718,7 @@ if_free(struct ifnet *ifp)
KASSERT(ifp == ifnet_byindex(ifp->if_index),
("%s: freeing unallocated ifnet", ifp->if_xname));
- ifindex_free_locked(ifp->if_index);
+ ifindex_free(ifp->if_index);
IFNET_WUNLOCK();
if (refcount_release(&ifp->if_refcount))
@@ -1334,7 +1322,7 @@ if_vmove(struct ifnet *ifp, struct vnet *new_vnet)
* or we'd lock on one vnet and unlock on another.
*/
IFNET_WLOCK();
- ifindex_free_locked(ifp->if_index);
+ ifindex_free(ifp->if_index);
IFNET_WUNLOCK();
/*