summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRenato Botelho <renato@netgate.com>2016-03-22 08:27:42 -0300
committerRenato Botelho <renato@netgate.com>2016-03-22 08:31:11 -0300
commit745e97fea4169ce4a217dbb4a1c46055a2ccc468 (patch)
treef2ed4e299b2cd9209f9283e16e3167dc7ab35d40
parent7ad21b623013ad341bedcb7c1f59d0a0a7eec503 (diff)
downloadFreeBSD-src-745e97fea4169ce4a217dbb4a1c46055a2ccc468.zip
FreeBSD-src-745e97fea4169ce4a217dbb4a1c46055a2ccc468.tar.gz
Backport patch from D5698
This is an attempt to fix Chelsio cxl driver mbuf leak https://reviews.freebsd.org/D5698 (cherry picked from commit c35924db4e1edd83f5a845760098fc8cbd7f7456)
-rw-r--r--sys/dev/netmap/netmap_generic.c3
-rw-r--r--sys/kern/kern_mbuf.c2
-rw-r--r--sys/kern/uipc_mbuf.c4
3 files changed, 6 insertions, 3 deletions
diff --git a/sys/dev/netmap/netmap_generic.c b/sys/dev/netmap/netmap_generic.c
index ecdb368..4983516 100644
--- a/sys/dev/netmap/netmap_generic.c
+++ b/sys/dev/netmap/netmap_generic.c
@@ -129,8 +129,9 @@ static inline struct mbuf *
netmap_get_mbuf(int len)
{
struct mbuf *m;
- m = m_getcl(M_NOWAIT, MT_DATA, M_PKTHDR | M_NOFREE);
+ m = m_getcl(M_NOWAIT, MT_DATA, M_PKTHDR);
if (m) {
+ m->m_flags |= M_NOFREE; /* XXXNP: Almost certainly incorrect. */
m->m_ext.ext_arg1 = m->m_ext.ext_buf; // XXX save
m->m_ext.ext_free = (void *)netmap_default_mbuf_destructor;
m->m_ext.ext_type = EXT_EXTREF;
diff --git a/sys/kern/kern_mbuf.c b/sys/kern/kern_mbuf.c
index c232a37..7f9f666 100644
--- a/sys/kern/kern_mbuf.c
+++ b/sys/kern/kern_mbuf.c
@@ -429,6 +429,7 @@ mb_ctor_mbuf(void *mem, int size, void *arg, int how)
m = (struct mbuf *)mem;
flags = args->flags;
+ MPASS((flags & M_NOFREE) == 0);
error = m_init(m, NULL, size, how, type, flags);
@@ -626,6 +627,7 @@ mb_ctor_pack(void *mem, int size, void *arg, int how)
args = (struct mb_args *)arg;
flags = args->flags;
type = args->type;
+ MPASS((flags & M_NOFREE) == 0);
#ifdef INVARIANTS
trash_ctor(m->m_ext.ext_buf, MCLBYTES, arg, how);
diff --git a/sys/kern/uipc_mbuf.c b/sys/kern/uipc_mbuf.c
index 01e4c31..df03928 100644
--- a/sys/kern/uipc_mbuf.c
+++ b/sys/kern/uipc_mbuf.c
@@ -1989,7 +1989,7 @@ m_unshare(struct mbuf *m0, int how)
* don't know how to break up the non-contiguous memory when
* doing DMA.
*/
- n = m_getcl(how, m->m_type, m->m_flags);
+ n = m_getcl(how, m->m_type, m->m_flags & M_COPYFLAGS);
if (n == NULL) {
m_freem(m0);
return (NULL);
@@ -2014,7 +2014,7 @@ m_unshare(struct mbuf *m0, int how)
break;
off += cc;
- n = m_getcl(how, m->m_type, m->m_flags);
+ n = m_getcl(how, m->m_type, m->m_flags & M_COPYFLAGS);
if (n == NULL) {
m_freem(mfirst);
m_freem(m0);
OpenPOWER on IntegriCloud