From owner-svn-src-all@freebsd.org Fri Mar 23 00:59:11 2018 Return-Path: Delivered-To: svn-src-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 1B485F5A87F; Fri, 23 Mar 2018 00:59:11 +0000 (UTC) (envelope-from cy.schubert@cschubert.com) Received: from smtp-out-no.shaw.ca (smtp-out-no.shaw.ca [64.59.134.9]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client CN "Client", Issuer "CA" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 6577B767F7; Fri, 23 Mar 2018 00:59:10 +0000 (UTC) (envelope-from cy.schubert@cschubert.com) Received: from spqr.komquats.com ([96.50.22.10]) by shaw.ca with ESMTPA id zB2uefcv3U5pnzB2wem7L4; Thu, 22 Mar 2018 18:59:08 -0600 X-Authority-Analysis: v=2.3 cv=Tai4SyYh c=1 sm=1 tr=0 a=jvE2nwUzI0ECrNeyr98KWA==:117 a=jvE2nwUzI0ECrNeyr98KWA==:17 a=kj9zAlcOel0A:10 a=v2DPQv5-lfwA:10 a=6I5d2MoRAAAA:8 a=YxBL1-UpAAAA:8 a=1IRbpGNzCyaoQT8CEAwA:9 a=CjuIK1q_8ugA:10 a=IjZwj45LgO3ly-622nXo:22 a=Ia-lj3WSrqcvXOmTRaiG:22 Received: from slippy.cwsent.com (slippy [10.1.1.91]) by spqr.komquats.com (Postfix) with ESMTPS id B3DD91248; Thu, 22 Mar 2018 17:59:04 -0700 (PDT) Received: from slippy.cwsent.com (localhost [127.0.0.1]) by slippy.cwsent.com (8.15.2/8.15.2) with ESMTP id w2N0x2Kg077301; Thu, 22 Mar 2018 17:59:02 -0700 (PDT) (envelope-from Cy.Schubert@cschubert.com) Received: from slippy (cy@localhost) by slippy.cwsent.com (8.15.2/8.15.2/Submit) with ESMTP id w2N0x2fw077291; Thu, 22 Mar 2018 17:59:02 -0700 (PDT) (envelope-from Cy.Schubert@cschubert.com) Message-Id: <201803230059.w2N0x2fw077291@slippy.cwsent.com> X-Authentication-Warning: slippy.cwsent.com: cy owned process doing -bs X-Mailer: exmh version 2.8.0 04/21/2012 with nmh-1.7.1 Reply-to: Cy Schubert From: Cy Schubert X-os: FreeBSD X-Sender: cy@cwsent.com X-URL: http://www.cschubert.com/ To: Jeff Roberson cc: Justin Hibbits , Jeff Roberson , src-committers , svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: Re: svn commit: r331369 - head/sys/vm In-Reply-To: Message from Jeff Roberson of "Thu, 22 Mar 2018 14:52:01 -1000." Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Date: Thu, 22 Mar 2018 17:59:02 -0700 X-CMAE-Envelope: MS4wfF13DQe+MfdEAy6Ew3KCgDcUJSJrsoiZnPVcft2wGRv+qq6Y6TGEI94fTvuGEL2uVCV66bklvOEj4nQ214YLBNgIb2NbdicC1DiFt8ZfuTm6LzRCq+zs 8mdqPkGFBGZ6pnE4t4R31XR2YMbKTJYmvrsHdNrX3NZWYUjEuAd9wapZ/LhGLYSy8qdbghFsaHYtwnvKRklripuH5lcff4BjZK2fpgxopRxKMdeuuTgUiZa/ LcjePc4SKmO32Td3Mz5MhRIk9ILhxRRU1SFZC1LsvgFtNnakyWZFcmmbImz2C6wAbw0UgBLVwjkqIRv6j9V8RBR5J0/cIwopqbNdDec36CBDcLZ0q8kzlbr7 zlpAsQwc X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.25 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: Fri, 23 Mar 2018 00:59:11 -0000 It broke i386 too. Index: sys/vm/vm_reserv.c =================================================================== --- sys/vm/vm_reserv.c (revision 331399) +++ sys/vm/vm_reserv.c (working copy) @@ -45,8 +45,6 @@ #include #include -#include -#include #include #include #include @@ -55,6 +53,8 @@ #include #include #include +#include +#include #include #include This is because sys/i386/include/machine.h uses critical_enter() and critical_exit() which are defined in sys/systm.h. It built nicely on my amd64's though. ~cy In message , Jeff Roberson writes: > Thank you, working on it. I had done a make universe before getting > review feedback. > > Jeff > > On Thu, 22 Mar 2018, Justin Hibbits wrote: > > > This broke gcc builds. > > > > On Thu, Mar 22, 2018 at 2:21 PM, Jeff Roberson wrote: > >> Author: jeff > >> Date: Thu Mar 22 19:21:11 2018 > >> New Revision: 331369 > >> URL: https://svnweb.freebsd.org/changeset/base/331369 > >> > >> Log: > >> Lock reservations with a dedicated lock in each reservation. Protect th > e > >> vmd_free_count with atomics. > >> > >> This allows us to allocate and free from reservations without the free l > ock > >> except where a superpage is allocated from the physical layer, which is > >> roughly 1/512 of the operations on amd64. > >> > >> Use the counter api to eliminate cache conention on counters. > >> > >> Reviewed by: markj > >> Tested by: pho > >> Sponsored by: Netflix, Dell/EMC Isilon > >> Differential Revision: https://reviews.freebsd.org/D14707 > >> > >> Modified: > >> head/sys/vm/vm_page.c > >> head/sys/vm/vm_pagequeue.h > >> head/sys/vm/vm_reserv.c > >> head/sys/vm/vm_reserv.h > >> > >> Modified: head/sys/vm/vm_page.c > >> ========================================================================== > ==== > >> --- head/sys/vm/vm_page.c Thu Mar 22 19:11:43 2018 (r331368) > >> +++ head/sys/vm/vm_page.c Thu Mar 22 19:21:11 2018 (r331369) > >> @@ -177,7 +177,6 @@ static uma_zone_t fakepg_zone; > >> static void vm_page_alloc_check(vm_page_t m); > >> static void vm_page_clear_dirty_mask(vm_page_t m, vm_page_bits_t pagebits > ); > >> static void vm_page_enqueue(uint8_t queue, vm_page_t m); > >> -static void vm_page_free_phys(struct vm_domain *vmd, vm_page_t m); > >> static void vm_page_init(void *dummy); > >> static int vm_page_insert_after(vm_page_t m, vm_object_t object, > >> vm_pindex_t pindex, vm_page_t mpred); > >> @@ -1677,10 +1676,10 @@ vm_page_alloc_after(vm_object_t object, vm_pindex_ > t pi > >> * for the request class and false otherwise. > >> */ > >> int > >> -vm_domain_available(struct vm_domain *vmd, int req, int npages) > >> +vm_domain_allocate(struct vm_domain *vmd, int req, int npages) > >> { > >> + u_int limit, old, new; > >> > >> - vm_domain_free_assert_locked(vmd); > >> req = req & VM_ALLOC_CLASS_MASK; > >> > >> /* > >> @@ -1688,15 +1687,34 @@ vm_domain_available(struct vm_domain *vmd, int req > , in > >> */ > >> if (curproc == pageproc && req != VM_ALLOC_INTERRUPT) > >> req = VM_ALLOC_SYSTEM; > >> + if (req == VM_ALLOC_INTERRUPT) > >> + limit = 0; > >> + else if (req == VM_ALLOC_SYSTEM) > >> + limit = vmd->vmd_interrupt_free_min; > >> + else > >> + limit = vmd->vmd_free_reserved; > >> > >> - if (vmd->vmd_free_count >= npages + vmd->vmd_free_reserved || > >> - (req == VM_ALLOC_SYSTEM && > >> - vmd->vmd_free_count >= npages + vmd->vmd_interrupt_free_min) | > | > >> - (req == VM_ALLOC_INTERRUPT && > >> - vmd->vmd_free_count >= npages)) > >> - return (1); > >> + /* > >> + * Attempt to reserve the pages. Fail if we're below the limit. > >> + */ > >> + limit += npages; > >> + old = vmd->vmd_free_count; > >> + do { > >> + if (old < limit) > >> + return (0); > >> + new = old - npages; > >> + } while (atomic_fcmpset_int(&vmd->vmd_free_count, &old, new) == 0) > ; > >> > >> - return (0); > >> + /* Wake the page daemon if we've crossed the threshold. */ > >> + if (vm_paging_needed(vmd, new) && !vm_paging_needed(vmd, old)) > >> + pagedaemon_wakeup(vmd->vmd_domain); > >> + > >> + /* Only update bitsets on transitions. */ > >> + if ((old >= vmd->vmd_free_min && new < vmd->vmd_free_min) || > >> + (old >= vmd->vmd_free_severe && new < vmd->vmd_free_severe)) > >> + vm_domain_set(vmd); > >> + > >> + return (1); > >> } > >> > >> vm_page_t > >> @@ -1723,44 +1741,34 @@ vm_page_alloc_domain_after(vm_object_t object, vm_ > pind > >> again: > >> m = NULL; > >> #if VM_NRESERVLEVEL > 0 > >> + /* > >> + * Can we allocate the page from a reservation? > >> + */ > >> if (vm_object_reserv(object) && > >> - (m = vm_reserv_extend(req, object, pindex, domain, mpred)) > >> - != NULL) { > >> + ((m = vm_reserv_extend(req, object, pindex, domain, mpred)) != > NULL || > >> + (m = vm_reserv_alloc_page(req, object, pindex, domain, mpred)) > != NULL)) { > >> domain = vm_phys_domain(m); > >> vmd = VM_DOMAIN(domain); > >> goto found; > >> } > >> #endif > >> vmd = VM_DOMAIN(domain); > >> - vm_domain_free_lock(vmd); > >> - if (vm_domain_available(vmd, req, 1)) { > >> + if (vm_domain_allocate(vmd, req, 1)) { > >> /* > >> - * Can we allocate the page from a reservation? > >> + * If not, allocate it from the free page queues. > >> */ > >> + vm_domain_free_lock(vmd); > >> + m = vm_phys_alloc_pages(domain, object != NULL ? > >> + VM_FREEPOOL_DEFAULT : VM_FREEPOOL_DIRECT, 0); > >> + vm_domain_free_unlock(vmd); > >> + if (m == NULL) { > >> + vm_domain_freecnt_inc(vmd, 1); > >> #if VM_NRESERVLEVEL > 0 > >> - if (!vm_object_reserv(object) || > >> - (m = vm_reserv_alloc_page(object, pindex, > >> - domain, mpred)) == NULL) > >> + if (vm_reserv_reclaim_inactive(domain)) > >> + goto again; > >> #endif > >> - { > >> - /* > >> - * If not, allocate it from the free page queues. > >> - */ > >> - m = vm_phys_alloc_pages(domain, object != NULL ? > >> - VM_FREEPOOL_DEFAULT : VM_FREEPOOL_DIRECT, 0); > >> -#if VM_NRESERVLEVEL > 0 > >> - if (m == NULL && vm_reserv_reclaim_inactive(domain > )) { > >> - m = vm_phys_alloc_pages(domain, > >> - object != NULL ? > >> - VM_FREEPOOL_DEFAULT : VM_FREEPOOL_DIRE > CT, > >> - 0); > >> - } > >> -#endif > >> } > >> } > >> - if (m != NULL) > >> - vm_domain_freecnt_dec(vmd, 1); > >> - vm_domain_free_unlock(vmd); > >> if (m == NULL) { > >> /* > >> * Not allocatable, give up. > >> @@ -1775,9 +1783,7 @@ again: > >> */ > >> KASSERT(m != NULL, ("missing page")); > >> > >> -#if VM_NRESERVLEVEL > 0 > >> found: > >> -#endif > > > > 'found' is now declared, but unused on powerpc64. > > > > - Justin > > > -- Cheers, Cy Schubert FreeBSD UNIX: Web: http://www.FreeBSD.org The need of the many outweighs the greed of the few.