Page MenuHomeFreeBSD

D58189.id181821.diff
No OneTemporary

D58189.id181821.diff

diff --git a/sys/kern/uipc_mbuf.c b/sys/kern/uipc_mbuf.c
--- a/sys/kern/uipc_mbuf.c
+++ b/sys/kern/uipc_mbuf.c
@@ -2160,7 +2160,8 @@
* crypto operations, especially when using hardware.
*/
if ((m->m_flags & M_EXT) == 0) {
- if (mprev && (mprev->m_flags & M_EXT) &&
+ if (mprev &&
+ (mprev->m_flags & (M_EXT | M_EXTPG)) == M_EXT &&
m->m_len <= M_TRAILINGSPACE(mprev)) {
/* XXX: this ignores mbuf types */
memcpy(mtod(mprev, caddr_t) + mprev->m_len,
@@ -2189,11 +2190,16 @@
*/
KASSERT(m->m_flags & M_EXT, ("m_flags 0x%x", m->m_flags));
/* NB: we only coalesce into a cluster or larger */
- if (mprev != NULL && (mprev->m_flags & M_EXT) &&
+ if (mprev != NULL &&
+ (mprev->m_flags & (M_EXT | M_EXTPG)) == M_EXT &&
m->m_len <= M_TRAILINGSPACE(mprev)) {
/* XXX: this ignores mbuf types */
- memcpy(mtod(mprev, caddr_t) + mprev->m_len,
- mtod(m, caddr_t), m->m_len);
+ if ((m->m_flags & M_EXTPG) != 0)
+ m_copyfromunmapped(m, 0, m->m_len,
+ mtod(mprev, caddr_t) + mprev->m_len);
+ else
+ memcpy(mtod(mprev, caddr_t) + mprev->m_len,
+ mtod(m, caddr_t), m->m_len);
mprev->m_len += m->m_len;
mprev->m_next = m->m_next; /* unlink from chain */
m_free(m); /* reclaim mbuf */
@@ -2224,7 +2230,12 @@
mlast = NULL;
for (;;) {
int cc = min(len, MCLBYTES);
- memcpy(mtod(n, caddr_t), mtod(m, caddr_t) + off, cc);
+ if ((m->m_flags & M_EXTPG) != 0)
+ m_copyfromunmapped(m, off, cc,
+ mtod(n, caddr_t));
+ else
+ memcpy(mtod(n, caddr_t),
+ mtod(m, caddr_t) + off, cc);
n->m_len = cc;
if (mlast != NULL)
mlast->m_next = n;

File Metadata

Mime Type
text/plain
Expires
Sun, Aug 2, 7:41 AM (10 h, 56 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
35028013
Default Alt Text
D58189.id181821.diff (1 KB)

Event Timeline