small patch for pageout. Comments?
Larry McVoy
lm at mcvoy.com
Thu Nov 30 20:39:13 UTC 2017
Perhaps I misunderstood, I thought your patch was instead of the pageout
patch. Is that not the case?
On Thu, Nov 30, 2017 at 10:37:25PM +0200, Konstantin Belousov wrote:
> 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 *);
--
---
Larry McVoy lm at mcvoy.com http://www.mcvoy.com/lm
More information about the freebsd-arch
mailing list