From owner-freebsd-arch@freebsd.org Thu Nov 30 20:37:36 2017 Return-Path: Delivered-To: freebsd-arch@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id EB1EDDB97D2 for ; Thu, 30 Nov 2017 20:37:36 +0000 (UTC) (envelope-from kostikbel@gmail.com) Received: from kib.kiev.ua (kib.kiev.ua [IPv6:2001:470:d5e7:1::1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id F0A5F742FE for ; Thu, 30 Nov 2017 20:37:34 +0000 (UTC) (envelope-from kostikbel@gmail.com) Received: from tom.home (kib@localhost [127.0.0.1]) by kib.kiev.ua (8.15.2/8.15.2) with ESMTPS id vAUKbQuP062173 (version=TLSv1.2 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Thu, 30 Nov 2017 22:37:26 +0200 (EET) (envelope-from kostikbel@gmail.com) DKIM-Filter: OpenDKIM Filter v2.10.3 kib.kiev.ua vAUKbQuP062173 Received: (from kostik@localhost) by tom.home (8.15.2/8.15.2/Submit) id vAUKbPFY062172; Thu, 30 Nov 2017 22:37:25 +0200 (EET) (envelope-from kostikbel@gmail.com) X-Authentication-Warning: tom.home: kostik set sender to kostikbel@gmail.com using -f Date: Thu, 30 Nov 2017 22:37:25 +0200 From: Konstantin Belousov To: Larry McVoy Cc: Warner Losh , Scott Long , Kevin Bowling , Drew Gallatin , "freebsd-arch@freebsd.org" Subject: Re: small patch for pageout. Comments? Message-ID: <20171130203725.GG2272@kib.kiev.ua> References: <20171130173424.GA811@mcvoy.com> <20171130184923.GA30262@mcvoy.com> <20171130193213.GF2272@kib.kiev.ua> <20171130203047.GB30262@mcvoy.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20171130203047.GB30262@mcvoy.com> User-Agent: Mutt/1.9.1 (2017-09-22) X-Spam-Status: No, score=-2.0 required=5.0 tests=ALL_TRUSTED,BAYES_00, DKIM_ADSP_CUSTOM_MED,FREEMAIL_FROM,NML_ADSP_CUSTOM_MED autolearn=no autolearn_force=no version=3.4.1 X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on tom.home X-BeenThere: freebsd-arch@freebsd.org X-Mailman-Version: 2.1.25 Precedence: list List-Id: Discussion related to FreeBSD architecture List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 30 Nov 2017 20:37:37 -0000 On Thu, Nov 30, 2017 at 12:30:47PM -0800, Larry McVoy wrote: > I'll give this patch a try and compare to the pageout patch. What do you mean by 'compare to ...' ? BTW, below are some fixes which I found when re-read the changes. It messed up counters/timeouts. Better use this. diff --git a/sys/vm/vm_fault.c b/sys/vm/vm_fault.c index ece496407c2..48b3934ddd5 100644 --- a/sys/vm/vm_fault.c +++ b/sys/vm/vm_fault.c @@ -134,6 +134,16 @@ static void vm_fault_dontneed(const struct faultstate *fs, vm_offset_t vaddr, static void vm_fault_prefault(const struct faultstate *fs, vm_offset_t addra, int backward, int forward); +static int vm_pfault_oom_attempts = 3; +SYSCTL_INT(_vm, OID_AUTO, pfault_oom_attempts, CTLFLAG_RWTUN, + &vm_pfault_oom_attempts, 0, + ""); + +static int vm_pfault_oom_wait = 10; +SYSCTL_INT(_vm, OID_AUTO, pfault_oom_wait, CTLFLAG_RWTUN, + &vm_pfault_oom_wait, 0, + ""); + static inline void release_page(struct faultstate *fs) { @@ -531,7 +541,7 @@ vm_fault_hold(vm_map_t map, vm_offset_t vaddr, vm_prot_t fault_type, vm_pindex_t retry_pindex; vm_prot_t prot, retry_prot; int ahead, alloc_req, behind, cluster_offset, error, era, faultcount; - int locked, nera, result, rv; + int locked, nera, oom, result, rv; u_char behavior; boolean_t wired; /* Passed by reference. */ bool dead, hardfault, is_first_object_locked; @@ -543,6 +553,8 @@ vm_fault_hold(vm_map_t map, vm_offset_t vaddr, vm_prot_t fault_type, hardfault = false; RetryFault:; + oom = 0; +RetryFault_oom:; /* * Find the backing store object and offset into it to begin the @@ -787,7 +799,17 @@ RetryFault:; } if (fs.m == NULL) { unlock_and_deallocate(&fs); - VM_WAITPFAULT; + if (vm_pfault_oom_attempts < 0 || + oom < vm_pfault_oom_attempts) { + oom++; + vm_waitpfault(vm_pfault_oom_wait); + goto RetryFault_oom; + } + if (bootverbose) + printf( + "proc %d (%s) failed to alloc page on fault, starting OOM\n", + curproc->p_pid, curproc->p_comm); + vm_pageout_oom(VM_OOM_MEM); goto RetryFault; } } diff --git a/sys/vm/vm_page.c b/sys/vm/vm_page.c index 4711af9d16d..67c8ddd4b92 100644 --- a/sys/vm/vm_page.c +++ b/sys/vm/vm_page.c @@ -2724,7 +2724,7 @@ vm_page_alloc_fail(vm_object_t object, int req) * this balance without careful testing first. */ void -vm_waitpfault(void) +vm_waitpfault(int wp) { mtx_lock(&vm_page_queue_free_mtx); @@ -2734,7 +2734,7 @@ vm_waitpfault(void) } vm_pages_needed = true; msleep(&vm_cnt.v_free_count, &vm_page_queue_free_mtx, PDROP | PUSER, - "pfault", 0); + "pfault", wp * hz); } struct vm_pagequeue * diff --git a/sys/vm/vm_pageout.h b/sys/vm/vm_pageout.h index 2cdb1492fab..bf09d7142d0 100644 --- a/sys/vm/vm_pageout.h +++ b/sys/vm/vm_pageout.h @@ -96,11 +96,10 @@ extern bool vm_pages_needed; * Signal pageout-daemon and wait for it. */ -extern void pagedaemon_wakeup(void); +void pagedaemon_wakeup(void); #define VM_WAIT vm_wait() -#define VM_WAITPFAULT vm_waitpfault() -extern void vm_wait(void); -extern void vm_waitpfault(void); +void vm_wait(void); +void vm_waitpfault(int wp); #ifdef _KERNEL int vm_pageout_flush(vm_page_t *, int, int, int, int *, boolean_t *);