From owner-svn-src-all@freebsd.org Fri Mar 23 01:54:52 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 2090CF5ECB1 for ; Fri, 23 Mar 2018 01:54:52 +0000 (UTC) (envelope-from jroberson@jroberson.net) Received: from mail-pl0-x22c.google.com (mail-pl0-x22c.google.com [IPv6:2607:f8b0:400e:c01::22c]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client CN "smtp.gmail.com", Issuer "Google Internet Authority G2" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 93A8078DC6 for ; Fri, 23 Mar 2018 01:54:51 +0000 (UTC) (envelope-from jroberson@jroberson.net) Received: by mail-pl0-x22c.google.com with SMTP id u11-v6so6550034plq.1 for ; Thu, 22 Mar 2018 18:54:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=jroberson-net.20150623.gappssmtp.com; s=20150623; h=date:from:to:cc:subject:in-reply-to:message-id:references :user-agent:mime-version; bh=MVU0zafikC46w4TBpJGlh8R5GnA9t0lQUm9f9KFpLlU=; b=L4Xd6JazxwhQXktjhRnFew4npiTIy9VtK7xhrcGbygneHEgDJOiQR1L3fQpO9afVXc woapbD54UfNVAA29hPFjGdkm5U5am/vhBiqrycukTKYdteOhC8keuOgKbHGwcDGDDoFW 8exYuzlF6vvtPekrE/+fPdVr5KCW+sWOOMkNIFreU4VRhSTZgOVEHcBd6BetTZQpfHrx aGbbwXayQBg+xUfC81LpsBprUpGQtt2CiQ4+iB23Utpy7+nCs+Id3ydLRRUQZ++BePTl 2XNa7PNv/0VpWumLutNNW3FbjZR2C+s3a+fHEN72I7m+gzoqRIdMOD1qvkaB54HNRFkr jqjw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:in-reply-to:message-id :references:user-agent:mime-version; bh=MVU0zafikC46w4TBpJGlh8R5GnA9t0lQUm9f9KFpLlU=; b=YCYhNNz6JyBPLKtqEy2U5lafAuzPWVhlYihv2AWMQgcZyMbGBgvVckRAzRKpMKa4lz 1bUAeGM+8H3vigP02eBzHevQksS9K7mntUSdtettf6Zd4/ExuT4CfcBHGfcCAeiOv5k/ 31TBTCLp2TLynBvr8Xsy/CcV6o4fbusAlpH66qjUNK6WB6hCrO6bl/dOgYReXY50Y6H+ PnNkHCMQUB4uwRJoF4KtjNw/xzHDmVO5CZUm4BiihdBKv7u8aw0OvE80FWvaeRtbnuef IReqfPPUx4acJDvgKGQyk+otLy++iiBudmUdj2KITEvo50wSKzVbxiV89kRFGlI4IMgX HSMw== X-Gm-Message-State: AElRT7HfzOgl44TNulKD3FS1dbAtiDVm8cHLaswlK8xmZnsHyV+YQt95 catyrOOZ2DJroCUYEYEiMC7/Rw== X-Google-Smtp-Source: AG47ELs4Q9rnFsYq/uhxzdgW2Y/BAOOSZKZznIQGo7lFntn6yFX9q3C0Duk7UK2AZq7bv+DXvGC67w== X-Received: by 2002:a17:902:28c4:: with SMTP id f62-v6mr6916138plb.19.1521770090551; Thu, 22 Mar 2018 18:54:50 -0700 (PDT) Received: from rrcs-66-91-135-210.west.biz.rr.com (rrcs-66-91-135-210.west.biz.rr.com. [66.91.135.210]) by smtp.gmail.com with ESMTPSA id n187sm4218926pfn.8.2018.03.22.18.54.48 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 22 Mar 2018 18:54:49 -0700 (PDT) Date: Thu, 22 Mar 2018 15:53:51 -1000 (HST) From: Jeff Roberson X-X-Sender: jroberson@desktop To: Cy Schubert 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: <201803230150.w2N1omDY036179@slippy.cwsent.com> Message-ID: References: <201803230150.w2N1omDY036179@slippy.cwsent.com> User-Agent: Alpine 2.21 (BSF 202 2017-01-01) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII; format=flowed 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 01:54:52 -0000 On Thu, 22 Mar 2018, Cy Schubert wrote: > In message , Jeff Roberson > writes: >> On Thu, 22 Mar 2018, Cy Schubert wrote: >> >>> It broke i386 too. >> >> I just did >> TARGET_ARCH=i386 make buildworld >> TARGET_ARCH=i386 make buildkernel >> >> This worked for me? >> >> Jeff > > hmmm. > > make TARGET=i386 TARGET_ARCH=i386 buildkernel Do you have changes to GENERIC? Thanks, Jeff > > --- vm_reserv.o --- > In file included from /opt/src/svn-current/sys/vm/vm_reserv.c:48: > In file included from /opt/src/svn-current/sys/sys/counter.h:37: > ./machine/counter.h:174:3: error: implicit declaration of function > 'critical_enter' is invalid in C99 [-Werror,-Wimplicit-function-declarat > ion] > critical_enter(); > ^ > ./machine/counter.h:174:3: error: this function declaration is not a > prototype [-Werror,-Wstrict-prototypes] > ./machine/counter.h:176:3: error: implicit declaration of function > 'critical_exit' is invalid in C99 [-Werror,-Wimplicit-function-declarati > on] > critical_exit(); > ^ > ./machine/counter.h:176:3: note: did you mean 'critical_enter'? > ./machine/counter.h:174:3: note: 'critical_enter' declared here > critical_enter(); > ^ > ./machine/counter.h:176:3: error: this function declaration is not a > prototype [-Werror,-Wstrict-prototypes] > critical_exit(); > ^ > In file included from /opt/src/svn-current/sys/vm/vm_reserv.c:57: > /opt/src/svn-current/sys/sys/systm.h:217:6: error: conflicting types > for 'critical_enter' > void critical_enter(void); > ^ > ./machine/counter.h:174:3: note: previous implicit declaration is here > critical_enter(); > ^ > In file included from /opt/src/svn-current/sys/vm/vm_reserv.c:57: > /opt/src/svn-current/sys/sys/systm.h:218:6: error: conflicting types > for 'critical_exit' > void critical_exit(void); > ^ > ./machine/counter.h:176:3: note: previous implicit declaration is here > critical_exit(); > ^ > 6 errors generated. > *** [vm_reserv.o] Error code 1 > > make[2]: stopped in /export/obj/opt/src/svn-current/i386.i386/sys/BREAK > --- modules-all --- > A failure has been detected in another branch of the parallel make > > make[3]: stopped in /opt/src/svn-current/sys/modules > *** [modules-all] Error code 2 > > make[2]: stopped in /export/obj/opt/src/svn-current/i386.i386/sys/BREAK > 2 errors > > make[2]: stopped in /export/obj/opt/src/svn-current/i386.i386/sys/BREAK > *** [buildkernel] Error code 2 > > make[1]: stopped in /opt/src/svn-current > 1 error > > make[1]: stopped in /opt/src/svn-current > *** [buildkernel] Error code 2 > > make: stopped in /opt/src/svn-current > 1 error > > make: stopped in /opt/src/svn-current > > ~cy > >> >>> >>> 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 i >> s >>>>>> 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 pagebi >> ts >>>> ); >>>>>> 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_pinde >> x_ >>>> 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 r >> eq >>>> , 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, v >> m_ >>>> 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(doma >> in >>>> )) { >>>>>> - m = vm_phys_alloc_pages(domain, >>>>>> - object != NULL ? >>>>>> - VM_FREEPOOL_DEFAULT : VM_FREEPOOL_DI >> RE >>>> 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. >>> >>> > > -- > Cheers, > Cy Schubert > FreeBSD UNIX: Web: http://www.FreeBSD.org > > The need of the many outweighs the greed of the few. > >