svn commit: r256519 - in head/sys: net netatalk netinet netinet6 netipx
Gleb Smirnoff
glebius at FreeBSD.org
Tue Oct 15 10:31:44 UTC 2013
Author: glebius
Date: Tue Oct 15 10:31:42 2013
New Revision: 256519
URL: http://svnweb.freebsd.org/changeset/base/256519
Log:
Remove ifa_init() and provide ifa_alloc() that will allocate and setup
struct ifaddr internally.
Sponsored by: Netflix
Sponsored by: Nginx, Inc.
Modified:
head/sys/net/if.c
head/sys/net/if_var.h
head/sys/netatalk/at_control.c
head/sys/netinet/in.c
head/sys/netinet6/in6.c
head/sys/netipx/ipx.c
Modified: head/sys/net/if.c
==============================================================================
--- head/sys/net/if.c Tue Oct 15 10:19:24 2013 (r256518)
+++ head/sys/net/if.c Tue Oct 15 10:31:42 2013 (r256519)
@@ -633,8 +633,7 @@ if_attach_internal(struct ifnet *ifp, in
socksize = sizeof(*sdl);
socksize = roundup2(socksize, sizeof(long));
ifasize = sizeof(*ifa) + 2 * socksize;
- ifa = malloc(ifasize, M_IFADDR, M_WAITOK | M_ZERO);
- ifa_init(ifa);
+ ifa = ifa_alloc(ifasize, M_WAITOK);
sdl = (struct sockaddr_dl *)(ifa + 1);
sdl->sdl_len = socksize;
sdl->sdl_family = AF_LINK;
@@ -1417,13 +1416,23 @@ if_maddr_runlock(struct ifnet *ifp)
/*
* Initialization, destruction and refcounting functions for ifaddrs.
*/
-void
-ifa_init(struct ifaddr *ifa)
+struct ifaddr *
+ifa_alloc(size_t size, int flags)
{
+ struct ifaddr *ifa;
+
+ KASSERT(size >= sizeof(struct ifaddr),
+ ("%s: invalid size %zu", __func__, size));
+
+ ifa = malloc(size, M_IFADDR, M_ZERO | flags);
+ if (ifa == NULL)
+ return (NULL);
mtx_init(&ifa->ifa_mtx, "ifaddr", NULL, MTX_DEF);
refcount_init(&ifa->ifa_refcnt, 1);
ifa->if_data.ifi_datalen = sizeof(ifa->if_data);
+
+ return (ifa);
}
void
Modified: head/sys/net/if_var.h
==============================================================================
--- head/sys/net/if_var.h Tue Oct 15 10:19:24 2013 (r256518)
+++ head/sys/net/if_var.h Tue Oct 15 10:31:42 2013 (r256519)
@@ -819,8 +819,8 @@ struct ifaddr {
#define IFA_LOCK(ifa) mtx_lock(&(ifa)->ifa_mtx)
#define IFA_UNLOCK(ifa) mtx_unlock(&(ifa)->ifa_mtx)
+struct ifaddr * ifa_alloc(size_t size, int flags);
void ifa_free(struct ifaddr *ifa);
-void ifa_init(struct ifaddr *ifa);
void ifa_ref(struct ifaddr *ifa);
#endif
Modified: head/sys/netatalk/at_control.c
==============================================================================
--- head/sys/netatalk/at_control.c Tue Oct 15 10:19:24 2013 (r256518)
+++ head/sys/netatalk/at_control.c Tue Oct 15 10:31:42 2013 (r256519)
@@ -199,16 +199,10 @@ at_control(struct socket *so, u_long cmd
* allocate a fresh one.
*/
if (aa == NULL) {
- aa = malloc(sizeof(struct at_ifaddr), M_IFADDR,
- M_NOWAIT | M_ZERO);
- if (aa == NULL) {
- error = ENOBUFS;
- goto out;
- }
- callout_init(&aa->aa_callout, CALLOUT_MPSAFE);
+ ifa = ifa_alloc(sizeof(struct at_ifaddr), M_WAITOK);
+ aa = (struct at_ifaddr *)ifa;
- ifa = (struct ifaddr *)aa;
- ifa_init(ifa);
+ callout_init(&aa->aa_callout, CALLOUT_MPSAFE);
/*
* As the at_ifaddr contains the actual sockaddrs,
Modified: head/sys/netinet/in.c
==============================================================================
--- head/sys/netinet/in.c Tue Oct 15 10:19:24 2013 (r256518)
+++ head/sys/netinet/in.c Tue Oct 15 10:31:42 2013 (r256519)
@@ -404,16 +404,8 @@ in_control(struct socket *so, u_long cmd
goto out;
}
if (ia == NULL) {
- ia = (struct in_ifaddr *)
- malloc(sizeof *ia, M_IFADDR, M_NOWAIT |
- M_ZERO);
- if (ia == NULL) {
- error = ENOBUFS;
- goto out;
- }
-
- ifa = &ia->ia_ifa;
- ifa_init(ifa);
+ ifa = ifa_alloc(sizeof(struct in_ifaddr), M_WAITOK);
+ ia = (struct in_ifaddr *)ifa;
ifa->ifa_addr = (struct sockaddr *)&ia->ia_addr;
ifa->ifa_dstaddr = (struct sockaddr *)&ia->ia_dstaddr;
ifa->ifa_netmask = (struct sockaddr *)&ia->ia_sockmask;
Modified: head/sys/netinet6/in6.c
==============================================================================
--- head/sys/netinet6/in6.c Tue Oct 15 10:19:24 2013 (r256518)
+++ head/sys/netinet6/in6.c Tue Oct 15 10:31:42 2013 (r256519)
@@ -1141,12 +1141,9 @@ in6_update_ifa(struct ifnet *ifp, struct
* RA, it is called under an interrupt context. So, we should
* call malloc with M_NOWAIT.
*/
- ia = (struct in6_ifaddr *) malloc(sizeof(*ia), M_IFADDR,
- M_NOWAIT);
+ ia = (struct in6_ifaddr *)ifa_alloc(sizeof(*ia), M_NOWAIT);
if (ia == NULL)
return (ENOBUFS);
- bzero((caddr_t)ia, sizeof(*ia));
- ifa_init(&ia->ia_ifa);
LIST_INIT(&ia->ia6_memberships);
/* Initialize the address and masks, and put time stamp */
ia->ia_ifa.ifa_addr = (struct sockaddr *)&ia->ia_addr;
Modified: head/sys/netipx/ipx.c
==============================================================================
--- head/sys/netipx/ipx.c Tue Oct 15 10:19:24 2013 (r256518)
+++ head/sys/netipx/ipx.c Tue Oct 15 10:31:42 2013 (r256519)
@@ -190,13 +190,8 @@ ipx_control(struct socket *so, u_long cm
if (td && (error = priv_check(td, PRIV_NET_SETLLADDR)) != 0)
goto out;
if (ia == NULL) {
- ia = malloc(sizeof(*ia), M_IFADDR, M_NOWAIT | M_ZERO);
- if (ia == NULL) {
- error = ENOBUFS;
- goto out;
- }
- ifa = (struct ifaddr *)ia;
- ifa_init(ifa);
+ ifa = ifa_alloc(sizeof(struct ipx_ifaddr), M_WAITOK);
+ ia = (struct ipx_ifaddr *)ifa;
ia->ia_ifp = ifp;
ifa->ifa_addr = (struct sockaddr *)&ia->ia_addr;
ifa->ifa_netmask = (struct sockaddr *)&ipx_netmask;
More information about the svn-src-all
mailing list