system: Add swap flags.
* gnu/system/file-systems.scm (swap-space)[priority, discard?]: Add them. * guix/build/syscalls.scm (SWAP_FLAG_PREFER, SWAP_FLAG_PRIO_MASK, SWAP_FLAG_PRIO_SHIFT, SWAP_FLAG_DISCARD): Add them. * gnu/build/file-systems.scm (swap-space->flags-bit-mask): Add it. * gnu/services/base.scm (swap-service-type): Use it. Signed-off-by: Ludovic Courtès <ludo@gnu.org>
This commit is contained in:
		
							parent
							
								
									f574dbd163
								
							
						
					
					
						commit
						0831dfab75
					
				
					 4 changed files with 60 additions and 5 deletions
				
			
		|  | @ -29,6 +29,8 @@ | ||||||
|   #:use-module (guix build bournish) |   #:use-module (guix build bournish) | ||||||
|   #:use-module ((guix build syscalls) |   #:use-module ((guix build syscalls) | ||||||
|                 #:hide (file-system-type)) |                 #:hide (file-system-type)) | ||||||
|  |   #:use-module (guix diagnostics) | ||||||
|  |   #:use-module (guix i18n) | ||||||
|   #:use-module (rnrs io ports) |   #:use-module (rnrs io ports) | ||||||
|   #:use-module (rnrs bytevectors) |   #:use-module (rnrs bytevectors) | ||||||
|   #:use-module (ice-9 match) |   #:use-module (ice-9 match) | ||||||
|  | @ -54,7 +56,9 @@ | ||||||
| 
 | 
 | ||||||
|             mount-flags->bit-mask |             mount-flags->bit-mask | ||||||
|             check-file-system |             check-file-system | ||||||
|             mount-file-system)) |             mount-file-system | ||||||
|  | 
 | ||||||
|  |             swap-space->flags-bit-mask)) | ||||||
| 
 | 
 | ||||||
| ;;; Commentary: | ;;; Commentary: | ||||||
| ;;; | ;;; | ||||||
|  | @ -227,6 +231,36 @@ if DEVICE does not contain an linux-swap file system." | ||||||
|   "Return the label of Linux-swap superblock SBLOCK as a string." |   "Return the label of Linux-swap superblock SBLOCK as a string." | ||||||
|   (null-terminated-latin1->string |   (null-terminated-latin1->string | ||||||
|    (sub-bytevector sblock (+ 1024 4 4 4 16) 16))) |    (sub-bytevector sblock (+ 1024 4 4 4 16) 16))) | ||||||
|  | 
 | ||||||
