diff --git a/sys/vm/vm_page.c b/sys/vm/vm_page.c index 6d55892..6c85664 100644 --- a/sys/vm/vm_page.c +++ b/sys/vm/vm_page.c @@ -474,10 +474,10 @@ vm_page_startup(vm_offset_t vaddr) } void -vm_page_flag_set(vm_page_t m, unsigned short bits) +vm_page_flag_set(vm_page_t m, uint16_t bits) { + uint32_t *addr; - mtx_assert(&vm_page_queue_mtx, MA_OWNED); /* * The PG_WRITEABLE flag can only be set if the page is managed and * VPO_BUSY. Currently, this flag is only set by pmap_enter(). @@ -485,21 +485,25 @@ vm_page_flag_set(vm_page_t m, unsigned short bits) KASSERT((bits & PG_WRITEABLE) == 0 || (m->oflags & (VPO_UNMANAGED | VPO_BUSY)) == VPO_BUSY, ("PG_WRITEABLE and !VPO_BUSY")); - m->flags |= bits; + addr = (void *)&m->flags; + MPASS(((uintptr_t)addr & 0x3) == 0); + atomic_set_32(addr, bits); } void -vm_page_flag_clear(vm_page_t m, unsigned short bits) +vm_page_flag_clear(vm_page_t m, uint16_t bits) { + uint32_t *addr; - mtx_assert(&vm_page_queue_mtx, MA_OWNED); /* * The PG_REFERENCED flag can only be cleared if the object * containing the page is locked. */ KASSERT((bits & PG_REFERENCED) == 0 || VM_OBJECT_LOCKED(m->object), ("PG_REFERENCED and !VM_OBJECT_LOCKED")); - m->flags &= ~bits; + addr = (void *)&m->flags; + MPASS(((uintptr_t)addr & 0x3) == 0); + atomic_clear_32(addr, bits); } void diff --git a/sys/vm/vm_page.h b/sys/vm/vm_page.h index 1dda1e2..8cff926 100644 --- a/sys/vm/vm_page.h +++ b/sys/vm/vm_page.h @@ -114,6 +114,12 @@ TAILQ_HEAD(pglist, vm_page); struct vm_page { + uint16_t flags; /* see below */ + uint8_t queue; /* page queue index (P,Q) */ + int8_t segind; + uint8_t order; /* index of the buddy queue */ + uint8_t pool; + u_short cow; /* page cow mapping count (P) */ TAILQ_ENTRY(vm_page) pageq; /* queue info for FIFO queue or free list (Q) */ TAILQ_ENTRY(vm_page) listq; /* pages in same object (O) */ struct vm_page *left; /* splay tree link (O) */ @@ -123,12 +129,6 @@ struct vm_page { vm_pindex_t pindex; /* offset into object (O,P) */ vm_paddr_t phys_addr; /* physical address of page */ struct md_page md; /* machine dependant stuff */ - uint8_t queue; /* page queue index (P,Q) */ - int8_t segind; - u_short flags; /* see below */ - uint8_t order; /* index of the buddy queue */ - uint8_t pool; - u_short cow; /* page cow mapping count (P) */ u_int wire_count; /* wired down maps refs (P) */ short hold_count; /* page hold count (P) */ u_short oflags; /* page flags (O) */ @@ -341,8 +341,8 @@ extern struct vpglocks vm_page_queue_lock; #define VM_ALLOC_COUNT_SHIFT 16 #define VM_ALLOC_COUNT(count) ((count) << VM_ALLOC_COUNT_SHIFT) -void vm_page_flag_set(vm_page_t m, unsigned short bits); -void vm_page_flag_clear(vm_page_t m, unsigned short bits); +void vm_page_flag_set(vm_page_t m, uint16_t bits); +void vm_page_flag_clear(vm_page_t m, uint16_t bits); void vm_page_busy(vm_page_t m); void vm_page_flash(vm_page_t m); void vm_page_io_start(vm_page_t m);