Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F154901072
D22186.id63781.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
4 KB
Referenced Files
None
Subscribers
None
D22186.id63781.diff
View Options
Index: sys/vm/vm_page.h
===================================================================
--- sys/vm/vm_page.h
+++ sys/vm/vm_page.h
@@ -587,6 +587,7 @@
vm_memattr_t memattr);
vm_page_t vm_page_alloc_freelist(int, int);
vm_page_t vm_page_alloc_freelist_domain(int, int, int);
+void vm_page_bits_set(vm_page_t m, vm_page_bits_t *bits, vm_page_bits_t set);
bool vm_page_blacklist_add(vm_paddr_t pa, bool verbose);
void vm_page_change_lock(vm_page_t m, struct mtx **mtx);
vm_page_t vm_page_grab (vm_object_t, vm_pindex_t, int);
Index: sys/vm/vm_page.c
===================================================================
--- sys/vm/vm_page.c
+++ sys/vm/vm_page.c
@@ -4516,7 +4516,7 @@
((vm_page_bits_t)1 << first_bit));
}
-static inline void
+void
vm_page_bits_set(vm_page_t m, vm_page_bits_t *bits, vm_page_bits_t set)
{
Index: sys/vm/vnode_pager.c
===================================================================
--- sys/vm/vnode_pager.c
+++ sys/vm/vnode_pager.c
@@ -649,9 +649,7 @@
bzero((caddr_t)sf_buf_kva(sf) + i * bsize, bsize);
KASSERT((m->dirty & bits) == 0,
("vnode_pager_input_smlfs: page %p is dirty", m));
- VM_OBJECT_WLOCK(object);
- m->valid |= bits;
- VM_OBJECT_WUNLOCK(object);
+ vm_page_bits_set(m, &m->valid, bits);
}
sf_buf_free(sf);
if (error) {
@@ -888,9 +886,7 @@
pmap_zero_page(m[0]);
KASSERT(m[0]->dirty == 0, ("%s: page %p is dirty",
__func__, m[0]));
- VM_OBJECT_WLOCK(object);
vm_page_valid(m[0]);
- VM_OBJECT_WUNLOCK(object);
return (VM_PAGER_OK);
}
@@ -1143,7 +1139,6 @@
bp->b_data = unmapped_buf;
}
- VM_OBJECT_WLOCK(object);
for (i = 0, tfoff = IDX_TO_OFF(bp->b_pages[0]->pindex);
i < bp->b_npages; i++, tfoff = nextoff) {
vm_page_t mt;
@@ -1180,7 +1175,6 @@
if (i < bp->b_pgbefore || i >= bp->b_npages - bp->b_pgafter)
vm_page_readahead_finish(mt);
}
- VM_OBJECT_WUNLOCK(object);
if (error != 0)
printf("%s: I/O read error %d\n", __func__, error);
@@ -1304,12 +1298,6 @@
*/
VM_OBJECT_RLOCK(object);
if (maxsize + poffset > object->un_pager.vnp.vnp_size) {
- if (!VM_OBJECT_TRYUPGRADE(object)) {
- VM_OBJECT_RUNLOCK(object);
- VM_OBJECT_WLOCK(object);
- if (maxsize + poffset <= object->un_pager.vnp.vnp_size)
- goto downgrade;
- }
if (object->un_pager.vnp.vnp_size > poffset) {
maxsize = object->un_pager.vnp.vnp_size - poffset;
ncount = btoc(maxsize);
@@ -1317,7 +1305,7 @@
pgoff = roundup2(pgoff, DEV_BSIZE);
/*
- * If the object is locked and the following
+ * If the page is busy and the following
* conditions hold, then the page's dirty
* field cannot be concurrently changed by a
* pmap operation.
@@ -1336,9 +1324,8 @@
}
for (i = ncount; i < count; i++)
rtvals[i] = VM_PAGER_BAD;
-downgrade:
- VM_OBJECT_LOCK_DOWNGRADE(object);
}
+ VM_OBJECT_RUNLOCK(object);
auio.uio_iov = &aiov;
auio.uio_segflg = UIO_NOCOPY;
@@ -1384,7 +1371,6 @@
*/
MPASS(prev_offset < next_offset);
- VM_OBJECT_RUNLOCK(object);
aiov.iov_base = NULL;
auio.uio_iovcnt = 1;
auio.uio_offset = prev_offset;
@@ -1400,7 +1386,6 @@
"zero-length write at %ju resid %zd\n",
auio.uio_offset, auio.uio_resid);
}
- VM_OBJECT_RLOCK(object);
break;
}
@@ -1418,7 +1403,6 @@
vn_printf(vp, "vnode_pager_putpages: residual I/O %zd "
"at %ju\n", auio.uio_resid,
(uintmax_t)ma[0]->pindex);
- VM_OBJECT_RLOCK(object);
if (error != 0 || auio.uio_resid != 0)
break;
}
@@ -1432,7 +1416,6 @@
/* Unwritten pages in range, free bonus if the page is clean. */
for (; i < ncount; i++)
rtvals[i] = ma[i]->dirty == 0 ? VM_PAGER_OK : VM_PAGER_ERROR;
- VM_OBJECT_RUNLOCK(object);
VM_CNT_ADD(v_vnodepgsout, i);
VM_CNT_INC(v_vnodeout);
return (rtvals[0]);
@@ -1482,7 +1465,6 @@
if (written == 0 && eof >= lpos)
return;
obj = ma[0]->object;
- VM_OBJECT_WLOCK(obj);
for (i = 0, pos = 0; pos < written; i++, pos += PAGE_SIZE) {
if (pos < trunc_page(written)) {
rtvals[i] = VM_PAGER_OK;
@@ -1494,7 +1476,7 @@
}
}
if (eof >= lpos) /* avoid truncation */
- goto done;
+ return;
for (pos = eof, i = OFF_TO_IDX(trunc_page(pos)); pos < lpos; i++) {
if (pos != trunc_page(pos)) {
/*
@@ -1523,8 +1505,6 @@
pos += PAGE_SIZE;
}
}
-done:
- VM_OBJECT_WUNLOCK(obj);
}
static void
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Thu, Apr 30, 9:50 PM (6 h, 15 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
32542635
Default Alt Text
D22186.id63781.diff (4 KB)
Attached To
Mode
D22186: Remove unnecessary object locking from the vnode pager.
Attached
Detach File
Event Timeline
Log In to Comment