diff options
Diffstat (limited to 'sys/vm')
-rw-r--r-- | sys/vm/vm_page.c | 4 | ||||
-rw-r--r-- | sys/vm/vm_page.h | 4 |
2 files changed, 5 insertions, 3 deletions
diff --git a/sys/vm/vm_page.c b/sys/vm/vm_page.c index e70ca3f5c514..1c877d932c28 100644 --- a/sys/vm/vm_page.c +++ b/sys/vm/vm_page.c @@ -2336,10 +2336,12 @@ vm_page_cowsetup(vm_page_t m) { vm_page_lock_assert(m, MA_OWNED); - if (m->cow == USHRT_MAX - 1) + if ((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) != 0 || + m->cow == USHRT_MAX - 1 || !VM_OBJECT_TRYLOCK(m->object)) return (EBUSY); m->cow++; pmap_remove_write(m); + VM_OBJECT_UNLOCK(m->object); return (0); } diff --git a/sys/vm/vm_page.h b/sys/vm/vm_page.h index e9d95449f324..aebf79e1edcd 100644 --- a/sys/vm/vm_page.h +++ b/sys/vm/vm_page.h @@ -217,8 +217,8 @@ extern struct vpglocks pa_lock[]; * pte mappings, nor can they be removed from their objects via * the object, and such pages are also not on any PQ queue. * - * PG_WRITEABLE is set exclusively by pmap_enter(). When it does so, either - * the page must be VPO_BUSY or the containing object must be locked. + * PG_WRITEABLE is set exclusively by pmap_enter(). When it does so, the page + * must be VPO_BUSY. */ #define PG_CACHED 0x0001 /* page is cached */ #define PG_FREE 0x0002 /* page is free */ |