Date: Sun, 24 Aug 2014 07:57:50 +0000 (UTC) From: Konstantin Belousov <kib@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org Subject: svn commit: r270440 - stable/10/sys/vm Message-ID: <201408240757.s7O7vo48052488@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: kib Date: Sun Aug 24 07:57:50 2014 New Revision: 270440 URL: http://svnweb.freebsd.org/changeset/base/270440 Log: MFC r269746: Adapt vm_page_aflag_set(PGA_WRITEABLE) to the locking of pmap_enter(PMAP_ENTER_NOSLEEP). Modified: stable/10/sys/vm/vm_page.c stable/10/sys/vm/vm_page.h Directory Properties: stable/10/ (props changed) Modified: stable/10/sys/vm/vm_page.c ============================================================================== --- stable/10/sys/vm/vm_page.c Sun Aug 24 07:53:15 2014 (r270439) +++ stable/10/sys/vm/vm_page.c Sun Aug 24 07:57:50 2014 (r270440) @@ -3145,6 +3145,24 @@ vm_page_object_lock_assert(vm_page_t m) if (m->object != NULL && !vm_page_xbusied(m)) VM_OBJECT_ASSERT_WLOCKED(m->object); } + +void +vm_page_assert_pga_writeable(vm_page_t m, uint8_t bits) +{ + + if ((bits & PGA_WRITEABLE) == 0) + return; + + /* + * The PGA_WRITEABLE flag can only be set if the page is + * managed, is exclusively busied or the object is locked. + * Currently, this flag is only set by pmap_enter(). + */ + KASSERT((m->oflags & VPO_UNMANAGED) == 0, + ("PGA_WRITEABLE on unmanaged page")); + if (!vm_page_xbusied(m)) + VM_OBJECT_ASSERT_LOCKED(m->object); +} #endif #include "opt_ddb.h" Modified: stable/10/sys/vm/vm_page.h ============================================================================== --- stable/10/sys/vm/vm_page.h Sun Aug 24 07:53:15 2014 (r270439) +++ stable/10/sys/vm/vm_page.h Sun Aug 24 07:57:50 2014 (r270440) @@ -305,10 +305,10 @@ extern struct mtx_padalign pa_lock[]; * both the MI and MD VM layers. However, kernel loadable modules should not * directly set this flag. They should call vm_page_reference() instead. * - * PGA_WRITEABLE is set exclusively on managed pages by pmap_enter(). When it - * does so, the page must be exclusive busied. The MI VM layer must never - * access this flag directly. Instead, it should call - * pmap_page_is_write_mapped(). + * PGA_WRITEABLE is set exclusively on managed pages by pmap_enter(). + * When it does so, the object must be locked, or the page must be + * exclusive busied. The MI VM layer must never access this flag + * directly. Instead, it should call pmap_page_is_write_mapped(). * * PGA_EXECUTABLE may be set by pmap routines, and indicates that a page has * at least one executable mapping. It is not consumed by the MI VM layer. @@ -536,8 +536,12 @@ void vm_page_lock_assert_KBI(vm_page_t m #ifdef INVARIANTS void vm_page_object_lock_assert(vm_page_t m); #define VM_PAGE_OBJECT_LOCK_ASSERT(m) vm_page_object_lock_assert(m) +void vm_page_assert_pga_writeable(vm_page_t m, uint8_t bits); +#define VM_PAGE_ASSERT_PGA_WRITEABLE(m, bits) \ + vm_page_assert_pga_writeable(m, bits) #else #define VM_PAGE_OBJECT_LOCK_ASSERT(m) (void)0 +#define VM_PAGE_ASSERT_PGA_WRITEABLE(m, bits) (void)0 #endif /* @@ -585,13 +589,7 @@ vm_page_aflag_set(vm_page_t m, uint8_t b { uint32_t *addr, val; - /* - * The PGA_WRITEABLE flag can only be set if the page is managed and - * exclusive busied. Currently, this flag is only set by pmap_enter(). - */ - KASSERT((bits & PGA_WRITEABLE) == 0 || - ((m->oflags & VPO_UNMANAGED) == 0 && vm_page_xbusied(m)), - ("vm_page_aflag_set: PGA_WRITEABLE and not exclusive busy")); + VM_PAGE_ASSERT_PGA_WRITEABLE(m, bits); /* * Access the whole 32-bit word containing the aflags field with an
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201408240757.s7O7vo48052488>