> Date: Mon, 15 Dec 2014 23:44:54 -0500
> From: Lawrence Teo <[email protected]>
>
> Make divert_output() do an m_pullup only if truly needed.
>
> ok?
Questionable. AFAIK m_pullup(9) will only do the pullup if it is
necesary in the first place. Is there a measurable speedup from
inlining the check?
> Index: netinet/ip_divert.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet/ip_divert.c,v
> retrieving revision 1.31
> diff -u -p -r1.31 ip_divert.c
> --- netinet/ip_divert.c 5 Dec 2014 15:50:04 -0000 1.31
> +++ netinet/ip_divert.c 13 Dec 2014 04:32:23 -0000
> @@ -101,7 +101,8 @@ divert_output(struct inpcb *inp, struct
> /* Do basic sanity checks. */
> if (m->m_pkthdr.len < sizeof(struct ip))
> goto fail;
> - if ((m = m_pullup(m, sizeof(struct ip))) == NULL) {
> + if (m->m_len < sizeof(struct ip) &&
> + (m = m_pullup(m, sizeof(struct ip))) == NULL) {
> /* m_pullup() has freed the mbuf, so just return. */
> divstat.divs_errors++;
> return (ENOBUFS);
> Index: netinet6/ip6_divert.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet6/ip6_divert.c,v
> retrieving revision 1.31
> diff -u -p -r1.31 ip6_divert.c
> --- netinet6/ip6_divert.c 5 Dec 2014 15:50:04 -0000 1.31
> +++ netinet6/ip6_divert.c 13 Dec 2014 04:32:24 -0000
> @@ -104,7 +104,8 @@ divert6_output(struct inpcb *inp, struct
> /* Do basic sanity checks. */
> if (m->m_pkthdr.len < sizeof(struct ip6_hdr))
> goto fail;
> - if ((m = m_pullup(m, sizeof(struct ip6_hdr))) == NULL) {
> + if (m->m_len < sizeof(struct ip6_hdr) &&
> + (m = m_pullup(m, sizeof(struct ip6_hdr))) == NULL) {
> /* m_pullup() has freed the mbuf, so just return. */
> div6stat.divs_errors++;
> return (ENOBUFS);
>
>