aboutsummaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorAlexander V. Chernikov <melifaro@FreeBSD.org>2014-04-29 19:48:11 +0000
committerAlexander V. Chernikov <melifaro@FreeBSD.org>2014-04-29 19:48:11 +0000
commitd9437c0f467b75af5eaaf8a3dfc9b9ad00e0e26a (patch)
treeedbcf7bb1af1683f80f96291c78aabf711c29dee /sys
parent0fb9298db94b5748098de2895abff4588dafb5a0 (diff)
downloadsrc-d9437c0f467b75af5eaaf8a3dfc9b9ad00e0e26a.tar.gz
src-d9437c0f467b75af5eaaf8a3dfc9b9ad00e0e26a.zip
Partially revert r265019 - allocating 512 bytes on stack
can be too much for architectures like ARM. Always use rounded malloc instead. Discussed with: jmallett MFC after: 4 weeks
Notes
Notes: svn path=/head/; revision=265104
Diffstat (limited to 'sys')
-rw-r--r--sys/net/rtsock.c27
1 files changed, 8 insertions, 19 deletions
diff --git a/sys/net/rtsock.c b/sys/net/rtsock.c
index 64d28ca9af1a..69abdb4b1e10 100644
--- a/sys/net/rtsock.c
+++ b/sys/net/rtsock.c
@@ -531,7 +531,6 @@ route_output(struct mbuf *m, struct socket *so)
sa_family_t saf = AF_UNSPEC;
struct rawcb *rp = NULL;
struct walkarg w;
- char msgbuf[512];
fibnum = so->so_fibnum;
@@ -548,20 +547,12 @@ route_output(struct mbuf *m, struct socket *so)
/*
* Most of current messages are in range 200-240 bytes,
- * minimize possible failures by using on-stack buffer
- * which should fit for most messages.
- * However, use stable memory if we need to handle
- * something large.
+ * minimize possible re-allocation on reply using larger size
+ * buffer aligned on 1k boundaty.
*/
- if (len < sizeof(msgbuf)) {
- alloc_len = sizeof(msgbuf);
- rtm = (struct rt_msghdr *)msgbuf;
- } else {
- alloc_len = roundup2(len, 1024);
- rtm = malloc(alloc_len, M_TEMP, M_NOWAIT);
- if (rtm == NULL)
- senderr(ENOBUFS);
- }
+ alloc_len = roundup2(len, 1024);
+ if ((rtm = malloc(alloc_len, M_TEMP, M_NOWAIT)) == NULL)
+ senderr(ENOBUFS);
m_copydata(m, 0, len, (caddr_t)rtm);
bzero(&info, sizeof(info));
@@ -569,8 +560,7 @@ route_output(struct mbuf *m, struct socket *so)
if (rtm->rtm_version != RTM_VERSION) {
/* Do not touch message since format is unknown */
- if ((char *)rtm != msgbuf)
- free(rtm, M_TEMP);
+ free(rtm, M_TEMP);
rtm = NULL;
senderr(EPROTONOSUPPORT);
}
@@ -861,7 +851,7 @@ flush:
*/
if ((so->so_options & SO_USELOOPBACK) == 0) {
if (V_route_cb.any_count <= 1) {
- if (rtm != NULL && (char *)rtm != msgbuf)
+ if (rtm != NULL)
free(rtm, M_TEMP);
m_freem(m);
return (error);
@@ -899,8 +889,7 @@ flush:
} else if (m->m_pkthdr.len > rtm->rtm_msglen)
m_adj(m, rtm->rtm_msglen - m->m_pkthdr.len);
- if ((char *)rtm != msgbuf)
- free(rtm, M_TEMP);
+ free(rtm, M_TEMP);
}
if (m != NULL) {
M_SETFIB(m, fibnum);