Date: Sun, 18 Jan 2009 21:09:34 +0000 (UTC) From: Alexander Motin <mav@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r187410 - head/sys/netgraph Message-ID: <200901182109.n0IL9YHY087255@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: mav Date: Sun Jan 18 21:09:34 2009 New Revision: 187410 URL: http://svn.freebsd.org/changeset/base/187410 Log: If source mbuf chain consists of only one mbuf, use it directly as source buffer to avoid extra copying. Modified: head/sys/netgraph/ng_mppc.c Modified: head/sys/netgraph/ng_mppc.c ============================================================================== --- head/sys/netgraph/ng_mppc.c Sun Jan 18 20:19:55 2009 (r187409) +++ head/sys/netgraph/ng_mppc.c Sun Jan 18 21:09:34 2009 (r187410) @@ -489,22 +489,29 @@ ng_mppc_compress(node_p node, struct mbu if ((d->cfg.bits & MPPC_BIT) != 0) { u_short flags = MPPC_MANDATORY_COMPRESS_FLAGS; u_char *inbuf, *outbuf; - int outlen, inlen; + int outlen, inlen, ina; u_char *source, *dest; u_long sourceCnt, destCnt; int rtn; /* Work with contiguous regions of memory. */ inlen = m->m_pkthdr.len; - inbuf = malloc(inlen, M_NETGRAPH_MPPC, M_NOWAIT); - if (inbuf == NULL) - goto err1; - m_copydata(m, 0, inlen, (caddr_t)inbuf); + if (m->m_next == NULL) { + inbuf = mtod(m, u_char *); + ina = 0; + } else { + inbuf = malloc(inlen, M_NETGRAPH_MPPC, M_NOWAIT); + if (inbuf == NULL) + goto err1; + m_copydata(m, 0, inlen, (caddr_t)inbuf); + ina = 1; + } outlen = MPPC_MAX_BLOWUP(inlen); outbuf = malloc(outlen, M_NETGRAPH_MPPC, M_NOWAIT); if (outbuf == NULL) { - free(inbuf, M_NETGRAPH_MPPC); + if (ina) + free(inbuf, M_NETGRAPH_MPPC); err1: m_freem(m); MPPC_InitCompressionHistory(d->history); @@ -544,7 +551,8 @@ err1: d->flushed = (rtn & MPPC_EXPANDED) != 0 || (flags & MPPC_SAVE_HISTORY) == 0; - free(inbuf, M_NETGRAPH_MPPC); + if (ina) + free(inbuf, M_NETGRAPH_MPPC); free(outbuf, M_NETGRAPH_MPPC); /* Check mbuf chain reload result. */ @@ -731,36 +739,43 @@ failed: /* Decompress packet */ if ((header & MPPC_FLAG_COMPRESSED) != 0) { int flags = MPPC_MANDATORY_DECOMPRESS_FLAGS; - u_char *decompbuf, *source, *dest; + u_char *inbuf, *outbuf; + int inlen, outlen, ina; + u_char *source, *dest; u_long sourceCnt, destCnt; - int decomplen, rtn; - u_char *buf; - int len; + int rtn; /* Copy payload into a contiguous region of memory. */ - len = m->m_pkthdr.len; - buf = malloc(len, M_NETGRAPH_MPPC, M_NOWAIT); - if (buf == NULL) { - m_freem(m); - return (ENOMEM); + inlen = m->m_pkthdr.len; + if (m->m_next == NULL) { + inbuf = mtod(m, u_char *); + ina = 0; + } else { + inbuf = malloc(inlen, M_NETGRAPH_MPPC, M_NOWAIT); + if (inbuf == NULL) { + m_freem(m); + return (ENOMEM); + } + m_copydata(m, 0, inlen, (caddr_t)inbuf); + ina = 1; } - m_copydata(m, 0, len, (caddr_t)buf); /* Allocate a buffer for decompressed data */ - decompbuf = malloc(MPPC_DECOMP_BUFSIZE + MPPC_DECOMP_SAFETY, + outbuf = malloc(MPPC_DECOMP_BUFSIZE + MPPC_DECOMP_SAFETY, M_NETGRAPH_MPPC, M_NOWAIT); - if (decompbuf == NULL) { + if (outbuf == NULL) { m_freem(m); - free(buf, M_NETGRAPH_MPPC); + if (ina) + free(inbuf, M_NETGRAPH_MPPC); return (ENOMEM); } - decomplen = MPPC_DECOMP_BUFSIZE; + outlen = MPPC_DECOMP_BUFSIZE; /* Prepare to decompress */ - source = buf; - sourceCnt = len; - dest = decompbuf; - destCnt = decomplen; + source = inbuf; + sourceCnt = inlen; + dest = outbuf; + destCnt = outlen; if ((header & MPPC_FLAG_RESTART) != 0) flags |= MPPC_RESTART_HISTORY; @@ -774,22 +789,24 @@ failed: || (rtn & MPPC_DECOMP_OK) != MPPC_DECOMP_OK) { log(LOG_ERR, "%s: decomp returned 0x%x", __func__, rtn); - free(buf, M_NETGRAPH_MPPC); - free(decompbuf, M_NETGRAPH_MPPC); + if (ina) + free(inbuf, M_NETGRAPH_MPPC); + free(outbuf, M_NETGRAPH_MPPC); goto failed; } /* Replace compressed data with decompressed data */ - free(buf, M_NETGRAPH_MPPC); - len = decomplen - destCnt; + if (ina) + free(inbuf, M_NETGRAPH_MPPC); + outlen -= destCnt; - m_copyback(m, 0, len, (caddr_t)decompbuf); - if (m->m_pkthdr.len < len) { + m_copyback(m, 0, outlen, (caddr_t)outbuf); + if (m->m_pkthdr.len < outlen) { m_freem(m); m = NULL; - } else if (len < m->m_pkthdr.len) - m_adj(m, len - m->m_pkthdr.len); - free(decompbuf, M_NETGRAPH_MPPC); + } else if (outlen < m->m_pkthdr.len) + m_adj(m, outlen - m->m_pkthdr.len); + free(outbuf, M_NETGRAPH_MPPC); } #endif
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200901182109.n0IL9YHY087255>