> 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);
> 
> 

Reply via email to