Remove manual wire_count adjustments from the unmapped mbuf code.

The original code came from a desire to minimize the number of updates
to v_wire_count, which prior to r329187 was updated using atomics.
However, there is no significant benefit to batching today, so simply
allocate pages using VM_ALLOC_WIRED and rely on system accounting.

Reviewed by:	jhb
Differential Revision:	https://reviews.freebsd.org/D21323
This commit is contained in:
Mark Johnston 2019-08-21 20:01:52 +00:00
parent 65174f684c
commit 9fb7c918ef

View File

@ -1616,22 +1616,18 @@ mb_free_mext_pgs(struct mbuf *m)
{
struct mbuf_ext_pgs *ext_pgs;
vm_page_t pg;
int wire_adj;
MBUF_EXT_PGS_ASSERT(m);
ext_pgs = m->m_ext.ext_pgs;
wire_adj = 0;
for (int i = 0; i < ext_pgs->npgs; i++) {
pg = PHYS_TO_VM_PAGE(ext_pgs->pa[i]);
/*
* Note: page is not locked, as it has no
* object and is not on any queues.
*/
vm_page_free_toq(pg);
wire_adj++;
vm_page_unwire_noq(pg);
vm_page_free(pg);
}
if (wire_adj)
vm_wire_sub(wire_adj);
}
static struct mbuf *
@ -1640,9 +1636,10 @@ m_uiotombuf_nomap(struct uio *uio, int how, int len, int maxseg, int flags)
struct mbuf *m, *mb, *prev;
struct mbuf_ext_pgs *pgs;
vm_page_t pg_array[MBUF_PEXT_MAX_PGS];
int error, length, i, needed, wire_adj = 0;
int error, length, i, needed;
ssize_t total;
int pflags = malloc2vm_flags(how) | VM_ALLOC_NOOBJ | VM_ALLOC_NODUMP;
int pflags = malloc2vm_flags(how) | VM_ALLOC_NOOBJ | VM_ALLOC_NODUMP |
VM_ALLOC_WIRED;
/*
* len can be zero or an arbitrary large value bound by
@ -1676,9 +1673,6 @@ m_uiotombuf_nomap(struct uio *uio, int how, int len, int maxseg, int flags)
retry_page:
pg_array[i] = vm_page_alloc(NULL, 0, pflags);
if (pg_array[i] == NULL) {
if (wire_adj)
vm_wire_add(wire_adj);
wire_adj = 0;
if (how & M_NOWAIT) {
goto failed;
} else {
@ -1686,15 +1680,12 @@ m_uiotombuf_nomap(struct uio *uio, int how, int len, int maxseg, int flags)
goto retry_page;
}
}
wire_adj++;
pg_array[i]->flags &= ~PG_ZERO;
pgs->pa[i] = VM_PAGE_TO_PHYS(pg_array[i]);
pgs->npgs++;
}
pgs->last_pg_len = length - PAGE_SIZE * (pgs->npgs - 1);
MBUF_EXT_PGS_ASSERT_SANITY(pgs);
vm_wire_add(wire_adj);
wire_adj = 0;
total -= length;
error = uiomove_fromphys(pg_array, 0, length, uio);
if (error != 0)