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
parent
f574dbd163
commit
0831dfab75
|
@ -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 New Issue