> Date: Sat, 12 Mar 2022 11:35:09 +0100
> From: Martin Pieuchot <m...@openbsd.org>
> 
> Try to allocate the buffer before doing the encryption, if it fails we
> do not spend time doing the encryption.  This reduce the pressure when
> swapping with low memory.
> 
> ok?

Makes sense to me; ok kettenis@

> Index: uvm/uvm_swap.c
> ===================================================================
> RCS file: /cvs/src/sys/uvm/uvm_swap.c,v
> retrieving revision 1.153
> diff -u -p -r1.153 uvm_swap.c
> --- uvm/uvm_swap.c    22 Feb 2022 01:15:02 -0000      1.153
> +++ uvm/uvm_swap.c    12 Mar 2022 10:30:26 -0000
> @@ -1690,6 +1690,26 @@ uvm_swap_io(struct vm_page **pps, int st
>               }
>       }
>  
> +     /*
> +      * now allocate a buf for the i/o.
> +      * [make sure we don't put the pagedaemon to sleep...]
> +      */
> +     pflag = (async || curproc == uvm.pagedaemon_proc) ? PR_NOWAIT :
> +         PR_WAITOK;
> +     bp = pool_get(&bufpool, pflag | PR_ZERO);
> +
> +     /*
> +      * if we failed to get a swapbuf, return "try again"
> +      */
> +     if (bp == NULL) {
> +             if (bounce) {
> +                     uvm_pagermapout(bouncekva, npages);
> +                     uvm_swap_freepages(tpps, npages);
> +             }
> +             uvm_pagermapout(kva, npages);
> +             return (VM_PAGER_AGAIN);
> +     }
> +
>       /* encrypt to swap */
>       if (write && bounce) {
>               int i, opages;
> @@ -1729,35 +1749,6 @@ uvm_swap_io(struct vm_page **pps, int st
>                                     PGO_PDFREECLUST);
>  
>               kva = bouncekva;
> -     }
> -
> -     /*
> -      * now allocate a buf for the i/o.
> -      * [make sure we don't put the pagedaemon to sleep...]
> -      */
> -     pflag = (async || curproc == uvm.pagedaemon_proc) ? PR_NOWAIT :
> -         PR_WAITOK;
> -     bp = pool_get(&bufpool, pflag | PR_ZERO);
> -
> -     /*
> -      * if we failed to get a swapbuf, return "try again"
> -      */
> -     if (bp == NULL) {
> -             if (write && bounce) {
> -#ifdef UVM_SWAP_ENCRYPT
> -                     int i;
> -
> -                     /* swap encrypt needs cleanup */
> -                     if (encrypt)
> -                             for (i = 0; i < npages; i++)
> -                                     SWAP_KEY_PUT(sdp, SWD_KEY(sdp,
> -                                         startslot + i));
> -#endif
> -
> -                     uvm_pagermapout(kva, npages);
> -                     uvm_swap_freepages(tpps, npages);
> -             }
> -             return (VM_PAGER_AGAIN);
>       }
>  
>       /*
> 
> 

Reply via email to