|  | (define (swap-space->flags-bit-mask swap) | ||||||
|  |   "Return the number suitable for the 'flags' argument of 'mount' | ||||||
|  | that corresponds to the swap-space SWAP." | ||||||
|  |   (define prio-flag | ||||||
|  |     (let ((p (swap-space-priority swap)) | ||||||
|  |           (max (ash SWAP_FLAG_PRIO_MASK (- SWAP_FLAG_PRIO_SHIFT)))) | ||||||
|  |       (if p | ||||||
|  |           (logior SWAP_FLAG_PREFER | ||||||
|  |                   (ash (cond | ||||||
|  |                         ((< p 0) | ||||||
|  |                          (begin (warning | ||||||
|  |                                  (G_ "Given swap priority ~a is | ||||||
|  | negative, defaulting to 0.~%") p) | ||||||
|  |                                 0)) | ||||||
|  |                         ((> p max) | ||||||
|  |                          (begin (warning | ||||||
|  |                                  (G_ "Limiting swap priority ~a to | ||||||
|  | ~a.~%") | ||||||
|  |                                  p max) | ||||||
|  |                                 max)) | ||||||
|  |                         (else p)) | ||||||
|  |                        SWAP_FLAG_PRIO_SHIFT)) | ||||||
|  |           0))) | ||||||
|  |   (define delayed-flag | ||||||
|  |     (if (swap-space-discard? swap) | ||||||
|  |         SWAP_FLAG_DISCARD | ||||||
|  |         0)) | ||||||
|  |   (logior prio-flag delayed-flag)) | ||||||
|  | 
 | ||||||
|  |  | ||||||
| 
 | 
 | ||||||
| ;;; | ;;; | ||||||
|  |  | ||||||
|  | @ -58,7 +58,8 @@ | ||||||
|   #:use-module (gnu packages linux) |   #:use-module (gnu packages linux) | ||||||
|   #:use-module (gnu packages terminals) |   #:use-module (gnu packages terminals) | ||||||
|   #:use-module ((gnu build file-systems) |   #:use-module ((gnu build file-systems) | ||||||
|                 #:select (mount-flags->bit-mask)) |                 #:select (mount-flags->bit-mask | ||||||
|  |                           swap-space->flags-bit-mask)) | ||||||
|   #:use-module (guix gexp) |   #:use-module (guix gexp) | ||||||
|   #:use-module (guix records) |   #:use-module (guix records) | ||||||
|   #:use-module (guix modules) |   #:use-module (guix modules) | ||||||
|  | @ -2223,7 +2224,9 @@ instance." | ||||||
|                    (let ((device #$device-lookup)) |                    (let ((device #$device-lookup)) | ||||||
|                      (and device |                      (and device | ||||||
|                           (begin |                           (begin | ||||||
|                             (restart-on-EINTR (swapon device)) |                             (restart-on-EINTR (swapon device | ||||||
|  |                                                       #$(swap-space->flags-bit-mask | ||||||
|  |                                                          swap))) | ||||||
|                             #t))))) |                             #t))))) | ||||||
|         (stop #~(lambda _ |         (stop #~(lambda _ | ||||||
|                   (let ((device #$device-lookup)) |                   (let ((device #$device-lookup)) | ||||||
|  |  | ||||||
|  | @ -102,7 +102,9 @@ | ||||||
|             swap-space |             swap-space | ||||||
|             swap-space? |             swap-space? | ||||||
|             swap-space-target |             swap-space-target | ||||||
|             swap-space-dependencies)) |             swap-space-dependencies | ||||||
|  |             swap-space-priority | ||||||
|  |             swap-space-discard?)) | ||||||
| 
 | 
 | ||||||
| ;;; Commentary: | ;;; Commentary: | ||||||
| ;;; | ;;; | ||||||
|  | @ -726,6 +728,10 @@ subvolume name is unknown.")) | ||||||
|   this-swap-space |   this-swap-space | ||||||
|   (target swap-space-target) |   (target swap-space-target) | ||||||
|   (dependencies swap-space-dependencies |   (dependencies swap-space-dependencies | ||||||
|                 (default '()))) |                 (default '())) | ||||||
|  |   (priority swap-space-priority | ||||||
|  |             (default #f)) | ||||||
|  |   (discard? swap-space-discard? | ||||||
|  |            (default #f))) | ||||||
| 
 | 
 | ||||||
| ;;; file-systems.scm ends here | ;;; file-systems.scm ends here | ||||||
|  |  | ||||||
|  | @ -71,6 +71,11 @@ | ||||||
|             mounts |             mounts | ||||||
|             mount-points |             mount-points | ||||||
| 
 | 
 | ||||||
|  |             SWAP_FLAG_PREFER | ||||||
|  |             SWAP_FLAG_PRIO_MASK | ||||||
|  |             SWAP_FLAG_PRIO_SHIFT | ||||||
|  |             SWAP_FLAG_DISCARD | ||||||
|  | 
 | ||||||
|             swapon |             swapon | ||||||
|             swapoff |             swapoff | ||||||
| 
 | 
 | ||||||
|  | @ -685,6 +690,13 @@ current process." | ||||||
|   "Return the mounts points for currently mounted file systems." |   "Return the mounts points for currently mounted file systems." | ||||||
|   (map mount-point (mounts))) |   (map mount-point (mounts))) | ||||||
| 
 | 
 | ||||||
|  | ;; Pulled from glibc's sysdeps/unix/sysv/linux/sys/swap.h | ||||||
|  | 
 | ||||||
|  | (define SWAP_FLAG_PREFER     #x8000) ;; Set if swap priority is specified. | ||||||
|  | (define SWAP_FLAG_PRIO_MASK  #x7fff) | ||||||
|  | (define SWAP_FLAG_PRIO_SHIFT 0) | ||||||
|  | (define SWAP_FLAG_DISCARD    #x10000) ;; Discard swap cluster after use. | ||||||
|  | 
 | ||||||
| (define swapon | (define swapon | ||||||
|   (let ((proc (syscall->procedure int "swapon" (list '* int)))) |   (let ((proc (syscall->procedure int "swapon" (list '* int)))) | ||||||
|     (lambda* (device #:optional (flags 0)) |     (lambda* (device #:optional (flags 0)) | ||||||
|  |  | ||||||
		Reference in a new issue