me
/
guix
Archived
1
0
Fork 0

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>
master
Josselin Poiret 2021-11-15 20:26:29 +00:00 committed by Ludovic Courtès
parent f574dbd163
commit 0831dfab75
No known key found for this signature in database
GPG Key ID: 090B11993D9AEBB5
4 changed files with 60 additions and 5 deletions

View File

@ -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))
;;; ;;;

View File

@ -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))

View File

@ -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

View File

@ -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))