From owner-svn-src-all@freebsd.org Sun Dec 8 01:16:22 2019 Return-Path: Delivered-To: svn-src-all@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id E5DB91D2A34; Sun, 8 Dec 2019 01:16:22 +0000 (UTC) (envelope-from jeff@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) server-signature RSA-PSS (4096 bits) client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 47VpLZ5qnhz4Rpk; Sun, 8 Dec 2019 01:16:22 +0000 (UTC) (envelope-from jeff@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id ABCA122756; Sun, 8 Dec 2019 01:16:22 +0000 (UTC) (envelope-from jeff@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id xB81GMam004512; Sun, 8 Dec 2019 01:16:22 GMT (envelope-from jeff@FreeBSD.org) Received: (from jeff@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id xB81GMp3004510; Sun, 8 Dec 2019 01:16:22 GMT (envelope-from jeff@FreeBSD.org) Message-Id: <201912080116.xB81GMp3004510@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: jeff set sender to jeff@FreeBSD.org using -f From: Jeff Roberson Date: Sun, 8 Dec 2019 01:16:22 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r355511 - head/sys/vm X-SVN-Group: head X-SVN-Commit-Author: jeff X-SVN-Commit-Paths: head/sys/vm X-SVN-Commit-Revision: 355511 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 08 Dec 2019 01:16:23 -0000 Author: jeff Date: Sun Dec 8 01:16:22 2019 New Revision: 355511 URL: https://svnweb.freebsd.org/changeset/base/355511 Log: Reduce duplication in grab functions by providing allocflags based inlines. Reviewed by: kib, markj Differential Revision: https://reviews.freebsd.org/D22635 Modified: head/sys/vm/vm_page.c head/sys/vm/vm_page.h Modified: head/sys/vm/vm_page.c ============================================================================== --- head/sys/vm/vm_page.c Sun Dec 8 01:15:06 2019 (r355510) +++ head/sys/vm/vm_page.c Sun Dec 8 01:16:22 2019 (r355511) @@ -862,13 +862,49 @@ vm_page_reference(vm_page_t m) vm_page_aflag_set(m, PGA_REFERENCED); } +static bool +vm_page_acquire_flags(vm_page_t m, int allocflags) +{ + bool locked; + + if ((allocflags & (VM_ALLOC_SBUSY | VM_ALLOC_IGN_SBUSY)) != 0) + locked = vm_page_trysbusy(m); + else + locked = vm_page_tryxbusy(m); + if (locked && (allocflags & VM_ALLOC_WIRED) != 0) + vm_page_wire(m); + return (locked); +} + +static bool +vm_page_busy_sleep_flags(vm_object_t object, vm_page_t m, const char *wchan, + int allocflags) +{ + + if ((allocflags & VM_ALLOC_NOWAIT) != 0) + return (false); + /* + * Reference the page before unlocking and + * sleeping so that the page daemon is less + * likely to reclaim it. + */ + if ((allocflags & VM_ALLOC_NOCREAT) == 0) + vm_page_aflag_set(m, PGA_REFERENCED); + vm_page_busy_sleep(m, wchan, (allocflags & + VM_ALLOC_IGN_SBUSY) != 0); + VM_OBJECT_WLOCK(object); + if ((allocflags & VM_ALLOC_WAITFAIL) != 0) + return (false); + return (true); +} + /* * vm_page_busy_acquire: * * Acquire the busy lock as described by VM_ALLOC_* flags. Will loop * and drop the object lock if necessary. */ -int +bool vm_page_busy_acquire(vm_page_t m, int allocflags) { vm_object_t obj; @@ -883,26 +919,21 @@ vm_page_busy_acquire(vm_page_t m, int allocflags) */ obj = m->object; for (;;) { - if ((allocflags & VM_ALLOC_SBUSY) == 0) { - if (vm_page_tryxbusy(m)) - return (TRUE); - } else { - if (vm_page_trysbusy(m)) - return (TRUE); - } + if (vm_page_acquire_flags(m, allocflags)) + return (true); if ((allocflags & VM_ALLOC_NOWAIT) != 0) - return (FALSE); + return (false); if (obj != NULL) locked = VM_OBJECT_WOWNED(obj); else - locked = FALSE; + locked = false; MPASS(locked || vm_page_wired(m)); _vm_page_busy_sleep(obj, m, "vmpba", (allocflags & VM_ALLOC_SBUSY) != 0, locked); if (locked) VM_OBJECT_WLOCK(obj); if ((allocflags & VM_ALLOC_WAITFAIL) != 0) - return (FALSE); + return (false); KASSERT(m->object == obj || m->object == NULL, ("vm_page_busy_acquire: page %p does not belong to %p", m, obj)); @@ -4227,6 +4258,29 @@ vm_page_advise(vm_page_t m, int advice) vm_page_launder(m); } +static inline int +vm_page_grab_pflags(int allocflags) +{ + int pflags; + + KASSERT((allocflags & VM_ALLOC_NOBUSY) == 0 || + (allocflags & VM_ALLOC_WIRED) != 0, + ("vm_page_grab_pflags: the pages must be busied or wired")); + KASSERT((allocflags & VM_ALLOC_SBUSY) == 0 || + (allocflags & VM_ALLOC_IGN_SBUSY) != 0, + ("vm_page_grab_pflags: VM_ALLOC_SBUSY/VM_ALLOC_IGN_SBUSY " + "mismatch")); + pflags = allocflags & + ~(VM_ALLOC_NOWAIT | VM_ALLOC_WAITOK | VM_ALLOC_WAITFAIL | + VM_ALLOC_NOBUSY); + if ((allocflags & VM_ALLOC_NOWAIT) == 0) + pflags |= VM_ALLOC_WAITFAIL; + if ((allocflags & VM_ALLOC_IGN_SBUSY) != 0) + pflags |= VM_ALLOC_SBUSY; + + return (pflags); +} + /* * Grab a page, waiting until we are waken up due to the page * changing state. We keep on waiting, if the page continues @@ -4242,47 +4296,19 @@ vm_page_t vm_page_grab(vm_object_t object, vm_pindex_t pindex, int allocflags) { vm_page_t m; - int sleep; int pflags; VM_OBJECT_ASSERT_WLOCKED(object); - KASSERT((allocflags & VM_ALLOC_SBUSY) == 0 || - (allocflags & VM_ALLOC_IGN_SBUSY) != 0, - ("vm_page_grab: VM_ALLOC_SBUSY/VM_ALLOC_IGN_SBUSY mismatch")); - pflags = allocflags & - ~(VM_ALLOC_NOWAIT | VM_ALLOC_WAITOK | VM_ALLOC_WAITFAIL | - VM_ALLOC_NOBUSY); - if ((allocflags & VM_ALLOC_NOWAIT) == 0) - pflags |= VM_ALLOC_WAITFAIL; - if ((allocflags & VM_ALLOC_IGN_SBUSY) != 0) - pflags |= VM_ALLOC_SBUSY; + pflags = vm_page_grab_pflags(allocflags); retrylookup: if ((m = vm_page_lookup(object, pindex)) != NULL) { - if ((allocflags & (VM_ALLOC_IGN_SBUSY | VM_ALLOC_SBUSY)) != 0) - sleep = !vm_page_trysbusy(m); - else - sleep = !vm_page_tryxbusy(m); - if (sleep) { - if ((allocflags & VM_ALLOC_NOWAIT) != 0) - return (NULL); - /* - * Reference the page before unlocking and - * sleeping so that the page daemon is less - * likely to reclaim it. - */ - if ((allocflags & VM_ALLOC_NOCREAT) == 0) - vm_page_aflag_set(m, PGA_REFERENCED); - vm_page_busy_sleep(m, "pgrbwt", (allocflags & - VM_ALLOC_IGN_SBUSY) != 0); - VM_OBJECT_WLOCK(object); - if ((allocflags & VM_ALLOC_WAITFAIL) != 0) - return (NULL); - goto retrylookup; - } else { - if ((allocflags & VM_ALLOC_WIRED) != 0) - vm_page_wire(m); - goto out; + if (!vm_page_acquire_flags(m, allocflags)) { + if (vm_page_busy_sleep_flags(object, m, "pgrbwt", + allocflags)) + goto retrylookup; + return (NULL); } + goto out; } if ((allocflags & VM_ALLOC_NOCREAT) != 0) return (NULL); @@ -4346,16 +4372,8 @@ retrylookup: } else sleep = !vm_page_trysbusy(m); if (sleep) { - /* - * Reference the page before unlocking and - * sleeping so that the page daemon is less - * likely to reclaim it. - */ - if ((allocflags & VM_ALLOC_NOCREAT) == 0) - vm_page_aflag_set(m, PGA_REFERENCED); - vm_page_busy_sleep(m, "pgrbwt", (allocflags & - VM_ALLOC_IGN_SBUSY) != 0); - VM_OBJECT_WLOCK(object); + (void)vm_page_busy_sleep_flags(object, m, "pgrbwt", + allocflags); goto retrylookup; } if ((allocflags & VM_ALLOC_NOCREAT) != 0 && @@ -4441,26 +4459,15 @@ vm_page_grab_pages(vm_object_t object, vm_pindex_t pin vm_page_t m, mpred; int pflags; int i; - bool sleep; VM_OBJECT_ASSERT_WLOCKED(object); KASSERT(((u_int)allocflags >> VM_ALLOC_COUNT_SHIFT) == 0, ("vm_page_grap_pages: VM_ALLOC_COUNT() is not allowed")); - KASSERT((allocflags & VM_ALLOC_NOBUSY) == 0 || - (allocflags & VM_ALLOC_WIRED) != 0, - ("vm_page_grab_pages: the pages must be busied or wired")); - KASSERT((allocflags & VM_ALLOC_SBUSY) == 0 || - (allocflags & VM_ALLOC_IGN_SBUSY) != 0, - ("vm_page_grab_pages: VM_ALLOC_SBUSY/IGN_SBUSY mismatch")); + + pflags = vm_page_grab_pflags(allocflags); if (count == 0) return (0); - pflags = allocflags & - ~(VM_ALLOC_NOWAIT | VM_ALLOC_WAITOK | VM_ALLOC_WAITFAIL | - VM_ALLOC_NOBUSY); - if ((allocflags & VM_ALLOC_NOWAIT) == 0) - pflags |= VM_ALLOC_WAITFAIL; - if ((allocflags & VM_ALLOC_IGN_SBUSY) != 0) - pflags |= VM_ALLOC_SBUSY; + i = 0; retrylookup: m = vm_radix_lookup_le(&object->rtree, pindex + i); @@ -4471,28 +4478,12 @@ retrylookup: mpred = TAILQ_PREV(m, pglist, listq); for (; i < count; i++) { if (m != NULL) { - if ((allocflags & - (VM_ALLOC_SBUSY | VM_ALLOC_IGN_SBUSY)) != 0) - sleep = !vm_page_trysbusy(m); - else - sleep = !vm_page_tryxbusy(m); - if (sleep) { - if ((allocflags & VM_ALLOC_NOWAIT) != 0) - break; - /* - * Reference the page before unlocking and - * sleeping so that the page daemon is less - * likely to reclaim it. - */ - if ((allocflags & VM_ALLOC_NOCREAT) == 0) - vm_page_aflag_set(m, PGA_REFERENCED); - vm_page_busy_sleep(m, "grbmaw", (allocflags & - VM_ALLOC_IGN_SBUSY) != 0); - VM_OBJECT_WLOCK(object); - goto retrylookup; + if (!vm_page_acquire_flags(m, allocflags)) { + if (vm_page_busy_sleep_flags(object, m, + "grbmaw", allocflags)) + goto retrylookup; + break; } - if ((allocflags & VM_ALLOC_WIRED) != 0) - vm_page_wire(m); } else { if ((allocflags & VM_ALLOC_NOCREAT) != 0) break; Modified: head/sys/vm/vm_page.h ============================================================================== --- head/sys/vm/vm_page.h Sun Dec 8 01:15:06 2019 (r355510) +++ head/sys/vm/vm_page.h Sun Dec 8 01:16:22 2019 (r355511) @@ -573,7 +573,7 @@ malloc2vm_flags(int malloc_flags) #define PS_ALL_VALID 0x2 #define PS_NONE_BUSY 0x4 -int vm_page_busy_acquire(vm_page_t m, int allocflags); +bool vm_page_busy_acquire(vm_page_t m, int allocflags); void vm_page_busy_downgrade(vm_page_t m); int vm_page_busy_tryupgrade(vm_page_t m); void vm_page_busy_sleep(vm_page_t m, const char *msg, bool nonshared);